这是我正在使用的粒子系统。我想用粒子制作一个立方体,但它现在看来虽然以前有效但却出现了seg故障。我猜这是阵列,但我不能在2天后找出问题所在。 GDB一直没有帮助。
#include "particles.h"
using namespace std;
GLfloat texture1[10];
particle parts[50][50][50];
GLfloat angle = 1.0;
particles::particles()
{
addTextures();
cube();
}
particles::particles(int O)
{
addTextures();
cube();
}
void particles::addTextures()
{
texture1[0] = LoadTextureRAW("star_mask.bmp",256,256); //load texture
texture1[1] = LoadTextureRAW("star.bmp",256,256);
}
void particles::cube()
{
// for(int i =0; i<124999; i++)
// {
// parts[i] = particle(1,1,1,1,1,1,1);
// }
float x=-5;
float y=-5;
float z=-5;
for(int i =0 ; i <49 ;i++)
{
for(int k =0 ; k <49 ;k++)
{
for(int j =0 ; j <49 ;j++)
{
parts[i][k][j] = particle(i*0.01,k*0.01,j*0.01,1,1,1,0.09);
}
}
}
}
GLuint particles::LoadTextureRAW( const char * filename, int width,
int height )
{
GLuint texture;
unsigned char * data;
FILE * file;
file = fopen( filename, "rb" );
if ( file == NULL ) return 0;
data = (unsigned char *)malloc( width * height * 3 );
fread( data, width * height * 3, 1, file );
fclose( file );
glGenTextures(1, &texture );
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_REPEAT);
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR_MIPMAP_NEAREST );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
GL_LINEAR );
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width, height, GL_RGB,
GL_UNSIGNED_BYTE, data);
free( data );
return texture;
}
void particles::FreeTexture( GLuint texture )
{
glDeleteTextures( 1, &texture );
}
GLuint particles::LoadTextureRAW( const char * filename, int width,
int height);
void particles::FreeTexture( GLuint texturez );
void particles::square (void)
{
glBindTexture( GL_TEXTURE_2D, texture1[0] );
glBegin (GL_QUADS);
glTexCoord2d(0.0,0.0);
glVertex2d(-1.0,-1.0);
glTexCoord2d(1.0,0.0);
glVertex2d(1.0,-1.0);
glTexCoord2d(1.0,1.0);
glVertex2d(1.0,1.0);
glTexCoord2d(0.0,1.0);
glVertex2d(-1.0,1.0);
glEnd();
}
答案 0 :(得分:5)
您的纹理ID是错误的数据类型。它们应为GLint
,但您使用的是GLfloat
。
另一个问题是,您的所有数据似乎都保存在全局变量中,但您要为particles
类的每个实例初始化它。因此,您将泄漏纹理,并可能还有其他意外行为。
另一个潜在的问题是,如果你有一个VBO绑定,gluBuild2DMipmaps
中的数据指针将被解释为偏移量。这也可能会带来麻烦。
除此之外,您应该检查malloc
,fopen
和fread
的返回值。现在你忽略了错误,这可能导致分段错误。