动态多光源 Light-Pre-Pass Lighting 实现

来源:互联网 发布:spring源码解读视频 编辑:程序博客网 时间:2024/05/16 01:44

辛苦数天,终于有所突破。在rendermonkey里用glsl实现的代码请去这里下载

关于渲染器结构设计可参见

http://www.cnblogs.com/cloudffx/archive/2011/08/31/2160208.html

关于deferred rendering (延迟渲染)、light pre-pass rendering(怎么翻译?)的优缺点详细分析可参见

http://www.cnblogs.com/hmxp8/archive/2012/01/29/2331292.html


体会。先说一下法线贴图,本来以为已经够了解它了,结果还是摔了个跟头。

  1. 从bumpMap(NormalMap)里取出的法线是在“切空间”里的,变换到哪个坐标系下取决于光照在哪里计算。如果是在世界里计算,法线需要乘以matTBN先变换到模型坐标系下,再乘以matWorld到世界坐标系下。在片断shader里如下,其中v_tange v_binormal v_normal均是模型坐标系下的量。
       mat3 tbn;   tbn[0] = v_tangent;   tbn[1] = v_binormal;   tbn[2] = v_normal;      vec3 bump = normalize( ( texture2D( bumpMap, v_tex_coord).xyz * 2.0 ) - 1.0 );      bump = tbn * bump;      vec4 normal = matWorld * vec4(bump, 0);

  2. 然后是 gl_NormalMatrix。  如果法线与它相乘,得到的法线是在视图坐标下。
Light Pre Pass 场景需要draw两次。
  1. 第一遍首先把几何体法线和深度信息写在normal rendertarget,然后渲染光,每盏光渲染一次,从normal rendertarget里取得顶点信息进行光照计算,将结果保存在light rendertarget里,然后下盏光,此时打开混合,将结果叠加在一起,第一遍结束。
  2. 第二遍再次渲染几何体,将light rendertarget做为输入,与原来的纹理颜色混合处理,并最终输出。
在渲染光的时候,将光当做一个几何体。如果是方向光,则绘制一个视口大小的面。如果是点光或聚光,是各自的包围体。对于这两种,要考虑摄像机在包围体内的情况。
样图如下

原创粉丝点击