【问题标题】:Depth Buffer Not Working With Multiple Shader Programs深度缓冲区不适用于多个着色器程序
【发布时间】:2019-04-13 22:46:30
【问题描述】:

我正在使用用于手持系统的 OpenGL-ES 用 C++ 编写 3D 图形渲染器,并且我正在使用贴花(纹理)着色器以及颜色填充着色器。我有两个渲染通道,我使用各自的程序并使用数组/元素缓冲区使用 glDrawElements 绘制数据。

虽然我在我的应用程序中启用了 GL_DEPTH_TEST,但我的贴花多边形总是呈现在我的彩色填充多边形前面。

我尝试重新设计我的投影/模型视图矩阵的构建方式并将其传递给着色器,我尝试了不同的 glDepthFunc 参数,但我无法让它们正确渲染。

这是我的绘制代码 - 我用

开始每一帧
glClearColor(0.25f, 0.25f, 0.25f, 1.f);
glClearDepthf(1.f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

然后我计算世界空间多边形坐标并将其排列成 GLfloat 向量。我先画贴花数据:

GLuint programId = decalProgramId;
glUseProgram(programId);

// All of my uniform params are setup here - omitting to save space

// Set proj/mv matrices
glUniformMatrix4fv(glGetUniformLocation(programId, "uProjection"), 1, GL_TRUE, static_cast<f32*>(gameEngine.proj));
glUniformMatrix4fv(glGetUniformLocation(programId, "uModelView"), 1, GL_TRUE, static_cast<f32*>(gameEngine.modelView));

// Then I prepare the buffer data
glBindBuffer(GL_ARRAY_BUFFER, decalBufferId);
glBufferData(GL_ARRAY_BUFFER, coordSize + texCoordSize, 0, GL_STATIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, coordSize, &coords[0]);
glBufferSubData(GL_ARRAY_BUFFER, coordSize, texCoordSize, &texCoords[0]);

// And element array buffer data
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, decalElementBufferId);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexSize, &indices[0], GL_STATIC_DRAW);

// Enable our vertex attributes
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)(coordSize));

// Bind my test texture
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

// Draw the elements
glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_SHORT, 0);

然后用我的彩色多边形重复该过程。随后是 SwapBuffer 和 WaitVSync 命令。

这是我创建三角形之一和立方体正面的代码:

// Add polygon directly to the scene object
scene.AddPolygon(polygonBuilder
    .AddVertex(Vector3(0.5f, 0.5f, 0.f), Vector4(0.f, 0.f, 1.f, 1.f))
    .AddVertex(Vector3(0.25f, 0.f, 0.f), Vector4(0.f, 1.f, 0.f, 1.f))
    .AddVertex(Vector3(0.75f, 0.f, 0.f), Vector4(1.f, 0.f, 0.f, 1.f))
    .AddIndex(0).AddIndex(1).AddIndex(2)
    .Build()
);

// Create a polygon within the crate object
crateObject.AddPolygon(polygonBuilder
    .AddVertex(Vector3(-0.25f, 0.25f, 0.f), Vector2(0.f, 0.f))
    .AddVertex(Vector3(-0.25f, -0.25f, 0.f), Vector2(0.f, 1.f))
    .AddVertex(Vector3(0.25f, -0.25f, 0.f), Vector2(1.f, 1.f))
    .AddVertex(Vector3(0.25f, 0.25f, 0.f), Vector2(1.f, 0.f))
    .SetTexture("crate")
    .AddIndex(0).AddIndex(1).AddIndex(3)
    .AddIndex(3).AddIndex(1).AddIndex(2)
    .Build()
);

// Add the crate object as a child within the scene
scene.AddChild(crate);

此屏幕截图是我创建两个彩色三角形和一个纹理立方体时的当前输出:

蓝色箭头表示应该在前面渲染的三角形。有什么想法吗?

【问题讨论】:

  • 也许你的立方体深度值低于你的三角形值。你检查你的 z 坐标了吗?
  • 所有顶点的 z 坐标都设置为 0.f。然后我只需移动相机以检查深度测试是否有效。作为另一个测试,我将三角形 z 坐标设置为 -0.5f 和 +0.5f,但得到了相同的结果。 Func 设置为 GL_LESS 但如前所述:“我先绘制贴花数据”,然后是颜色填充数据。这意味着立方体是在三角形之前绘制的。我将使用用于创建立方体正面和其中一个三角形的数据来更新问题。

标签: c++ opengl-es depth-buffer depth-testing


【解决方案1】:

我现在觉得很傻。我的颜色着色器没有正确应用模型视图矩阵。它总是以固定的深度渲染。

我修改了我的颜色着色器代码,以与贴花相同的方式应用矩阵,现在它可以完美地工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 2016-11-27
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多