c - 必须加载 View 矩阵两次。不知道为什么

标签 c opengl

这是我遇到过的最奇怪的错误。除非我两次加载 View 矩阵,否则不会绘制我的三角形。这是怎么回事?

如果我删除其中一个 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

最佳答案

如果您在第二个示例中替换了“float viewmatrix...;”使用“char tmpbuffer[16 * sizeof(float);”然后(假设什么也没做)添加“memset(tmpbuffer, 0, sizeof(tmpbuffer));”?

听起来好像有什么东西正在破坏你的堆栈,第一个 viewmatrix 定义为第二个定义“修复”了它。我的建议应该是验证问题是否与此一致。

关于c - 必须加载 View 矩阵两次。不知道为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4471213/

相关文章:

c - 当源路径中有空格时,VS Code 调试失败

c++ - 将 m 字节的数组拆分为 n 字节的 block

c++ - 我的着色器停止工作

使用 GL_LINE_STRIP 的 OpenGL 正交草图绘制

c++ - OpenGL - 对象转换和 VBO

c - 如何将具体的二维数组连接到先前定义的指向头文件中指针的指针?

C - 逐行读取文件

c++ - 时钟获取时间 : identifier not found in Visual Studio in Windows 10

c++ - 垂直翻转Char数组: is there a more efficient way?

c++ - OpenGL/Glut 无法在其上绘制 [