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

     

  • 相关阅读:
    2-7.交集选择器
    2-6.并集选择器
    2-5.后代选择器
    python----字符串,反向编码与乱码记录
    python----输出1-100之和的方法
    python----基础之三元运算、文件操作
    python----基础之令人头疼的字符编码
    python----基础之可变、不可变数据类型、collections模块
    python----基础之数据类型(元祖,字典,集合)
    python----基础之变量的创建与id
  • 原文地址:https://www.cnblogs.com/JackSamuel/p/7252819.html
Copyright © 2011-2022 走看看