shader相關的面試題整理1


1  3維模型有那些組成

  mesh  和紋理

2   渲染管線

     1)頂點數據 
(2)幾何階段: 
頂點着色器→曲面細分着色器→幾何着色器→裁剪→屏幕映射(→傳遞數據給光柵化階段) 
(3)光柵化階段: (光柵化計算:顯示器實際顯示的圖像是由像素組成的,我們需要將上面生成的圖形上的點和線通過一定的算法轉換到相應的像素點。把一個矢量圖形轉換為一系列像素點的過程就稱為光柵化。例如,一條數學表示的斜線段,最終被轉化成階梯狀的連續像素點。 )
三角形設置→三角形遍歷→片元着色器→逐片元操作 
(4)屏幕圖像

 

 

 

shader實現半透明效果

Shader "Unlit/HalfTransparent"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
       _Scale("Scale",Range(0,1))=1
    }
    SubShader
    {
        Tags { "RenderType"="Transparent"  "Queue" = "Transparent" }
    

        Pass
        {
           ZWrite Off
           Blend SrcAlpha OneMinusSrcAlpha
           
           CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog
            #include "Lighting.cginc"
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            fixed _Scale;
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                
                return o;
            }
            
            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);
                // apply fog                
                return fixed4(col.rgb,col.a*_Scale);
            }
            ENDCG
        }
    }
}

核心點:   

         Tags(''RenderType''="Transparent" "Queue"="Transparent"}

          ZWrite Off 關掉深度寫入

          Blend ScrAlpha OneMinusScrAlpha   (Alpha混合   srcalpha:源透明值  oneminusalpha:1-源透明值    最終顏色 = 源顏色 * 源透明值 + 目標顏色*(1 - 源透明值))

          參考

4  前向渲染和后向渲染

    

在大多數情況下,我們可以通過Edit->Project Settings->Player->Other Settings->Rendering->Path中選擇需要渲染的路徑,默認是前向渲染路徑。
但是我們也可以在Camera中單獨設置這個攝像機的渲染路徑。

在Shader中,通過指定Pass中的LightMode標簽來實現:

Pass{
Tags { "LightMode" = "ForwardBase" }
 

前向渲染路徑
傳統且常見的渲染方式。
原理:
Unity將各種光照按逐頂點處理、逐像素處理、球諧函數SH等方法計算出並混合。至於怎么處理:
1. 最多有四個光源按逐頂點處理
2. 場景中最亮的平行光是逐像素處理的
3. 被設置成not important,會按逐頂點或SH處理
4. Important的會逐像素處理
5. 如果逐像素渲染的數量小於Quality Setting中的逐像素數量,則會有更多的光源進行逐像素處理

使用#pragma multi_compile_fwdbase這樣的編譯指令,可以讓Pass生成所有需要的Shader變種。

延遲渲染路徑
當場景之中包含大量光源的時候,前向渲染的性能會急速下降。所以需要延遲渲染。
延遲渲染使用了一個叫G-緩沖的緩沖區(G-Buffer)。
延遲渲染主要包含了兩個Pass
一、在Pass1中,不進行任何光照計算,而僅僅計算哪些片元是可見的,通過深度緩沖技術,如果發現可見,則把它的相關信息存儲到G-緩沖中。
二、在Pass2中,理由G-緩沖中的各種信息來進行真正的光照計算。

在Unity的延遲渲染中,每個光源都可以按照逐像素的方式進行處理,但也有缺點:
1. 不支持真正的抗鋸齒功能
2. 不能處理半透明物體
3. 對顯卡有一定要求

延遲渲染可以訪問的內置變量:
_LightColor float4類型 光源的顏色
_LightMatrix0 float4x4類型 世界空間到光源空間的變換矩陣。可以用於采樣cookie和光強衰減原理。

 

5.OpenGL中要用到哪幾種Buffer? 

(1)幀緩沖(Frame Buffer)
(2)顏色緩沖(Color Buffer)
(3)模板緩沖(Stencil Buffer)
(4)頂點緩沖(Vertice Buffer)
(5)深度緩沖(Depth Buffer)

 

7 Unity Shader 中的常用RenderType?

(1)Opaque: 用於大多數着色器(法線着色器、自發光着色器、反射着色器以及地形的着色器)。
(2)Transparent:用於半透明着色器(透明着色器、粒子着色器、字體着色器、地形額外通道的着色器)。
(3)TransparentCutout: 蒙皮透明着色器(Transparent Cutout,兩個通道的植被着色器)。
(4)Background: Skybox shaders. 天空盒着色器。
(5)Overlay: GUITexture, Halo, Flare shaders. 光暈着色器、閃光着色器。
(6)TreeOpaque: terrain engine tree bark. 地形引擎中的樹皮。
(7)TreeTransparentCutout: terrain engine tree leaves. 地形引擎中的樹葉。
(8)TreeBillboard: terrain engine billboarded trees. 地形引擎中的廣告牌樹。
(9)Grass: terrain engine grass. 地形引擎中的草。
(10)GrassBillboard: terrain engine billboarded grass. 地形引擎何中的廣告牌草。

8 MeshRender中material和sharedmaterial的區別

修改sharedMaterial將改變所有物體使用這個材質的外觀,並且也改變儲存在工程里的材質設置。不推薦修改由sharedMaterial返回的材質。如果你想修改渲染器的材質,使用material替代。

 

Unity的Shader中,Blend SrcAlpha OneMinusSrcAlpha這句話是什么意思?

作用就是Alpha混合。公式:最終顏色 = 源顏色 x 源透明值 + 目標顏色 x(1 - 源透明值)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM