2010-12-17 8 views
2

これは私が今までに遭遇した最も奇妙なバグです。ビューマトリックスを2回ロードしない限り、私の三角形は描画されません。何が起こっている?ビュー・マトリックスを2回ロードする必要があります。なぜわからないのですか

gfxSetCamera(& camera-> t)のいずれかを削除した場合。何も描かれていない。

void shipDraw() { 
glPushMatrix(); 

glMultMatrixf(ship->t.m); 

glBegin(GL_TRIANGLES); 
glColor3f(0,0,1); 
glVertex3f(0, 0, -1); 
glVertex3f(0, 1, 1); 
glVertex3f(0, -1, 1); 
glEnd(); 

glPopMatrix(); 
} 

//Draw loop 
while(!gfxUserQuit()) { 
    entUpdateAll(); 

    gfxPrepare(1,1); 

    gfxSetCamera(&camera->t); //Have to call this twice!?!? 
    gfxSetCamera(&camera->t); 

    entDrawAll(); 
    gfxPresent(); 
} 

//Graphics code 
void gfxPrepare(int clearColor, int clearStencil) { 
//TODO parse args 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glLoadIdentity(); 
} 

void gfxPresent() { 
glfwSwapBuffers(); 
} 

void gfxSetCamera(transform *t) { 
float *m = t->m; 

float viewmatrix[16]={ 
    m[0], m[4], m[8], 0, 
    m[1], m[5], m[9], 0, 
    m[2], m[6], m[10], 0, 

    -(m[0]*m[12] + 
    m[1]*m[13] + 
    m[2]*m[14]), 

    -(m[4]*m[12] + 
    m[5]*m[13] + 
    m[6]*m[14]), 

    -(m[8]*m[12] + 
    m[9]*m[13] + 
    m[10]*m[14]), 1}; 
glLoadMatrixf(viewmatrix); 
} 

編集:私は「フロートにviewMatrix」の定義と初期化を削除した場合、私は、次の

while(!gfxUserQuit()) {  
     entUpdateAll(); 

     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 


     float *m = camera->t.m; 
     float viewmatrix[16]={ 
      m[0], m[4], m[8], 0, 
      m[1], m[5], m[9], 0, 
      m[2], m[6], m[10], 0, 

      -(m[0]*m[12] + 
      m[1]*m[13] + 
      m[2]*m[14]), 

      -(m[4]*m[12] + 
      m[5]*m[13] + 
      m[6]*m[14]), 

      -(m[8]*m[12] + 
      m[9]*m[13] + 
      m[10]*m[14]), 1}; 

     float viewmatrix2[16]={ 
      m[0], m[4], m[8], 0, 
      m[1], m[5], m[9], 0, 
      m[2], m[6], m[10], 0, 

      -(m[0]*m[12] + 
      m[1]*m[13] + 
      m[2]*m[14]), 

      -(m[4]*m[12] + 
      m[5]*m[13] + 
      m[6]*m[14]), 

      -(m[8]*m[12] + 
      m[9]*m[13] + 
      m[10]*m[14]), 1}; 

     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 
     glLoadMatrixf(viewmatrix2); 

     entDrawAll(); 
     glfwSwapBuffers(); 
    } 

まで誤差が減少しているものは、画面に描画されません。私はそれを復元する場合、通常のようにレンダリングします。これはメモリの破損か何かか?

EDIT2これらは異なっています。

これをどのようにデバッグできますか? alt text

EDIT3私は、ファイルを含めずにglfwGetTime()を呼び出していました。これはそれを壊していたものです:O

+0

これをデバッグするためにメモリブレークポイントを試してください! – ltjax

+0

カメラ - > t.mが間違いなく少なくとも15個の浮動小数点を指しているのですか? – Tommy

+0

うん、その16の浮き。 4x4の行列 –

答えて

0

2番目の例では、 "float viewmatrix ...; "char tmpbuffer [16 * sizeof(float);" (何もしなかったと仮定して) "memset(tmpbuffer、0、sizeof(tmpbuffer));"を追加しました。

スタックが壊れていて、最初のビューマトリックス定義が2番目のビューマトリックス定義に「修正」しているように思えます。私が示唆していることは、問題がこの行に沿っているかどうかを検証する必要があります。

+0

これは、それを呼び出すファイル内のヘッダーファイルをインポートせずにglfw関数を呼び出すことによって発生しました。メモリ破損につながる –

関連する問題