渲染路徑之------前向渲染

  1. 前向渲染是最常用的一種渲染路徑,每次Draw的時候都要對一個物體都要進行進行一次(或者多次)光照計算,然后再對下一個物體進行光照計算。如果在Fragment shader中計算,這種計算量是很大的。
  2. 前向渲染在pass中要使用“LightMode”=“ForwardBase”等標簽。使用這個標簽后unity才能給內置的一些變量正確賦值。如_WorldSpaceLightPos0,_LightColor0等。在ForwardBase的Pass中會計算最重要的平行光、逐頂點/SH光源與LightMaps和環境光。
  3. 前向渲染路徑還有一種路徑為"ForwardAdd"路徑,包含此標簽的Pass會計算額外的逐像素光源,每個Pass對應一個光源。也就是說如果場景中有m個光源,那么就會執行對應的Pass m次,如果shader中沒有給對應的光源編寫Pass,則物體不會受這個光源的影響。
  4. 一個前向渲染實例:包含一個最重要的平行光,4個點光源。其中環境光,平行光在ForwardBase 的Pass中逐像素計算(frag中)(還可以計算光照貼圖等)。4個點光源(V5.6中設置為auto不好使,設置為Important)在ForwardAdd中逐像素計算,每個點光源執行一次ForwardAdd Pass。考慮了光源衰減因子,平行光不衰減,點光源采用unity中內置變量計算衰減,使用衰減紋理計算,避免了過多的距離平方開方計算等。
Shader "FFD/ForwardRenderingBasePass"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            Tags{"LightMode" = "ForwardBase"}
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_fwdbase //可以正確得到光源衰減等信息

            #include "UnityCG.cginc"
            #include "Lighting.cginc"
            #include "AutoLight.cginc"

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 pos : SV_POSITION;
                float3 worldNormal : NORMAL;
                SHADOW_COORDS(2)
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            
            v2f vert (appdata_base v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
                o.worldNormal = mul(v.normal,(float3x3)unity_WorldToObject);
                TRANSFER_SHADOW(o);
                return o;
            }
            
            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);

                float3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
                float3 worldNormal = normalize(i.worldNormal);

                fixed4 ambient = fixed4(UNITY_LIGHTMODEL_AMBIENT.xyz,1);
                fixed4 diffuse = fixed4(_LightColor0.xyz*saturate(dot(worldNormal,worldLightDir)),1);
                col = col*(ambient+diffuse);
                fixed shadow = SHADOW_ATTENUATION(i);
                col = shadow*col;
                return col;
            }
            ENDCG
        }


        Pass{
            Tags { "LightMode" = "ForwardAdd"}
            Blend One One
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_fwdadd   //可以正確得到光源衰減等信息

            #include "unitycg.cginc"
            #include "lighting.cginc"
            #include "autolight.cginc "

            struct v2f{
                float4 pos : SV_POSITION;
                float3 normalWorld : NORMAL;
                float4 posWorld : TEXCOORD0;
            };

            v2f vert(appdata_base IN)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(IN.vertex);
                o.normalWorld = mul(IN.normal,(float3x3)unity_WorldToObject);
                o.posWorld = mul(IN.vertex,unity_ObjectToWorld);
                return o;
            }
            fixed4 frag (v2f IN) : SV_Target
            {
                fixed atten;
                #ifdef USING_DIRECTIONAL_LIGHT
                    fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
                    atten = 1;
                #else
                    fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz - IN.posWorld.xyz);
                    float3 lightCoord = mul(unity_WorldToLight,IN.posWorld).xyz;
                    atten = tex2D(_LightTexture0,dot(lightCoord,lightCoord).rr).UNITY_ATTEN_CHANNEL;

                #endif
                fixed3 diffuse = _LightColor0.xyz * atten * saturate(dot(worldLightDir,normalize(IN.normalWorld)));
                return fixed4(diffuse,1);
            }
            ENDCG
        }
    }
    FallBack "Specular"
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,818評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,185評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,656評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,647評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,446評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,951評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,041評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,189評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,718評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,800評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,419評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,420評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,755評論 2 371

推薦閱讀更多精彩內容

  • 渲染路徑我理解就是一種渲染模式吧。因為現實的光照是很復雜的,計算機或說圖形引擎,只是用一種近似的方式來模擬,以便用...
    FindCrt閱讀 2,459評論 0 1
  • 一.標準光照模型OpenGL與Direct3D提供了幾乎相同的固定功能光照模型。什么是固定功能光照模型?在過去只有...
    karma085閱讀 3,649評論 0 2
  • 文|鐵爐 晴日陽光高空掛, 夕陽西下何處察。 久違見葵心中悶, 今朝有酒樂開牙。 ——EN...
    湘邵鐵爐閱讀 221評論 10 8
  • 當你和你的朋友在游戲中陣亡,而你們在此之前還沒有建立一個自己的小家,那么如何重新與彼此匯合呢? 首先,判斷你的周圍...
    方舟制片廠閱讀 272評論 0 0