2010-12-17 4 views
2

이것은 내가 이제까지 만난 이상한 버그 다. 뷰 매트릭스를 두 번로드하지 않으면 내 삼각형이 그려지지 않습니다. 무슨 일 이니?뷰 매트릭스를 두 번로드해야합니다. Do not know why

gfxSetCamera (& 카메라 -> 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

두 번째 예에서 "float viewmatrix ...;를 대체하면 어떻게됩니까? "char tmpbuffer [16 * sizeof (float);" 그리고 나서 (아무것도하지 않는다고 가정하면) "memset (tmpbuffer, 0, sizeof (tmpbuffer));"를 추가 했습니까?

스택이 손상되어 첫 번째 viewmatrix 정의가 두 번째 것에 대해 "수정"하는 것처럼 들립니다. 내가 제안하는 바는이 문제가이 선상에 있는지 확인해야한다.

+0

헤더 파일을 호출 한 파일에서 헤더 파일을 가져 오지 않고 glfw 함수를 호출하여 발생했습니다. 약간의 메모리 손상으로 이어진다. –

관련 문제