亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ShaderLab學習小結(十四)點光源問題

發布時間:2020-07-29 13:44:25 來源:網絡 閱讀:3970 作者:lreach 欄目:游戲開發

之前在“ShaderLab學習小結(三)漫反射+高光+點光源”中
用了Shade4PointLights()函數來計算點光源的反射。
這個函數定義在unitycg.cginc中,其中用到的前八個參數來自于UnityShaderVariables.cginc。
在這個例子中,只一個pass就實現了平行光、點光源反射,以及高光反射。

后來在學習中,接觸到另一種點光源反射的例子,用到兩個pass,第一個pass實現平行光的,第二個實現點光源的

Shader "Custom/TestLightColor0" {

    SubShader {
        pass{
        tags{"LightMode"="ForwardBase"}
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "unitycg.cginc"
            #include "lighting.cginc"
            struct v2f{
                float4 pos:POSITION;
                float3 normal:NORMAL;
                float3 wpos:TEXCOORD0;
            };
            v2f vert(appdata_base v)
            {
                v2f o;
                o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
                o.normal=UnityObjectToWorldNormal(v.normal);
                o.wpos=mul(unity_ObjectToWorld, v.vertex).xyz;
                return o;
            }
            fixed4 frag(v2f IN):COLOR
            {
                float3 N = IN.normal;
                float3 L = normalize(_WorldSpaceLightPos0).xyz;
                float ndotl=saturate(dot(N,L));
                fixed4 col=_LightColor0*ndotl;
                col+=UNITY_LIGHTMODEL_AMBIENT;
                return col;
            }
            ENDCG
        }
        pass{
            tags{"LightMode"="ForwardAdd"}
            blend one one
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "unitycg.cginc"
            #include "lighting.cginc"
            struct v2f{
                float4 pos:POSITION;
                float3 normal:NORMAL;
                float3 wpos:TEXCOORD0;
            };
            v2f vert(appdata_tan v)
            {
                v2f o;
                o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
                o.normal=UnityObjectToWorldNormal(v.normal);
                o.wpos=mul(unity_ObjectToWorld, v.vertex).xyz;
                return o;
            }
            fixed4 frag(v2f IN):COLOR
            {
                float3 N = IN.normal;
                float3 L = normalize(_WorldSpaceLightPos0).xyz;
                float ndotl=saturate(dot(N,L));
                float atten=1;
                if(_WorldSpaceLightPos0.w!=0)
                {
                    atten = 1.0/length(_WorldSpaceLightPos0.xyz);
                }

                fixed4 col=_LightColor0*ndotl*atten;
                return col;
            }
            ENDCG
        }
    }
}

兩個pass幾乎一樣,叫pass1和pass2吧。pass1是forwardbase,pass2是forwardadd,pass2還要用上blend one one,不然pass1的光照就沒了,因為pass1中加了環境光LIGHT_MODEL_AMBIENT,pass2中就不用再加了。
共同點,都用的是_LightColor0。之前學習時,認為_LightColor0就是指的平行光,所以點光源要用Shade4PointLights,但現在看來并不是。在網上搜索的結果之一:
LightMode=ForwardBase: _LightColor0將會是主要的directional light的顏色。
LightMode=ForwardAdd: _LightColor0將是該逐像素光源的顏色。
也就是說在lightmode為forwardadd的pass里,_LightColor0代表不同的光源
pass2中多定義了一個衰減系數atten,且進行判斷賦值

float atten=1;
if(_WorldSpaceLightPos0.w!=0)
{
    atten = 1.0/length(_WorldSpaceLightPos0.xyz);
}

點光源和平行光不同,與物體距離不同反射的強度也不同,所以這個顏色要乘一個衰減系數。

fixed4 col=_LightColor0*ndotl*atten;

當然這個只是簡單寫的一個衰減系數
這個衰減系數的計算算是抄來的吧,稍做修改
原出處用的是

atten = 1.0/length(IN.LightDir);

顯然這個LightDir是在結構體中要定義,float3型

float3 LightDir:TEXCOORD1;

代表光的方向,且在頂點程序中要轉化到切線空間

v2f vert(appdata_tan v)
{
    ...
    TANGENT_SPACE_ROTATION;
    o.LightDir=mul(rotation, ObjSpaceLightDir(v.vertex));
    ...
}

也就是計算衰減系數時,length()函數中的參數,我為了更加簡化,直接用了_WorldSpaceLightPos0.xyz,就省去了上面那一堆。

最后結果如下兩圖,點光源為×××
ShaderLab學習小結(十四)點光源問題
ShaderLab學習小結(十四)點光源問題
把兩個球體放在同一個位置,分別單獨顯示
上邊的是兩個通道出來的,下邊的是一個通道Shade4PointLights出來的
兩個球體都反射了平行光和點光源,看上去兩個的漫反射的效果基本一樣
下面的球體暗部邊緣處更黑一些
注:本例只做漫反射

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

香港| 卓尼县| 吉林省| 崇义县| 汕头市| 准格尔旗| 上杭县| 喀喇沁旗| 松滋市| 芮城县| 四平市| 盐池县| 梅州市| 涞水县| 金阳县| 略阳县| 枣强县| 留坝县| 石林| 孝昌县| 弥勒县| 大名县| 长垣县| 江孜县| 友谊县| 南投市| 育儿| 栾川县| 河池市| 贡觉县| 寻乌县| 诏安县| 颍上县| 神池县| 乌兰浩特市| 滁州市| 克什克腾旗| 凌海市| 黎城县| 台江县| 额尔古纳市|