在OpenGL ES 2中,深度缓冲区不适用于alpha渲染

时间:2015-02-27 00:56:46

标签: c++ opengl-es

我有一个透明和不透明的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 ......不是吗?不知何故,我知道我将它们按照前面的顺序渲染它是有道理的。

1 个答案:

答案 0 :(得分:0)

同样老了。我发现了什么问题。由于我正在批量渲染所有内容,我实际上并没有使用我为每个视图计算的MVP,而只是拥有批次的视图的MVP。因此无论我在这里放置什么z值,它都不会进入着色器。我想我必须为批处理渲染的每个几何体传递深度值,或者如果可能的话传递它们的矩阵数组。无论如何,谢谢@Tommy的帮助。