我有两个表面。
一个作为背景(首先渲染)。
另一个作为我的“画布”(最后渲染)。
当我试图使用混合来达到透明效果时,我发现了一个非常奇怪的问题!
即使我已经按照“推荐”的渲染顺序进行了渲染,我仍然无法获得透明效果……
我不得不使用一些“技巧”来达到我想要的效果。
我现在的妥协是要么使用glDepthFunc(GL_LEQUAL)
,要么稍微调整第二个曲面的Z(加上0.001f
)...
glDepthFunc(GL_LEQUAL);
quad.Draw();//the background
glDepthFunc(GL_LESS);
或
std::vector<GLfloat> Vtx = {
1.0f, 1.0f, 0.0f, // top right
1.0f, -1.0f, 0.0f, // bottom right
-1.0f, -1.0f, 0.0f, // bottom left
-1.0f, 1.0f, 0.0f // top left
};
std::vector<GLfloat> Vtx2 = {
1.0f, 1.0f, 0.001f, // top right
1.0f, -1.0f, 0.001f, // bottom right
-1.0f, -1.0f, 0.001f, // bottom left
-1.0f, 1.0f, 0.001f // top left
};
我很想知道为什么会这样。难道它不遵循正确的渲染顺序来正确地混合每个对象吗?
有没有更好的方法可以在这两个表面上实现透明效果?
1条答案
按热度按时间o7jaxewo1#
我意识到这其实是一个很复杂的问题。。
首先,您必须将
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
放在正确的位置。而且我一开始就把它放错了地方(我甚至把
glClear(GL_COLOR_BUFFER_BIT)
和glClear(GL_DEPTH_BUFFER_BIT)
放在了两个不同的地方),导致了后来所有结果的混乱!然后关于NDC的Z轴...是的,NDC的Z轴的-z指向我的眼睛,只有在整个场景变成3D之后才是+z指向我的眼睛...
使用法线投影矩阵后
但是还有另一个问题……如果我真的把两个平面重叠(两个z都是0),就会有z战斗(至少在3D场景中是这样)。
下图显示了不含
glDepthFunc(GL_LEQUAL)
的2D场景(两个曲面也完全重叠)我目前的解决方案是:
直接在2D场景中的代码中添加
glDepthFunc(GL_LEQUAL)
(是的,我不知道为什么,但是当没有投影矩阵时,z战斗就会消失)。或者将
-0.001f
添加到所有z坐标(glClear
必须放置在正确的位置)