gpt4 book ai didi

c++ - HUD 已绘制,但 OpenGL 3D 场景消失

转载 作者:行者123 更新时间:2023-11-28 00:29:21 26 4
gpt4 key购买 nike

我已经学习了很多教程,但仍然没有掌握如何在 3D 场景中绘制 2D HUD 而不会发生某种灾难的窍门。我从 here 中收集了一些示例代码和 here并计算出必须以某种方式处理矩阵的顺序(请参阅 here )以实现我所设定的目标。我已经制定了如下所示的渲染代码:

void render()
{
//Clear screen
glClearColor(0.2f, 0.0f, 0.2f, 1.0f); // Clear the background of our window to red
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW); //Switch to the drawing perspective
glLoadIdentity(); //Reset the drawing perspective

// Movement as response to input:
glTranslatef( cam.getEye().getX(), cam.getEye().getY(), cam.getEye().getZ() ); // Translate our object along the y axis
glRotatef( cam.getTheta(), 0.0f, 1.0f, 0.0f ); // Rotate our object around the y axis
// No pushing/popping a matrix and no gluLookAt() used here.

// ==================== Drawing scene here: ======================
// ...
// =================================== HUD: ==================================

glMatrixMode(GL_PROJECTION);

glPushMatrix();
//glPopMatrix();

glLoadIdentity();
gluOrtho2D(0, winW, 0, winH); //left,right,bottom,top
glMatrixMode(GL_MODELVIEW);

//glPushMatrix();
glPopMatrix();
glLoadIdentity();

// drawing the HUD rect here:
glBegin(GL_QUADS);
// ...
glEnd();

glPopMatrix();
glPopMatrix();
//glPushMatrix();
//glPushMatrix();

// ===============================================================================
glutSwapBuffers(); //Send scene to the screen to be shown
}

...但出于某种原因,它只显示我的深青色 HUD,而 3D 场景就这样消失了。我究竟做错了什么?我错过了什么?我知道我应该推送投影矩阵,然后是模型 View 矩阵,然后执行 glOrtho2D(),然后将这两个矩阵从堆栈中弹出。那没有用。我厌倦了以随机顺序摆弄矩阵的插入和弹出。

最佳答案

如果您的 HUD 像往常一样是叠加层,您可能希望在绘制 HUD 内容之前禁用深度测试和潜在的深度写入:

glDisable(GL_DEPTH_TEST);
glDepthMask(GL_FALSE);

这样 HUD 的 Z 值就无关紧要了。不要忘记在绘制场景之前重新启用。

正如其他人所观察到的,您也有矩阵堆栈问题。单独的堆栈与投影和模型 View 矩阵相关联。现在你正在插入投影矩阵和弹出模型 View 矩阵,所以你溢出了一个并下溢了另一个。您需要以相同的模式对称地推送和弹出。鉴于您在每种模式下都从 glLoadIdentity() 开始,您可能根本不需要使用矩阵堆栈。

编辑:更直接的答案

渲染代码可能如下所示:

void render()
{
//Clear screen
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

//*************************************************************************
//* Prepare to render main scene:
//*************************************************************************
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(...);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef( cam.getEye().getX(), cam.getEye().getY(), cam.getEye().getZ() );
glRotatef( cam.getTheta(), 0.0f, 1.0f, 0.0f );

//*************************************************************************
//* Draw Main Scene Here:
//*************************************************************************

// ...


//*************************************************************************
//* Prepare to render HUD overlay:
//*************************************************************************
glDisable(GL_DEPTH_TEST);
glDepthMask(GL_FALSE);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(...);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

//*************************************************************************
//* Draw HUD here:
//*************************************************************************

// ...


// Finish the frame:
glutSwapBuffers(); //Send scene to the screen to be shown
}

现在,由于您将在每次渲染调用期间调整投影矩阵两次,因此您应该从 resizeWindow() 函数中删除 gluPerspective()。另外,我从渲染函数中删除了 glClearColor() 调用——最好在程序开始时设置一次然后忘记它。状态更改代价高昂,因此您希望尽可能避免它们。

关于c++ - HUD 已绘制,但 OpenGL 3D 场景消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23506751/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com