zoukankan      html  css  js  c++  java
  • [小明学Shader]3.自定义光照,半拉姆伯特

    • 一.Lambert

    在SubShader中的CG片段里,需要指定光照函数,一般为Lambert,即默认的拉姆伯特

    #pragma surface surf Lambert

    Lambert的函数是默认的,代码同下:

    inline float4 LightingBaseDiffuse(SurfaceOutput s,fixed3 LightDir,fixed atten){
                float lightDif=max(0,dot(s.Normal,LightDir));
                
                float4 col;
                col.rgb=s.Albedo*_LightColor0.rgb*(lightDif*atten*2);
                col.a=s.Alpha;
                
                return col;
            }

    其中BaseDiffuse是可以改的,如果我们将第一句的声明改为别的,那么与其对应的LightingXXX就是光照函数.

    • 二.HalfLambert

    半拉姆伯特是经典的一种光反射算法,用来防止图像过暗,代码如下

    Shader "Custom/11.26.1" {
        Properties {
            _MainTex ("Base (RGB)", 2D) = "white" {}
        }
        SubShader {
            Tags { "RenderType"="Opaque" }
            LOD 200
            
            CGPROGRAM
            #pragma surface surf HalfLamBert
    
            sampler2D _MainTex;
    
            struct Input {
                float2 uv_MainTex;
            };
    
            void surf (Input IN, inout SurfaceOutput o) {
                half4 c = tex2D (_MainTex, IN.uv_MainTex);
                o.Albedo = c.rgb;
                o.Alpha = c.a;
            }
            
            inline float4 LightingHalfLamBert(SurfaceOutput s,fixed3 lightDir,fixed atten){
                float difLight=max(0,dot(s.Normal,lightDir));
                difLight=0.5*difLight+0.5;
                
                float4 col;
                col.rgb=s.Albedo*_LightColor0.rgb*(difLight*atten*2);
                col.a=s.Alpha;
                
                return col;
            }
            ENDCG
        } 
        FallBack "Diffuse"
    }

    效果如图:

    偏亮的那个就是进行了增亮处理.

  • 相关阅读:
    自适应高度的 文本框
    点击小图片遮罩显示大图片
    C++中的声明与定义
    LeetCode_Bit Manipulation
    “纯”面向对象
    指针和引用
    new和delete用法小结
    C++中的变量属性小结
    C++的一些黑暗料理
    Python中的字典和集合
  • 原文地址:https://www.cnblogs.com/WongSiuming/p/4997420.html
Copyright © 2011-2022 走看看