您的位置:首页 > 移动开发 > Unity3D

Shader 学习笔记 20151103

2015-11-03 11:23 274 查看

Segment 0 回顾

BRDF 回想。

昨天弄到半夜,硬是想象不通这个斜着交叉的线是怎么个搞法,特别是当别人提出某种渲染需求的时候,我根本无法给出可操作的步骤。(见下图)



于是只能按图索骥,看看cook book里面推荐的链接 http://wiki.polycount.com/wiki/BDRF_map

Nice! 还是wiki说的清晰,先抄文字,再截个图。

BRDF stands for Bidirectional Radiance Distribution Function, a way for describing how a surface reflects light. In game shaders BRDF is usually a rougher approximation, simplified for faster rendering. A BRDF map is a vertical gradient mixed with a horizontal gradient, each controlling how the surface reflects light relative to a different angle: one for the camera, and the other for the main light.

核心处就是黑体的最后一段话,这段话说了两点,一个是BRDF是个二维的(分别和视点、光源方向相关);另外一个就是Vertical gradient mixed with a horizontal gradient,这个万分重要,我昨天百思不得其解之处就在这里,这玩意根本不是什么斜线,就是一个横轴一个竖轴。

下图里面英文描述的很清晰了,其中非常详细的讲解了如何创建BRDF texture。可以这么描述,纵轴上面的点(图中点B)远离光源,下面的点(图中点A)靠近光源(此处用的是halfLambert方式,材质的坐标原点什么的不是重点,跟你的坐标系相关);横轴左面的点(图中点D)和视点成90度,图中右面的点(点C)和视角平行。

所以你看,我们在攒弄texture的时候,还是有章可循的。请忘记那个什么斜线吧。。。



Segment 1 阅读

cook book chapter 2 , using texture for effect, 第一小节,通过改材质UV值进行scrolling

cook book chapter 2 , using texture for effect, 第二小节,通过改材质UV值搞动画

cook book chapter 2 , using texture for effect, 第三小节,Packing and blending textures

第三小节也参看了 (打包和混合textures http://blog.csdn.net/candycat1992/article/details/20792585

Segment 2 理解

通过改UV值进行scrolling,其核心是使用_Time乘以速度来确定不同时间下面的UV颜色值。这样一来,就可以有卷轴效果了。书里面的例子是流水

通过材质UV搞帧动画,这玩意没啥好说的,很平常。只是里面有一个蛮重要的概念是CPU和GPU的分工,一般我们会把过多的除法和算法交由CPU去做(见下图,cook book page 38 ),这样算术工作就不是GPU直接弄了。当然,这里面有两个问题,一个是哪种算法更适合GPU单元去做,乘法/除法/加减/开方(我觉得是乘法和加法)?另外一个就是怎么balance CPU和GPU之间的loading,既不能全在CPU搞,也不能全在GPU弄?



打包和混合,这个其实概念比较简单,就是有一张texture用来做控制材质,控制什么呢?控制其他几张材质的混合。怎么控制呢?就是用控制材质里面不同通道(RGBA通道)里面的灰度值配合lerp函数去调和。下图解释的颇为清晰了。



下面是一个实际例子的控制材质以及渲染材质。





具体的玩法就是用控制材质的G通道做参数调和材质A、B,调和完成的结果在去和材质C调和(此时用控制材质的B通道调节),然后再和材质D调和(用Alpha通道),调和完成后再用R通道调和一个地形颜色(这个不属于材质算法了,仅仅是这个例子里面这么用了),最后再乘以一个环境光。 这样完全调和之后的材质就可以渲染一个表面了,此处的例子是地表。见下图



好了,写到这里,这玩意有啥好处呢?cook book page39 有一段Why is this helpful的话,按照书里的意思是说可以把能合并的图合并在一个材质里,恕我直言,这书里的例子完全感受不到这点。如果我要渲染一个地表,直接贴图就好了,为何还要搞4个素材材质以及一个控制材质?这完全是在内存开销上背道而驰啊!

至于有人说这样能加快GPU的采样速度,因为GPU在采同一个图的时候会快。我也觉得不妥,假设我渲染了三个不同的地表,一种方法是三张texture直接贴;另外一种是素材4张,控制三张,无论如何也看不出用控制texture能加快速度。唉。。。 只能慢慢学慢慢体会了。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shader unity