Shader 学习20160625

Writing vertex and fragment shaders
Vertex and Fragment Shader Examples
http://docs.unity3d.com/Manual/SL-VertexFragmentShaderExamples.html


这一章实在是太有趣了!!!

我把自己能recognition的写一下吧。

A,a Vertex Journey。看图说话,自然知道进去vert()的必须有vertex: POSION ,以及可能有uv: COORDINATE。出来的一定有MVP 转过的vertex position。
这里写图片描述

B,其实很多计算放在vert()或者frag()都有可能,就看你想得到的效果和使用多少资源。例子里面reflection的那两个例子真是让人印象深刻。一个是在vert()里面做ref向量;一个是在frag()里面做ref向量,触目惊心!虽然没实验,但我坚信frag()的开销高,即便vert()加上那些插值的计算。

C,occlusion居然真的就是一个Tex,仔细想想,非常合理,否则这些个自我遮罩如果要用算数算的,即便有简便方法,但是还是过猛。

D,ambient light 居然就是一个light probe,纯用ShadeSH9(half4(worldNormal,1))算出来的。

E,为什么用了normal Tex之后所有的反射都要在frag()里面做?! 因为vert()里面根本不可能做到pixel级别的读取,强上的话就会丢掉很多细节。而搞在frag()里面,故事就多了,一个是要把反射计算弄到frag()里面,另外一个就是要把normal Tex里面的normal decode之后从tangentspace转到 worldspace,也是个操心耗计算的活。

F,UnityCG.cginc里面真的有好多handy函数,什么UnityObjectToWorldNormal(),什么reflect(),什么ShadeSH9(),太他妈的方便了。唯一的缺点就是要看一遍函数头记得都有啥.

G,那个使用三个Tex从X,Y,Z axis投影渲染Texture的方式比较有趣。

H,所有阴影就别自己费劲了,抄pass{}就好,如果懒得抄,就用这句
// shadow casting support
UsePass “Legacy Shaders/VertexLit/SHADOWCASTER”
接受阴影也是,用现成的
vert( ){TRANSFER_SHADOW(o)} , frag(){SHADOW_ATTENUATION(i)}

I,最最关键的,
**模拟真实世界,请老老实实的使用surfaceshader,别创造;
如果有效率需求,首选mobile的,实在没有自己再做;
如果搞显示世界里面没有的,把幻想带进现实的,请自己写vert(), frag()。**

猜你喜欢

转载自blog.csdn.net/mconreally/article/details/51760142