当前位置:   article > 正文

挑战UnityShader学习之三_工欲善其事必先利其器Standard面板详细解析和代码自定义_unity的standard

unity的standard

Standard Shader面板原来的样子

之前第一第二章,分别分享了,最普通,进阶Phonn光的PBR(都不是PBR)模板,本来第三章想分享Unity官方的PBR;结果碰到Unity的作死模式,又得开一章详细说Shader的入门;如果只想获取PBr模板的,请跳去第四章;

Unity Standard Inspector面板真不好说的,丑就一个字,两个字就是,鸡肋;

我们先把Cust Editor去掉

  1. }
  2. }
  3. FallBack "VertexLit"
  4. //CustomEditor "StandardShaderGUI"
  5. }

看到编辑器原来的样子

然后搞了一大轮,才发现 .smoothness 居然是通过Smoothness Factor 控制的

就问你服不服

 

 

胡乱分析一通

我这里假设你手上已经有Built-in Shader的源码

又假设你已经阅读前面两章,也又提到若想在Unity做一点点渲染,必须首先先学PBR

(Unity搞那么复杂,主要是为了跨平台,这个后面几章会再详细说,但明知道要跨平台,底层内核设计之差,真是前所未见,这么多年更是不思进取)

又又或者你大学学了vf Shader,有opengl的基础是指

那么,你才好往下看,因为都是写给自己或者学过的,踩过坑的人看的

fragment Shader渲染时用到的参数从哪里来呢?我们就知道关键在于在这个方法

FRAGMENT_SETUP(s)

直接看大神分析,在这里s == 0

  1. //在unitystanderuitils.cginc中,计算alpha对漫反射颜色造成的影响,
  2. o.diffColor = PreMultiplyAlpha (o.diffColor, alpha, o.oneMinusReflectivity, /*out*/ o.alpha);
  1. inline FragmentCommonData MetallicSetup (float4 i_tex)
  2. {
  3. //获取x金属度和y光滑度,定义在UnityStandardInput.cginc中
  4. half2 metallicGloss = MetallicGloss(i_tex.xy);
  5. half metallic = metallicGloss.x;
  6. half smoothness = metallicGloss.y; // this is 1 minus the square root of real roughness m.
  7. //....
  8. o.smoothness = smoothness;
  9. return o;
  10. }

如果今天再有人和我说Unity不是垃圾,这公司的市占率不是靠运气,我&……!%&¥&¥&@……!

前面2个文章说了,

你若想哪怕写一点点Shader,都必先学习一般的PBR(必须,否则会被Unity带晕),然后又得学习一整套Unity自定义的PBR(而不能踩到以前的坑,网上的很多学习参考资料,都是我们很多团队不得已只能自己干完了之后,发布到网上的)

Unity自定义PBR很有趣的一个地方就是把,很多其他程序员用的,gloss等价于smoothness,死活就是不用roughness,这下终于有解答了

他们是希望证明他们绝对没有抄袭其他公司,例如UnReal的资源吗?

这回真的是草履虫才看的明白,

请看Unity 对于自家,smoothness的封装:

  1. half2 MetallicGloss(float2 uv)
  2. {
  3. half2 mg;
  4. #ifdef _METALLICGLOSSMAP
  5. #ifdef _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
  6. mg.r = tex2D(_MetallicGlossMap, uv).r;
  7. mg.g = tex2D(_MainTex, uv).a;
  8. #else
  9. mg = tex2D(_MetallicGlossMap, uv).ra;
  10. #endif
  11. mg.g *= _GlossMapScale;
  12. #else
  13. mg.r = _Metallic;
  14. #ifdef _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
  15. mg.g = tex2D(_MainTex, uv).a * _GlossMapScale;
  16. #else
  17. mg.g = _Glossiness;
  18. #endif
  19. #endif
  20. return mg;
  21. }

你说,Unity这个Standard是不是鸡肋?,而且它这封装方法也证明是LS;杠杠的反人类。

从上代码可知,在最后一个分支,s.smoothness 才受_Glossiness本身控制(Inspector面板显示的是 Smoothness);

特喵的还有其他三个分支呢??

而,其实大部分情况,通过_GlossMapScale(Inspector面板显示的是Smoothness Factor) 控制贴图的透明度

mg.g = tex2D(_MainTex, uv).a * _GlossMapScale;

上面的mg. g 解释一下把,

- 就是一个float2变量的第二位,(mg.green),第一位就明显是mg.r(mg.red)

- 对应的就是s.gloss, s.metal,

- 也是我们的老朋友,金属度或粗糙度

-

这也是解释为什么官方Standard不是Smoothness,而只能通过Smoothness Factor 来控制渲染材质(依赖贴图)的效果

Unity再次像我们证明

“编程很简单,写了一大堆,其实有用的只有一行代码”

当然,编程的层次还是很多的,例如模块化,例如插件模式,又例如多线程,虽然说都必须是高级语言才有的特性,但是像Unity这种超低级封装,没想到2020年真还能见着。

渲染效果

搞了一大轮,三篇文章,终于。。。能渲染出一点点,积水的效果

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/127743
推荐阅读
相关标签
  

闽ICP备14008679号