Shader 学习笔记 20151113

Segment 0 回想

  • 最近好忙,想无可想

Segment 1 阅读

  • Chapter 3: Making Your Game Shine with Specular - Creating a BlinnPhong Specular type
  • Chapter 3: Making Your Game Shine with Specular - Masking Specular with textures
  • Chapter 3: Making Your Game Shine with Specular - Metallic versus soft Specular ,此张其实是上一张的应用,告诉我们一个实际使用specular textures的例子。

Segment 2 理解

  • 列表内容
    说的好!取材质就得在surf()里面完成。如果我们需要在lighting()里面去操作shader外面传进来的texture,就只能在surf()里面先把值抽取出来,再赋给我们自定义的CustomerInOut s才行。

根本原因是uv只能通过Input这个struct里面抓得到,而Input只在surf()里面才能输入进去。

那么有一个问题出现了,很多texture是在lighting()里面取,例如:
float roughness = tex2D(_RoughnessTex, float2(NdotH_raw * 0.5 + 0.5, _Roughness)).r
这种取法同surf()里面 float4 specMask = tex2D(_SpecularMask, IN.uv_SpecularMask) * _SpecularColor
又有什么不同呢?
思索了一下,在lighting()里面tex2D()取的时候,它的坐标都是依据光源/法线/视点算出来的,也就是说他计算的是动态的,是根据光源、obj的运动(带动了法线动)、视点的运动随时改变的。而从surf()里面用uv抽取出来的值,虽然在世界视角看来是动的,但是对obj本身来说,其并未产生变化,是静态的,这也就是一定要用uv来描述的原因所在吧。
通俗的说,uv取出来的一定会联系到obj上,obj动它就动,不管取出来的是实际color值还是控制值。lighting()里面取的texture的值绝大多数都需要视点、光源、像素normal一起作用,实际看到的效果让人感觉和obj没什么联系。


  • 使用控制材质控制specular 反光。
    这里写图片描述
    这里写图片描述
    很关键,非常关键! 想要能自定义反光感觉,就需要这种所谓的反光控制贴图作为一个控制项输入到shader里面,只有这样才能弄出来真实物体的镜面反光效果(因为真实物体肯定不是大面积光滑表面的)。

于是就有一个很有趣的疑问,平底锅的反光,应该是BRDF和specular texture一起搞么?(如果真的是的话,能搞出来么? 看了本章最后一张那个各项异性贴图,貌似又有点不一样)


  • 关于debug
    这里写图片描述
    看到了吧,可以每一步都把相应的图打出来看看,有一个直观的认识,这就是debug的过程。真的很方便啊。

这里写图片描述


猜你喜欢

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