【问题标题】:Shadow volume implementation阴影体积实现
【发布时间】:2013-06-23 18:39:43
【问题描述】:

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

尽可能多地提供建议。

【问题讨论】:

标签: java opengl shader lwjgl shadow


【解决方案1】:

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

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

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

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

HeHe tutorial 27 是一个出色且易于遵循的阴影体积教程。

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

【讨论】:

  • NeHe 教程使用了很多不推荐使用的方法,所以用它来学习如何做阴影体积真的很糟糕。
  • @Vallentin 非常好的一点:大多数 NeHe 教程都是在 T&L 时编写的。但是,要了解 z-pass 阴影体积的基础知识,一些 cpu 代码和固定功能模板缓冲区将起到作用(这些都没有被弃用)。正因为如此,我想提到古老但超级酷的 NeHe 教程,其中文学编程风格有很大帮助
  • 是的,我同意,使用不推荐使用的方法对学习有好处,尽管在答案中说明这一点会很好,这样人们就会意识到使用不推荐使用的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-14
  • 2012-08-21
相关资源
最近更新 更多