GPUPro360 Volume Decals

# brief
- 一般的decal是要把一个quad给贴到已经渲染号的场景上,zai一些情况下会导致stretch
- volume texture提供了旋转不变性。原理就是把像素还原到世界空间,然后在volume texture里sample
- 一些情况下也不一定真的用volume texture,可以用2d texture达到同样的效果


# 原理
- 一般特效是个quad,但是在倾斜、有corner的geometry上就会有很明显的问题(贴不上去)
- volume decal的做法是:在ps里采深度、还原世界坐标位置,然后去采一个volume texture,这样就相当于把volume texture给印到了世界场景中
- 还可以加入rotation这些来是的decal在不同的地方使用时有unique appearance


# 实现细节
- defered renderer集成进去没啥麻烦
- forward麻烦些,因为木有normal(defered可以直接拿到normal,forward拿不到之前画的物体的normal)
    - 比如burn mark,可以直接modulate到之前的scene pass画的东西上
    - alpha blend,比如bullet hole这种,需要take light into consideration(比如角落里的枪眼暗,明处的亮)
        - 方案1:把整体亮度存在alpha里,唯一的问题是亮度无颜色
        - 方案2:直接用最近的light的attenuation,不考虑normal
        - 方案3:从depthbuffer把normal算出来,slow而且不robust
- dynamic object不想受decal。因为decal可能是用来搞油污、脏痕啥的。只想在墙上有
    - 方案1:先画decal再画dynamic
    - 方案2: 排序,让在decal之后加入场景的动态物体在decal后画
    - 方案3:存intersect的东西的objectid。遇到没有的objectid的pixel就cull掉


# optimization
- 使用depth bound test,快速cull掉不受decal影响的pixel?


# Variations
- volume texture一个是占内存、一个是难制作,所以有的时候考虑还是用2D texture,比如bullet hole这种,比如把bullet hole texture sweep到一个sphere上,这样可以随意旋转后使用
- 或者就是用得到的3d坐标的xy去sample 2d texture,把z用来做fading。
- 用volume texture的时候也可以搞成越往边界越fade
- 2D decal不是rotation invariant的,如果decal plane平行于projection平面还好,但是如果平面就是不规则,比如一个墙角,那就没啥办法了
- 子弹打中monster后的飙血效果:以击中点为顶点,用frustum或者pyramid,做一个decal,方向要搞对
- grenade爆炸后的效果:用cube decal,用vector方向来查cubemap,用vector的length来做fade
- 为了更好的效果,可以用dot(N,L)或者类似shadowmap这样的效果把backfacing或者挡住的部分给cull掉

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值