如何在同一屏幕上绘制2d对象和3d对象

时间:2014-06-14 16:07:48

标签: c++ opengl user-interface

我正在尝试绘制一个按钮,以便稍后我可以点击它。但是我遇到了一些问题,即当我在Draw2d函数中取消注释所选部分时,屏幕变黑并且我的3d对象消失了。任何想法为什么以及如何解决这个问题?我想在评论部分添加按钮显示在不同的区域(左侧,顶部屏幕),如果我评论它就像它在这里,那么它显示在我的3D对象的中心,它没有它的边框。只有标签。

void Draw2D()
{
   glPushMatrix();
   glDisable(GL_DEPTH_TEST);
   //glMatrixMode(GL_PROJECTION);
   //glLoadIdentity();
   glOrtho(0, winw, winh, 0, -1, 1);
   //glMatrixMode(GL_MODELVIEW);
   //   glLoadIdentity();
   ButtonDraw(&MyButton);
   glPopMatrix();
   glEnable(GL_DEPTH_TEST);
}

这是我的源代码: Source.cpp

我还想问一下是否有人知道如何创建输入字段?一个简单的方法,因为我还在学习。

1 个答案:

答案 0 :(得分:0)

它不清楚你的绘制循环看起来如何,你在哪里设置矩阵,绘制3d东西和绘制2d的东西。但是从目前为止显示的代码中,我仍然可以解释它为什么会产生影响:每个矩阵类型有一个矩阵堆栈(模型视图,投影,纹理)。

您的代码所做的是将当前选定的矩阵推送到堆栈(可能是GL_MODELVIEW)。然后,你应用一个ortho矩阵。由于矩阵在这里不太可能是标识,因此ortho将没有您期望的结果,并且图像是错误的。此外,旧的投影矩阵仍然不变,这将进一步影响变换。然后,您可以恢复原始矩阵,渲染将保持不变。

如果取消注释代码,则先切换,然后切换,将正交矩阵设置为投影并设置模型视图的标识 - 但只恢复模型视图矩阵,投影矩阵仍将具有正交集。

你真正需要做的是:

glMatrixMode(GL_PROJECTION);
glPushMatrix(); // save current projection matrix 
glLoadIdentity();
glOrtho(0, winw, winh, 0, -1, 1);
glMatrixMode(GL_MODELVIEW);
glPushMatrix(); // save current modelview matrix
glLoadIdentity();
// ... draw
glMatrixMode(GL_PROJECTION);
glPopMatrix(); // restore PUSHed projection matrix
glMatrixMode(GL_MODELVIEW);
glPopMatrix(); // restore PUSHed modelview matrix

这假设在调用此函数时,glMatrixMode(GL_MODELVIEW)已设置,并将其还原为此值。这也可以优化

// assume `GL_MODELVIEW` is the current matrix mode
glPushMatrix(); // save current modelview matrix
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glPushMatrix(); // save current projection matrix
glLoadIdentity();
glOrtho(0, winw, winh, 0, -1, 1);
// ... draw
glPopMatrix(); // restore PUSHed projection matrix
glMatrixMode(GL_MODELVIEW);
glPopMatrix(); // restore PUSHed modelview matrix
// now `GL_MODELVIEW` is selected again

这稍微减少了调用开销,但不如初始变体那么清晰。