OpenGL 3.2:通过透明纹理投射右阴影

时间:2013-01-19 14:31:03

标签: opengl glsl

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

有没有办法实现“per-fragment depth test”之类的东西,而不是“per-vertex”,所以如果彩色texel具有透明度,我可以放弃在shadowmap上出现片段?此外,理论上,它可以使阴影映射更准确。

修改

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

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

EDIT2

我修改了我的着色器,现在它丢弃了每个片段,如果至少有一个片段具有透明度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;
}

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

1 个答案:

答案 0 :(得分:1)

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