c++ - 在 OpenGL 中正确渲染表面并进行深度测试
问题描述
我想知道如何正确使用深度测试来渲染表面。就我而言,尽管已启用,但它不起作用。我尝试了很多组合,但无法弄清楚做错了什么,这可能是 OpenGL 命令的一些顺序,或者可能是我完全遗漏的东西。
我有这段代码,它使用 opengl 来渲染我正在开发的 2d 游戏。我想启用 z 缓冲和深度测试以简化代码中的内容。我在线阅读了许多教程并按照说明进行了更改,但无法弄清楚为什么它不起作用。
主函数的代码如下所示,我将两个方格的 z 值更改为 -10 和 -25 并稍后交换它们,但无论什么值,我总是将第一个方格渲染在第二个方格上我用:
void MainGame::RenderTestUI()
{
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
glDepthFunc(GL_LESS);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
GLSLProgram *ActiveShader = nullptr;
ActiveShader = &ColorShader;
ActiveShader->Use();
GLint Location1 = ActiveShader->GetUniformLocation("cam");
glm::mat4 tmp = Camera.GetCameraMatrix();
glUniformMatrix4fv(Location1, 1, GL_FALSE, &tmp[0][0]);
glActiveTexture(GL_TEXTURE0);
GLint Location2 = ActiveShader->GetUniformLocation("basic");
glUniform1f(Location2, 0);
glBindTexture(GL_TEXTURE_2D, GameTextures.ID);
CurrentBoundTexture = GameTextures.ID;
RenderingBatch.StartAddingVerticies();
this->GameMap.TileList[1].FillSixVerticies(RenderingBatch.VertexListPtr, 0, 0);
RenderingBatch.VertexCount += 6;
for (int i = 0; i < 6; i++)
RenderingBatch.VertexListPtr[i].z = -10; // first face
this->GameMap.TileList[2].FillSixVerticies(&RenderingBatch.VertexListPtr[RenderingBatch.VertexCount], 8, 8);
RenderingBatch.VertexCount += 6;
for (int i = 0; i < 6; i++)
RenderingBatch.VertexListPtr[i+6].z = -25; // second face
RenderingBatch.EndAddingVerticies();
RenderingBatch.CreateVBO();
RenderingBatch.Render();
ActiveShader->Unuse();
// swap buffers
SDL_GL_SwapWindow(GameWindow);
}
无论 zi am 分配给两个面的值如何,最终结果总是相同的,结果可以在这里看到:
任何建议都将受到高度赞赏。
解决方案
在设置要绘制的 SDL 表面时,您是否在调用 SDL_CreateWindow 之前要求提供深度缓冲区?
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
推荐阅读
- react-native - 禁用在堆栈导航器中加载 initialRoute 时
- react-native - React Native undefined 不是对象(评估'response Json.results[0].formatted_address')
- java - Eclipse 中的 Java 编辑器就像一个纯文本编辑器
- typescript - Typescript: 'string' can't be used to index type on complex object
- ios - 有没有办法将 UI 元素移动到特定点,而不是使用 CGAffine(translate: ) 将它们移动特定数量?
- php - Laravel 分页资源不会添加元
- docker - 如何更新或替换 docker layer force
- javascript - 递归调用java script animate函数,每次循环后时间处理
- deep-linking - Google Home App中帐户链接的最佳用户体验是什么
- coq - Coq 证明 p
=q