分段错误让我疯狂

时间:2011-07-22 17:32:07

标签: c++ opengl segmentation-fault

这是我正在使用的粒子系统。我想用粒子制作一个立方体,但它现在看来虽然以前有效但却出现了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();
}

1 个答案:

答案 0 :(得分:5)

您的纹理ID是错误的数据类型。它们应为GLint,但您使用的是GLfloat


另一个问题是,您的所有数据似乎都保存在全局变量中,但您要为particles类的每个实例初始化它。因此,您将泄漏纹理,并可能还有其他意外行为。


另一个潜在的问题是,如果你有一个VBO绑定,gluBuild2DMipmaps中的数据指针将被解释为偏移量。这也可能会带来麻烦。


除此之外,您应该检查mallocfopenfread的返回值。现在你忽略了错误,这可能导致分段错误。