ShaderSimpler(8) : 初探Deferred shading

源码下载:http://myshaders.googlecode.com/files/ShaderSimpler_05142007.rar

 对于一个基于Shader的渲染系统如何来计算多个动态光源的光照呢?这是一个困扰我很久的问题。基本上有这样三种解决方案:
1. 在单个pass中计算物体的所有光照。这种方案的主要缺点就是shader管理非常复杂。常见的思路是基于一套shader模版,自动生成n个光照shader,n往往能达到上百个;另外一个主要的缺点就是很多fragment经过复杂的光照计算之后又被z测试剔除,造成计算的浪费(可以先进行一个z only pass来优化);
2. 为每个灯光进行一个pass。这种方案也会有前者over draw的问题,另外还会造成draw call数量增加;
3. deferred shading,这种方案结构简单,但是对显卡要求较高,需要multi-render targets, float point render target;还有就是对于透明面,目前还没有很好的解决方法。

下面就介绍一下Deferred Shading的思路。它的想法非常的简单、直接,简单的说就是我们可以把光照计算需要的一些参数先通过一个pass渲染到一些render target中(称为Attributes buffer或G-Buffer),然后可以为每个灯光进行一个pass来计算光照。

源码中演示了deferred shading的基本概念,实现了4个点光源的phong 光照渲染。为了能在Geforce 5600上跑,没有使用multi-render targets,而是用了多个pass来生成G-Buffer,这样也可以更清楚的演示deferred shading的概念。
首先程序创建了position,normal,diffuse三个render target,在渲染时使用3个pass,把场景的“世界坐标”,“法线(世界坐标系)”,“颜色”,分别渲染到这三个render target中;为了简单起见,假设所有灯光都覆盖整个屏幕――为每个灯光进行一个pass,渲染一个全屏幕的quad,然后为每个象素计算光照,并使用additive混合,把光照强度累加到屏幕缓冲中。


下面是G-buffer的抓图,这些图片在上传的时候都进行了缩小。
position:

normal

diffuse

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值