这是我遇到过的最奇怪的错误。除非我两次加载 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 它们是不同的。
我该如何调试它?
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/