我有一个透明和不透明的2d项目的场景。我首先使用深度测试和深度模板(写入)渲染不透明项目,从前到后顺序。然后我将深度遮罩设置为false(不禁用深度测试),启用混合并从后向前渲染透明遮罩。
但问题是透明物品未正确绘制。当我使用glDepthFunc(GL_LESS)时,它们根本没有被绘制,当我使用glDepthFunc(GL_EQUAL)时,它们被绘制但是应该被不透明项遮挡的那些不是。他们只是真正地渲染了一切。
渲染例程中的代码如下所示:
// Set the clear color
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepthf(1.f);
glDepthRangef(0.f, 1.f);
glDepthMask(GL_TRUE);
glEnable(GL_DEPTH_TEST);
// Draw opaque items
glDepthFunc(GL_LESS);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
renderOpaque();
// Draw transparent items
glDepthMask(GL_FALSE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
renderAlpha();
glDisable(GL_BLEND);
项目的z值按以下方式设置:
// Bottom layer (background) is 0 and then layer is incremented
// by one for each view that sits on top
// I use the far value (something like 10000.f) to divide to get
// something between 0.0 and 1.0 (from back to front: 0.0/10k, 1.0/10k,
// 2.0/10k etc)
float zTranslation = static_cast<float>(GetLayer()) /
TheCamera::Instance().GetFar();
glm::mat4 model = glm::translate(glm::mat4(1.f),
glm::vec3(m_absoluteFrame.origin.x,
m_absoluteFrame.origin.y,
zTranslation));
glm::mat4 MVP = muiKit::TheCamera::Instance().GetProjection() *
muiKit::TheCamera::Instance().GetView() *
model;
然后将MVP矩阵传递给着色器以设置gl_Position ...
gl_Position = MVP * vec4(imageVertex.xyz, 1);
我还传递纹理坐标和索引等,并分批使用glDrawElements进行绘制。
我在这里做错了什么?
另外,即使我是新手,我觉得当我渲染透明物品时,深度功能应该是GL_GREATER ......不是吗?不知何故,我知道我将它们按照前面的顺序渲染它是有道理的。
答案 0 :(得分:0)
同样老了。我发现了什么问题。由于我正在批量渲染所有内容,我实际上并没有使用我为每个视图计算的MVP,而只是拥有批次的视图的MVP。因此无论我在这里放置什么z值,它都不会进入着色器。我想我必须为批处理渲染的每个几何体传递深度值,或者如果可能的话传递它们的矩阵数组。无论如何,谢谢@Tommy的帮助。