2011-07-22 35 views
1

這是我正在使用的一個粒子系統。我想從粒子中創建一個多維數據集,但它現在似乎正在陷入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

嘗試評論的東西,直到它停止,如果gbd不會給你一個堆棧它可能是靜態初始化。 –

+0

多一點信息會很有用。例如,你如何使用「粒子」類? segv發生之前你做的最後一件事是什麼? – Praetorian

+8

第一步當你segfault:看回溯.. – MahlerFive

回答

5

您的紋理ID是錯誤的數據類型。他們應該是GLint,但您使用GLfloat


另一個問題是,似乎所有的數據在全局變量中舉行,但你初始化它爲particles類的每個實例。所以你會泄漏紋理,並可能有其他意想不到的行爲。


另一個潛在的問題是,如果你有一個綁定一個VBO,在gluBuild2DMipmaps數據指針將被解釋爲一個偏移量。這也可能會造成麻煩。


除了這一切,你應該從mallocfopenfread檢查返回值。現在你忽略了錯誤,這可能導致分段錯誤。

+0

試過GLint它不能修復它雖然在gdb中的回溯似乎一次又一次地讓我回到紋理 GLfloat過去很好工作 –

+1

@strategos:我沒有真正期望這能解決你的段錯誤,但它是您的代碼可能會導致其他問題(如使用錯誤的紋理)的問題。 'GLfloat'可以保存小整數,但更大的整數可以舍入到可用的精度。因此,添加更多紋理或使用不同的視頻卡時可能會遇到麻煩。 –

+0

我回去使用了我的程序以前的工作版本,並且似乎使用不同的紋理創建方法工作,所以您是對的,感謝您的幫助 –