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

     

  • 相关阅读:
    微擎 关注发送推荐消息
    修改 processor.php 文件,监听用户对该应用的消息
    微擎返回图文信息
    微擎客服消息发送的函数
    mui 底部导航栏的实现
    两张表的关联查询
    微擎 截取字符串
    webStorm中NodeJs 没有智能提示
    OpenCV 实现自己的线性滤波器
    OpenCV 基本的阈值操作
  • 原文地址:https://www.cnblogs.com/JackSamuel/p/7252819.html
Copyright © 2011-2022 走看看