0

我似乎在网上找不到任何关于修复对象阴影投射的信息,这些纹理具有 alpha != 1。

有没有办法实现“每片段深度测试”之类的东西,而不是“每顶点”,所以如果彩色纹素具有透明度,我可以丢弃片段在阴影贴图上的出现?此外,理论上,它可以使阴影映射更准确。

编辑

好吧,也许这是我上面给出的一个糟糕的想法,但我只想告诉着色器,如果纹素的 alpha<1,则不需要在纹素后面隐藏东西。我猜深度纹理只需要顶点信息,这就是为什么每个关于阴影贴图的教程都最小化了顶点和空片段着色器,并且在尝试使用片段着色器做某事时没有任何反应。

无论如何,通过部分透明的对象修复阴影投射的主要思想是什么?

编辑2

我已经修改了我的着色器,现在它会丢弃每个片段,如果至少有一个片段具有透明度 o_O。所以这些对象现在不投射任何阴影(但不透明)......请看一下着色器:

// Vertex Shader
uniform mat4 orthoView;

in vec4 in_Position;
in vec2 in_TextureCoord;
out vec2 TC;

void main(void) {
TC = in_TextureCoord;
        gl_Position = orthoView * in_Position; 
}

.

//Fragment Shader
uniform sampler2D texture;

in vec2 TC;

void main(void) {
vec4 texel = texture2D(texture, TC);
if (texel.a < 0.4)
    discard;
}

这很奇怪,因为我在我的其他着色器中使用相同的技巧和相同的纹理,它可以工作......有什么想法吗?

4

1 回答 1

1

如果在片段着色器中使用丢弃,则不会为该片段记录深度信息。因此,在您的片段着色器中,只需添加一个测试以查看纹理是否透明,如果是则丢弃该片段。

于 2013-01-19T16:18:56.880 回答