深度缓冲区不适用于多个着色器程序

时间:2019-04-13 22:46:30

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

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

尽管我在应用程序中启用了GL_DEPTH_TEST,但贴花多边形始终在填充颜色的多边形之前呈现。

我尝试重新构建我的projection / modelView矩阵的构建方式并将其传递给着色器,我尝试了不同的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);

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

Render Error

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

1 个答案:

答案 0 :(得分:0)

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

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

Working Render