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

Standard Shader面板原来的样子

之前第一第二章,分别分享了,最普通,进阶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年真还能见着。

渲染效果

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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

avi9111

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值