zoukankan      html  css  js  c++  java
  • Unity shader学习之半兰伯特光照模型

    半兰伯特光照模型,为Valve公司在开发游戏《半条命》时提出的一种技术,用于解决漫反射光无法到达区域无任凭明暗变化,丢失模型细节表现的问题。

    其公式如下:

      Cdiffuse = Clight * mdiffuse * ( dot(n, l) * 0.5 +0.5 )

    通过这样的方式,将dot(n, l)的结果从[-1,1]映射到[0,1]的范围。

    转载请注明出处:http://www.cnblogs.com/jietian331/p/7083289.html

    shader如下:

    Shader "Custom/Diffuse HalfLambert"
    {
        Properties
        {
            _Diffuse ("Diffuse", Color) = (1,1,1,1)
        }
    
        SubShader
        {
            Tags { "RenderType"="Opaque" }
            LOD 100
    
            Pass
            {
                Tags { "LightMode"="ForwardBase" }        // 只有设置了正确的LightMode,才能访问一些Unity提供的内置变量,如:_LightColor0
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
    
                #include "UnityCG.cginc"
                #include "Lighting.cginc"
    
                struct appdata
                {
                    float4 vertex : POSITION;
                    float3 normal : NORMAL;
                };
    
                struct v2f
                {
                    float4 vertex : SV_POSITION;
                    fixed4 color : COLOR;
                };
    
                float4 _Diffuse;
    
                v2f vert (appdata v)
                {
                    v2f o;
                    o.vertex = UnityObjectToClipPos(v.vertex);
    
                    float3 lightDir = ObjSpaceLightDir(v.vertex);
                    lightDir = normalize(lightDir);
                    float halfLambert = dot(lightDir, v.normal) * 0.5 + 0.5;        // 将dot的结果从[-1,1]映射到[0,1]范围
                    float4 diffuseColor = _Diffuse * _LightColor0 * halfLambert;
    
                    o.color = UNITY_LIGHTMODEL_AMBIENT + diffuseColor;
                    return o;
                }
                
                fixed4 frag (v2f i) : SV_Target
                {
                    return i.color;
                }
                ENDCG
            }
        }
    
        Fallback "Diffuse"
    }

    效果如下:

    正面:

    背面:

  • 相关阅读:
    谷歌翻译python接口
    SRILM的安装方法
    语言模型srilm基本用法
    SRILM语言模型格式解读
    矩阵理解
    python生成器 协程
    python Queue模块使用
    scrapy 学习笔记2
    scrapy 学习笔记1
    xpath语法规则
  • 原文地址:https://www.cnblogs.com/jietian331/p/7083289.html
Copyright © 2011-2022 走看看