C++ 使用深度测试在OpenGL中正确绘制曲面

C++ 使用深度测试在OpenGL中正确绘制曲面,c++,opengl,depth-buffer,C++,Opengl,Depth Buffer,我想知道如何正确地使用深度测试渲染曲面。在我的情况下,虽然它已启用,但它不工作。我尝试了许多组合,但无法找出哪里做错了,这可能是OpenGL命令的一些顺序,也可能是我完全缺少的东西 我有这段代码,它使用opengl渲染我正在处理的2d游戏。我想启用z缓冲和深度测试来简化代码中的事情。我在网上阅读了许多教程,并按照说明进行了更改,但我不明白为什么它不起作用 主函数的代码如下所示,我正在将两个正方形的z值更改为-10和-25,并在稍后进行交换,但无论使用什么值,我总是在第二个正方形上渲染第一个正方形

我想知道如何正确地使用深度测试渲染曲面。在我的情况下,虽然它已启用,但它不工作。我尝试了许多组合,但无法找出哪里做错了,这可能是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);

}

void MainGame::renderestui()
{
glEnable(GLU深度试验);
glDepthMask(GL_TRUE);
glDepthFunc(GL_LESS);
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
GLSLProgram*ActiveShader=nullptr;
ActiveShader=&ColorShader;
ActiveShader->Use();
闪烁位置1=ActiveShader->GetUniformLocation(“cam”);
glm::mat4 tmp=Camera.GetCameraMatrix();
glUniformMatrix4fv(位置1、1、GL_FALSE和tmp[0][0]);
玻璃纹理(GL_纹理0);
闪烁位置2=ActiveShader->GetUniformLocation(“基本”);
glUniform1f(位置2,0);
glBindTexture(GL_TEXTURE_2D,GameTextures.ID);
CurrentBoundTexture=GameTextures.ID;
RenderingBatch.startaddingvertices();
这->GameMap.TileList[1].FillSixtVerticies(RenderingBatch.VertexListPtr,0,0);
RenderingBatch.VertexCount+=6;
对于(int i=0;i<6;i++)
RenderingBatch.VertexListPtr[i].z=-10;//第一个面
这->GameMap.TileList[2].FillSixtVertices(&RenderingBatch.VertexListPtr[RenderingBatch.VertexCount],8,8);
RenderingBatch.VertexCount+=6;
对于(int i=0;i<6;i++)
RenderingBatch.VertexListPtr[i+6].z=-25;//第二个面
RenderingBatch.EndAddingVertices();
RenderingBatch.CreateVBO();
RenderingBatch.Render();
ActiveShader->Unuse();
//交换缓冲区
SDL_GL_SwapWindow(游戏窗口);
}
不管我给两个面指定的z值是多少,最终结果总是相同的,可以看到结果:


非常感谢您的建议。

在设置要绘制的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);