码迷,mamicode.com
首页 > 编程语言 > 详细

Unity Shader入门教程(四)反射光斑的实现

时间:2017-07-28 23:43:37      阅读:621      评论:0      收藏:0      [点我收藏+]

标签:结束   hal   diffuse   article   main   ret   ceo   png   ref   

本节内容介绍PhongModel(也就是上文说的反射光的计算模型),采用的计算方法是BlinPhong(也即是用视线方向V+光源方向L的和,与N做点积,随后幂化得到高光反射系数)下图采用了csdn博文http://blog.csdn.net/u010133610/article/details/52206654中的一张插图。

技术分享

1.1步:新建shadermaterial,正如我前面的教程所说的那样。

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 201772821:54:01

 

Unity Shader入门教程(四)反射光斑的实现

标签:结束   hal   diffuse   article   main   ret   ceo   png   ref   

原文地址:http://www.cnblogs.com/JackSamuel/p/7252819.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!