我需要一些帮助在我的演示中实现阴影卷。我已经找到了一些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);
}
尽可能多地提供建议。
答案 0 :(得分:0)
您拥有的代码是拉伸顶点着色器。
它只是检查你的三角形是否面向光(dot
指令)。如果不是,则将w
坐标设置为零(vec4(0.0, 0.0, 0.0, 0.0)
),以便将顶点投影到无穷远处。否则,如果cpu计算标志非零(gl_Color.r
),那么顶点将在lightAngle
之后从光源挤出(lightAngle
是从光朝向顶点的方向而不是角)。
此着色器仅负责构建一个卷,其中的每个片段都将处于阴影中。
更有趣的部分是计算施法者点燃的轮廓,并使用模板缓冲区来测试碎片是在体积内还是体外。
HeHe tutorial 27是影子卷的优秀且易于学习的教程。
GPU Gems有一篇文章提供了一个快速且无神器阴影卷的技巧。