如何在同一屏幕上绘制 2d 对象和 3d 对象
Posted
技术标签:
【中文标题】如何在同一屏幕上绘制 2d 对象和 3d 对象【英文标题】:How to draw 2d object and 3d object on the same screen 【发布时间】:2014-06-14 16:07:48 【问题描述】:我正在尝试绘制一个按钮,以便稍后我可以单击它。但是我遇到了一些问题,即当我在 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】:目前尚不清楚您的绘制循环的外观,以及您在其中设置矩阵、绘制 3d 内容和绘制 2d 内容的位置。但是从目前显示的代码中,我仍然可以解释为什么它可能会产生影响:每个矩阵类型(模型视图、投影、纹理)都有一个矩阵堆栈。
您的代码所做的是将当前选定的矩阵推入堆栈(可能是GL_MODELVIEW
)。然后,您对其应用正交矩阵。由于这里的矩阵不太可能是恒等的,因此正交不会有您期望的结果,并且图像是错误的。此外,旧的投影矩阵仍然没有改变,这将进一步影响变换。然后,您恢复原始矩阵并继续进行渲染。
如果取消注释代码,则先切换,然后切换,将正交矩阵设置为投影并为模型视图设置标识 - 但只有模型视图矩阵要恢复,投影矩阵仍然具有正交集。
你真正需要做的是:
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
这假设在调用 this 时,glMatrixMode(GL_MODELVIEW)
已设置,并将其恢复为 this。这也可以优化为
// 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
调用开销略小,但不如初始变体清晰。
【讨论】:
以上是关于如何在同一屏幕上绘制 2d 对象和 3d 对象的主要内容,如果未能解决你的问题,请参考以下文章