2013-06-23 39 views
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); 
} 

只要给尽可能多的意见成为可能。

+1

这可以给你一些基本的信息:http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-16-shadow-mapping/ – Grimmy

回答

0

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

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

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

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

HeHe tutorial 27是一款优秀且易于操作的影子卷教程。

GPU Gems有一个技巧文章有一个更快的和神器自由影卷。

+0

NeHe教程使用了很多废弃的方法,所以它真的很糟糕用它来学习如何做阴影卷。 – Vallentin

+0

@Vallentin非常好的一点:大多数NeHe教程都是在T&L时刻编写的。但是,要学习z-pass阴影卷的基础知识,某些cpu代码和固定功能模板缓冲区将执行此操作(这些不会被弃用)。正因为如此,我想提出一个旧的,但超级酷的NeHe教程,其中识字的编程风格有很大的帮助 –

+0

是的,我同意,使用不推荐的方法对学习很有帮助,尽管在答案中可以很好地告诉人们,使用已弃用的方法。 – Vallentin