阴影贴图和透明四边形


10

阴影贴图使用深度缓冲区来计算应在何处绘制阴影。

我的问题是我想要一些半透明的纹理四边形来投射阴影-例如广告牌树。由于将在所有四边形上设置深度值,而不仅仅是可见部分,因此它将投射四边形阴影,这不是我想要的。

如何使用阴影贴图使透明四边形投射正确的阴影?

Answers:


15

您的问题将解决使用1位alpha渲染的问题。这意味着您指定一些未渲染的源纹理的Alpha(通常为0.5)。

您必须编写自己的着色器以节省光照深度并使用说明discard。废弃存在于hlsl,glsl和cg中。它仅存在于像素/片段着色器中,并将当前片段从渲染中丢弃到backBuffer和z-buffer中。

if (texSample.a < 0.5)
   discard;

优点是您无需更改第二遍渲染,只需更改灯光深度即可。我也证明了它的工作原理: 1位阿尔法

如果要为多个透明对象渲染正确的阴影,则必须使用多个深度纹理,并使用深度剥离来显示深度和不透明度信息。对于烟雾,头发等。深不透明度或傅立叶不透明度贴图是最佳解决方案(我主要推荐傅里叶不透明度贴图)

编辑:我只是意识到我忘了增加学分。一如既往。树模型来自loopix项目,如果您正在寻找一些低多边形,一种纹理和免费的植被模型,那将是一个很好的选择。


6

使用可编程管道,您应该按照@notabene的指示进行操作。但是,无需编写任何着色器,也可以轻松地使用固定管线。在OpenGL中,glAlphaFunc是您想要的。例如:

glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.5f);

1
整齐。我讨厌固定管道。因此,我非常佩服每个无需着色器即可完成此操作的人。肯定是+1。
Notabene 2011年

@Notabene使用过时的技术绝对令人钦佩。
塔拉

2

您需要一个自定义着色器来生成阴影贴图,因此,当像素/片段的透明度大于您指定的阈值时,您可以输出有效的遮挡物。这样,深度图将按像素而不是按多边形生成。


-1

我能想到的唯一方法是创建一个单独的深度图纹理,将树渲染到其中,输出alpha = 0的深度,否则输出depth = 1,然后将此阴影图纹理与场景阴影图纹理组合,这应该足够简单;只需取两个值中的最小值并将其设置为最终深度图即可。

但是,这不能解决混合订单;如果在alpha纹理后面输出深度,则在渲染带有纹理的四边形时它将被覆盖,因此要使此效果正常工作,您将必须将每个四边形分别渲染到深度图纹理中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.