赞
踩
之前第一第二章,分别分享了,最普通,进阶Phonn光的PBR(都不是PBR)模板,本来第三章想分享Unity官方的PBR;结果碰到Unity的作死模式,又得开一章详细说Shader的入门;如果只想获取PBr模板的,请跳去第四章;
Unity Standard Inspector面板真不好说的,丑就一个字,两个字就是,鸡肋;
我们先把Cust Editor去掉
- }
- }
-
- FallBack "VertexLit"
- //CustomEditor "StandardShaderGUI"
- }
看到编辑器原来的样子
然后搞了一大轮,才发现 .smoothness 居然是通过Smoothness Factor 控制的
就问你服不服
我这里假设你手上已经有Built-in Shader的源码
又假设你已经阅读前面两章,也又提到若想在Unity做一点点渲染,必须首先先学PBR
(Unity搞那么复杂,主要是为了跨平台,这个后面几章会再详细说,但明知道要跨平台,底层内核设计之差,真是前所未见,这么多年更是不思进取)
又又或者你大学学了vf Shader,有opengl的基础是指
那么,你才好往下看,因为都是写给自己或者学过的,踩过坑的人看的
fragment Shader渲染时用到的参数从哪里来呢?我们就知道关键在于在这个方法
FRAGMENT_SETUP(s)
直接看大神分析,在这里s == 0
- //在unitystanderuitils.cginc中,计算alpha对漫反射颜色造成的影响,
- o.diffColor = PreMultiplyAlpha (o.diffColor, alpha, o.oneMinusReflectivity, /*out*/ o.alpha);
- inline FragmentCommonData MetallicSetup (float4 i_tex)
- {
- //获取x金属度和y光滑度,定义在UnityStandardInput.cginc中
- half2 metallicGloss = MetallicGloss(i_tex.xy);
- half metallic = metallicGloss.x;
- half smoothness = metallicGloss.y; // this is 1 minus the square root of real roughness m.
-
-
- //....
- o.smoothness = smoothness;
- return o;
- }
如果今天再有人和我说Unity不是垃圾,这公司的市占率不是靠运气,我&……!%&¥&¥&@……!
前面2个文章说了,
你若想哪怕写一点点Shader,都必先学习一般的PBR(必须,否则会被Unity带晕),然后又得学习一整套Unity自定义的PBR(而不能踩到以前的坑,网上的很多学习参考资料,都是我们很多团队不得已只能自己干完了之后,发布到网上的)
Unity自定义PBR很有趣的一个地方就是把,很多其他程序员用的,gloss等价于smoothness,死活就是不用roughness,这下终于有解答了
他们是希望证明他们绝对没有抄袭其他公司,例如UnReal的资源吗?
这回真的是草履虫才看的明白,
请看Unity 对于自家,smoothness的封装:
- half2 MetallicGloss(float2 uv)
- {
- half2 mg;
-
- #ifdef _METALLICGLOSSMAP
- #ifdef _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
- mg.r = tex2D(_MetallicGlossMap, uv).r;
- mg.g = tex2D(_MainTex, uv).a;
- #else
- mg = tex2D(_MetallicGlossMap, uv).ra;
- #endif
- mg.g *= _GlossMapScale;
- #else
- mg.r = _Metallic;
- #ifdef _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
- mg.g = tex2D(_MainTex, uv).a * _GlossMapScale;
- #else
- mg.g = _Glossiness;
- #endif
- #endif
- return mg;
- }
你说,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年真还能见着。
渲染效果
搞了一大轮,三篇文章,终于。。。能渲染出一点点,积水的效果
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。