影子卷实施

时间:2013-06-23 18:39:44

标签: java opengl shader lwjgl shadow

我需要一些帮助在我的演示中实现阴影卷。我已经找到了一些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);
}

尽可能多地提供建议。

1 个答案:

答案 0 :(得分:0)

您拥有的代码是拉伸顶点着色器。

它只是检查你的三角形是否面向光(dot指令)。如果不是,则将w坐标设置为零(vec4(0.0, 0.0, 0.0, 0.0)),以便将顶点投影到无穷远处。否则,如果cpu计算标志非零(gl_Color.r),那么顶点将在lightAngle之后从光源挤出(lightAngle是从光朝向顶点的方向而不是角)。

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

更有趣的部分是计算施法者点燃的轮廓,并使用模板缓冲区来测试碎片是在体积内还是体外。

HeHe tutorial 27是影子卷的优秀且易于学习的教程。

GPU Gems有一篇文章提供了一个快速且无神器阴影卷的技巧。