• 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

     

  • 相关阅读:
    使用TransactionScope实现事务
    CYQ.Data 框架系列
    MVP
    DYCOM用于开发网络应用程序的通信部分功能的快速开发
    架构师要了解
    Entity Framework资源
    Sina Blogs
    关于TransactionScope出错:“与基础事务管理器的通信失败”的解决方法总结
    在西方的程序员眼里,东方的程序员是什么样的?
    net2.0事务学习
  • 原文地址:https://www.cnblogs.com/JackSamuel/p/7252819.html
Copyright © 2020-2023  润新知