Приходится загружать матрицу просмотра дважды. Не знаю почему - PullRequest
2 голосов
/ 17 декабря 2010

Это самая странная ошибка, с которой я когда-либо сталкивался.Мой треугольник не будет нарисован, если я дважды не загружу матрицу вида.Что происходит?

Если я удаляю одну из 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);
}

РЕДАКТИРОВАТЬ: я уменьшил ошибку до следующего

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();
    }

Если я удалю определение и инициализацию 'float viewmatrix«ничто не привлекает к экрану.Если я восстановлю его, он будет отображаться как обычно.Это какое-то повреждение памяти или что-то?

EDIT2 они разные.

Как я могу отладить это?alt text

EDIT3 Я вызывал glfwGetTime () без включения файла.Вот что его сломало: O

1 Ответ

0 голосов
/ 12 июня 2011

Что, если из вашего второго примера вы заменили "float viewmatrix ...;" с "char tmpbuffer [16 * sizeof (float);" а затем (при условии, что ничего не сделал) добавил "memset (tmpbuffer, 0, sizeof (tmpbuffer))"; "?

Звучит так, как будто что-то портит ваш стек, и что первое определение viewmatrix «исправляет» его для второго. То, что я предлагаю, должно подтвердить, что проблема в этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...