【《Unity 2018 Shaders and Effects Cookbook》翻译提炼】(八)BlinnPhong模型和 Anisotropic 高光(可用于金属性,头发)

本文介绍了Unity中BlinnPhong和Anisotropic高光模型的实现原理与步骤,展示了如何创建自定义shader以控制镜面高光效果。BlinnPhong模型通过半矢量计算提高了效率,Anisotropic模型则模拟了表面方向性,适合于金属和拉丝表面。详细代码和实践效果在作者的GitHub上可找到。
摘要由CSDN通过智能技术生成

 这篇文章最好与前一篇连着看,自己可做比较。

1.BlinnPhong 模型

      Blinn是计算和估计镜面反射的另一种更有效的方法。这是通过从 视图方向和光方向获得半矢量来完成饿。JimBlinn将它带入来Cg的世界。他发现只获得半矢量而不是计算我们自己的反射 矢量效率更高。它减少了代码和处理时间。如果你实际查看UnityCG.cginc文件中包含的内置BlinnPhong光照模型,你会注意到它也使用来半矢量,因此它被命名为BlinnPhong,它只是完整的Phong的简单版本。

     a..创建一个shader命名为BlinnPhong。

     b.创建一个material命名为BlinnPhongMat。

     c.移走所以才当前属性,并在属性块中添加如下属性,这样我们就可以控制镜面高光的外观:

         _MainTint("Diffuse Tint",Color) = (1,1,1,1)
         _MainTex("Base (RGB)",2D) = "white" {}
         _SpecularColor("Specular Color",Color) = (1,1,1,1)
         _SpecPower("Specular Power",Range(0.1,60)) = 3

     d.并在CGPROGRAM中添加相关变量‘

        sampler2D _MainTex;
        float4 _MainTint;
        float4 _SpecularColor;
        float _SpecPower;

     e. 现在是时候创建我们自定义光照模型来处理我们的漫反射和高光计算。

      fixed4 LightingCustomBlinnPhong(SurfaceOutput s, fixed3 lightDir, half3 viewDir, fixed atten)
        {
            float NdotL = max(0, dot(s.Normal, lightDir));
            float3 halfVector = normalize(lightDir + viewDir);
            float NdotH = max(0, dot(s.Normal, halfVector));
            float spec = pow(NdotH, _SpecPower)  * _SpecularColor;
            float4 color;
            color.rgb = (s.Albedo * _LightColor0.rgb * NdotL) + (_LightColor0.rgb * _SpecularColor.rgb * spec) * atten;
            color.a = s.Alpha;
            return color;
        }

    h.更新surf函数如下表

     void surf(Input IN, inout SurfaceOutput o)
        {
            half4 c = tex2D(_MainTex, IN.uv_MainTex) * _MainTint;
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }

  i.为了完成我们的shader,我们需要通过使用以下代码修改 #pragma语句来告诉我们的CGPROGRAM块使用我们的自定义光照模型而不是内置模型:

       CPROGRAM

       #pragma surface surf CustomBlinnPhong

     

 源码如下:

Shader "Custom/BlinnPhong" {
	Properties {
		 _MainTint("Diffuse Tint",Color) = (1,1,1,1)
		 _MainTex("Base (RGB)",2D) = "white" {}
	     _SpecularColor("Specular Color",Color) = (1,1,1,1)
		 _SpecPower("Specular Power",Range(0.1,60)) = 3
	}
	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 200

		CGPROGRAM
		#pragma surface surf 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值