opengl 我有一个奇怪的问题时,试图混合两个重叠的表面(相同的深度)

5m1hhzi4  于 2023-04-20  发布在  其他
关注(0)|答案(1)|浏览(121)

我有两个表面。
一个作为背景(首先渲染)。
另一个作为我的“画布”(最后渲染)。
当我试图使用混合来达到透明效果时,我发现了一个非常奇怪的问题!
即使我已经按照“推荐”的渲染顺序进行了渲染,我仍然无法获得透明效果……

我不得不使用一些“技巧”来达到我想要的效果。

我现在的妥协是要么使用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 
    };

我很想知道为什么会这样。难道它不遵循正确的渲染顺序来正确地混合每个对象吗?
有没有更好的方法可以在这两个表面上实现透明效果?

o7jaxewo

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必须放置在正确的位置)

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 
}.

相关问题