1

我需要一些帮助在我的演示中实现影子卷。我已经找到了一些 GLSL 着色器文件,并且我已经创建了一个合适的着色器加载器。我所需要的只是知道如何以正确的方式实现它。我正在使用LWJGL 2.9.0

shadowvolumes.vs

void main()
{
    vec4 lightAngle;
    vec4 pos;
    lightAngle = normalize(gl_Vertex-gl_ModelViewMatrixInverse*gl_LightSource[0].position);
    if (dot(gl_Normal,lightAngle.xyz)<0.0) 
    {
        if (gl_Color.r>0.0)
            pos = gl_Vertex+lightAngle * 10.0;
        else
            pos = gl_Vertex;
    }
    else {
        pos = vec4(0.0, 0.0, 0.0, 0.0);
    }
    gl_Position = gl_ModelViewProjectionMatrix*pos;
}

shadowvolumes.fs

void main()
{
    gl_FragColor = vec4(0.1, 0.1, 0.1, 1.0);
}

只是提供尽可能多的建议。

4

1 回答 1

0

您拥有的代码是一个挤压顶点着色器。

它所做的只是检查您的三角形是否面向灯光(dot说明)。如果不是,则将w坐标设置为零 ( vec4(0.0, 0.0, 0.0, 0.0)),以便顶点投影在无穷远处。否则,如果 cpu 计算的标志不为零 ( gl_Color.r),则顶点被挤出远离跟随的光源lightAnglelightAngle是从光到顶点的方向而不是角度)。

这个着色器只负责构建一个卷,其中的每个片段都将处于阴影中。

更有趣的部分将是通过施法者计算照明轮廓并使用模板缓冲区来测试片段是在体积内部还是外部。

HeHe 教程 27是一个出色且易于理解的阴影体积教程。

GPU Gems有一篇文章,其中介绍了获得更快且无伪影的阴影体积的技巧。

于 2013-06-24T01:36:05.523 回答