Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 必须加载视图矩阵两次。Don';我不知道为什么_C_Opengl - Fatal编程技术网

C 必须加载视图矩阵两次。Don';我不知道为什么

C 必须加载视图矩阵两次。Don';我不知道为什么,c,opengl,C,Opengl,这是我遇到的最奇怪的错误。除非加载视图矩阵两次,否则不会绘制三角形。发生了什么事 如果我移除其中一个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); glVertex3

这是我遇到的最奇怪的错误。除非加载视图矩阵两次,否则不会绘制三角形。发生了什么事

如果我移除其中一个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它们是不同的。

我如何调试这个?


EDIT3我在调用glfwGetTime()时没有包含该文件。这就是打破它的原因:从第二个示例中,如果您将“float viewmatrix…”替换为“char tmpbuffer[16*sizeof(float);”,然后(假设没有做任何操作)添加“memset(tmpbuffer,0,sizeof(tmpbuffer));”


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

如果在第二个示例中,你将“float viewmatrix…”替换为“char tmpbuffer[16*sizeof(float);”然后(假设没有做任何事情)添加了“memset(tmpbuffer,0,sizeof(tmpbuffer));”


听起来好像有什么东西损坏了堆栈,第一个viewmatrix定义“修复了”这是第二个问题。我的建议应该验证这一点。

尝试内存中断点来调试它!camera->t.m指向的东西肯定至少有15个浮动吗?是的,它有16个浮动。4x4 matrixtry内存中断点来调试它!camera->t.m指向的东西肯定至少有15个浮动吗?是的ep its 16浮点。4x4 matrixIt是由于调用glfw函数而未导入调用该函数的文件中的头文件而导致的。导致某些内存损坏它是由于调用glfw函数而未导入调用该函数的文件中的头文件而导致的。导致某些内存损坏