zoukankan      html  css  js  c++  java
  • Unity Shader入门教程(四)反射光斑的实现

    本节内容介绍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

     

  • 相关阅读:
    科学-化学:化学百科
    科学-物理:物理学 (自然科学学科)百科
    科学-建筑学-建筑美学:建筑美学百科
    科学-建筑学:建筑学百科
    科学-哲学-美学:美学(中国哲学二级学科)
    哲学:哲学(世界观学说、社会形态之一)
    科学-语文:语文(语言和文学的简称)
    科学-分析:分析
    建模:数学建模
    科学-数学:数学
  • 原文地址:https://www.cnblogs.com/JackSamuel/p/7252819.html
Copyright © 2011-2022 走看看