Jer*_*emy 2 c++ opengl shader alpha-transparency depth-buffer
因此,当我应用于其中的一些纹理具有alpha通道时,我试图找出在OpenGL中渲染3D模型的最佳方法.
当我启用了深度缓冲区并开始绘制3D模型中的所有三角形时,如果它绘制了一个位于模型中另一个三角形前面的三角形,那么当它到达它时它将不会渲染后三角形.问题是当前三角形具有alpha透明度时,应该能够看到它后面的三角形,但后面的三角形仍然没有渲染.
禁用深度缓冲区可以消除这个问题,但会产生一个明显的问题:如果三角形是不透明的,那么如果渲染后它仍然会在它后面渲染三角形.
例如,我正在尝试渲染一棵松树,它基本上是一些堆叠在一起的锥体,它们具有透明的底座.下图显示了启用深度缓冲区时出现的问题:

您可以看到如何仍然可以看到透明三角形的轮廓.
下图显示了禁用深度缓冲区时的样子.

在这里,您可以看到树背面的一些三角形是如何在树的其余部分前呈现的.
任何想法如何解决这个问题,并正确渲染松树?
PS我正在使用着色器渲染所有内容.
如果你没有使用任何部分透明度(一切都是0或255),你可以glEnable(GL_ALPHA_TEST),这应该会帮助你.问题是如果你首先渲染顶部圆锥体,它会将整个四边形放入z缓冲区(甚至是透明部分),因此下面的下部分支在绘制它们的时间时会被拒绝.如果alpha测试未通过alpha测试(使用glAlphaFunc设置),则启用alpha测试不会将像素写入z缓冲区.
如果要使用部分透明度,则需要在案例中从后到前或从下到上对渲染对象的顺序进行排序.
您还需要启用z-buffer.
[编辑]哎呀我意识到当你使用着色器时我不相信那些功能.在着色器情况下,如果alpha值接近零,则要在片段着色器中使用discard函数.
if(color.a < 0.01) {
discard;
} else {
outcolor = color;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2424 次 |
| 最近记录: |