【问题标题】:Rendering surfaces in OpenGL with depth test correctly在 OpenGL 中正确渲染表面并进行深度测试
【发布时间】:2019-04-30 23:17:57
【问题描述】:

我想知道如何正确使用深度测试来渲染表面。就我而言,尽管已启用,但它不起作用。我尝试了很多组合,但无法弄清楚做错了什么,可能是 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);

}

无论z我分配给两个面的值如何,最终结果总是相同的,结果可以看到here

非常感谢任何建议。

【问题讨论】:

    标签: c++ opengl depth-buffer


    【解决方案1】:

    在设置要在其上绘制的 SDL 表面时,您是否在调用 SDL_CreateWindow 之前要求提供深度缓冲区?

    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    

    【讨论】:

    • 感谢您的回复。我按照您的建议添加了 SDL 属性,但仍然得到相同的结果。
    • 我发现了错误。相机中 z 的比例值为零。我只是用 1 替换了它,它起作用了:glm::vec3 scalev(scale,scale,1.0f);
    猜你喜欢
    • 1970-01-01
    • 2012-11-28
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多