深度缓冲区不使用多个着色器程序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度缓冲区不使用多个着色器程序相关的知识,希望对你有一定的参考价值。
我正在使用OpenGL-ES为手持系统编写一个C ++的3D图形渲染器,我正在使用贴花(纹理)着色器以及颜色填充着色器。我有两个渲染过程,我使用相应的程序,并使用数组/元素缓冲区使用glDrawElements绘制数据。
虽然我在我的应用程序中启用了GL_DEPTH_TEST,但我的贴花多边形总是在我的颜色填充多边形前面渲染。
我已经尝试重新构建我的投影/ 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);
当我创建两个彩色三角形和一个纹理立方体时,此屏幕截图是当前输出:
蓝色箭头表示应在前面呈现的三角形。有任何想法吗?
答案
我现在觉得很傻。我的颜色着色器未正确应用模型视图矩阵。它始终以固定的深度渲染。
我修改了我的颜色着色器代码,以与贴花相同的方式应用矩阵,现在它完美地工作。
以上是关于深度缓冲区不使用多个着色器程序的主要内容,如果未能解决你的问题,请参考以下文章