Unity Shader入门教程反射光斑的实现
Posted 小江村儿的文杰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity Shader入门教程反射光斑的实现相关的知识,希望对你有一定的参考价值。
本节内容介绍PhongModel(也就是上文说的反射光的计算模型),采用的计算方法是BlinPhong(也即是用视线方向V+光源方向L的和,与N做点积,随后幂化得到高光反射系数)下图采用了csdn博文http://blog.csdn.net/u010133610/article/details/52206654中的一张插图。
第1.1步:新建shader和material,正如我前面的教程所说的那样。
第1.2步:代码如下:
▼代码开始 Shader "Custom/Learn2" { Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM #pragma surface surf PhongModel sampler2D _MainTex; struct Input { float2 uv_MainTex; }; fixed4 _Color; void surf (Input IN, inout SurfaceOutput o) { fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color; o.Albedo = c.rgb; o.Alpha = c.a; } inline float4 LightingPhongModel(SurfaceOutput s, float3 lightDir, half3 viewDir, half atten) { float4 col; //首先是漫反射系数,取法和入射光的近似程度(余弦值)作为系数 float diffuseF = max(0, dot(s.Normal, lightDir)); //H表示研究点指向光源的方向(lightDir) + 研究点指向眼镜的方向(viewDir),用H和法的近似程度的幂作为高光反射系数 float3 H = normalize(lightDir + viewDir); float specBase = max(0, dot(s.Normal, H)); float specF= pow(specBase, 900); //漫反射+镜面高光 模型 col.rgb = s.Albedo * _LightColor0 * diffuseF * atten +_LightColor0*specF; col.a = s.Alpha; return col; } ENDCG } FallBack "Diffuse" }
▲代码结束
第1.3步:应用一张纹理,然后查看效果:
以下记录了一些实验:
当上文中的900修改为以下值时对应的效果:
float specF= pow(specBase, 1);
float specF= pow(specBase, 10);
float specF= pow(specBase, 100);
float specF= pow(specBase, 1000);
float specF= pow(specBase, 10000);
——小江村儿的文杰 zouwj5@qq.com 2017年7月28日21:54:01
以上是关于Unity Shader入门教程反射光斑的实现的主要内容,如果未能解决你的问题,请参考以下文章
Unity shader实现水效果(折射,反射,波浪,1.菲尼尔,深度颜色)
Unity Shader ------ 高级纹理之立方体纹理及光线反射折射的实现