Unity Shaders and Effects

https://www.baidu.com/link?url=o85V5QLsraCjMOmzJc6081Z3bsQRw4_hjoPki5igyrvrJExygnt2Ex-_oGmH60-wm2VU53AsKInafwE2Z7NCB_&wd=&eqid=f46be4f400050577000000065d31d21e  //shader學習鏈接

3D紋理:

   只能腳本創建 opengl 3.0及以上才支持。

file:///D:/Unity5.6.6/Editor/Data/Documentation/en/Manual/SL-Material.html  //unity APL

shader 1.0    燈光調節公式: 

Ambient * Lighting Window’s Ambient Intensity setting + (Light Color * Diffuse + Light Color * Specular) + Emission

Ambient : 環境光    Specular  鏡面反射    Emission: 自發光

SeparateSpecular  鏡面照明不受紋理的影響。只有在使用照明時纔有效果

 Lighting Window’s Ambient Intensity setting : 

 

進度條: 

矩陣旋轉註意事項  :

使用旋轉後的UV進行紋理採樣。

1. 物體平移到原點,否則會繞着原點旋轉,應該移動到物體中心點,再進行旋轉。

2.發生旋轉

3.再把物體平移到原點的位置

例如: 要做一個旋轉的進度圈。

讓uv座標繞z軸進行旋轉。

繞z軸旋轉得旋轉矩陣。

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
//加到Image
Shader "Custom/Loading"
{
	Properties
	{
		_MainTex ("Texture", 2D) = "white" {}
		_Speed ("Speed ",float) = 2
	}
	SubShader
	{
		// No culling or depth
	//Cull Off ZWrite Off 
	
	ZTest Always
	  Blend SrcAlpha OneMinusSrcAlpha

		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			
			#include "UnityCG.cginc"

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

			struct v2f
			{
				float2 uv : TEXCOORD0;
				float4 vertex : SV_POSITION;
			};
			float  _Speed ;
			v2f vert (appdata v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.uv = v.uv;
				return o;
			}
			
			sampler2D _MainTex;	            

			fixed4 frag (v2f i) : SV_Target
			{

			    float2 tmpUV = i.uv ;

				//先把UV中心點移動到原點
				tmpUV  -= float2(0.5,0.5) ;
				//把四個中心點到頂點的距離(即<0.5f)>得改爲0.5f,避免取到圓圈頂點之外得點
				if(length(tmpUV)>0.5)
				{
				    return fixed4(0,0,0,0)  ;
				}
				float2  finalUV = 0 ;
				float  angle = _Time.x*_Speed ;
				finalUV.x = tmpUV.x* cos(angle) -tmpUV.y*sin (angle)  ;
				finalUV.y =  tmpUV.x *sin(angle) + tmpUV.y *cos(angle);
				//又移回去
				finalUV += float2(0.5 ,0.5) ;
				fixed4 col = tex2D(_MainTex, finalUV);
				return col;
			}
			ENDCG
		}
	}
}

描邊:

方式一:渲染兩次,兩個pass,一個大一個小。

方式二:找到邊緣

模糊:

獲取場景渲染結束的最後一張圖片:  對一個像素周圍的四個點求一個平均。即對一個UV

Alpha測試:

shader1.0 

 因爲沒有采樣函數,所以用過Alpha測試來做

 應用:可以做圖片的漸變消失

shader2.0

因爲G-Buffer中沒有像素點,所以直接顯示的黑色。所以要使用Blend命令。

 

5. 模板測試:Stencil

 5.1 作用: 

   一般用作每個像素掩碼,來保存或者丟棄像素的作用。

   0-255整數的8位掩碼,

   Comp: 引用值與緩衝區當前內容進行比較的函數。

   Pass:模板測試和深度測試都通過了。默認:保持。

   Fail: 模板測試未通過該如何處理緩衝區的內容。默認:保持。

   ZFail: 模具測試通過,但是深度測試失敗,該如何處理緩衝區的內容。默認:保持。

   以上操作也可以使用和正面幾何圖形。

   Comparison  Operation:>   >=    <  <=   ==   !=   模板測試總是通過    模板測試從不通過 

   

   Stencil Operation: 

    

 

 

ShaderLab: Stencil     file:///D:/unity2018insatll/Editor/Data/Documentation/en/Manual/SL-Stencil.html 

符合條件的通過寫入到G-Buffer中,不符合的丟棄。

G-Buffer中包含: RGBA    深度信息   模板信息

公式:輸入的值和G-Buffer中的模板值做比較。

應用: 牆穿透效果:

     Stencil {
                Ref 2   //設置模板值等於2 
                Comp always  //使模具測試始終通過。
                Pass replace
            }

<1. 設置前邊物體,並且關閉深度緩存,防止前邊物體擋住back物體。

<2. 設置中間物體,如果不等於2,則顯示出來。否則丟棄掉像素。即被前邊物體遮擋的區域就透明掉了。

<3. 設置後邊物體, 如果和2相等時,則顯示出來。

 

深度測試:

深度: 物體位置到相機水平線的投影。

深度緩存:新的像素和深度緩存中的深度做對比,如果小於深度緩存中的深度,則替換RGBA像素,且替換深度緩存中的深度值。

深度測試: ZWrite  : 將要渲染的物體的Z值和G-buffer中的深度緩存值進行對比。

深度相同時,可以通過調整Offset來微調。強迫一個多邊形在另一個上繪製,儘管它們實際上處於相同的位置.

 

Blend: 

 

 

 

 

 

 

 

 

 

 

https://www.baidu.com/link?url=o85V5QLsraCjMOmzJc6081Z3bsQRw4_hjoPki5igyrvrJExygnt2Ex-_oGmH60-wm2VU53AsKInafwE2Z7NCB_&wd=&eqid=f46be4f400050577000000065d31d21e

Texture Type

選擇適合的類型,Unity會爲Unity Shader傳遞正確的紋理,並對一些紋理進行優化。

Defualt(默認紋理)

 

Normal map(法線紋理)

 

使用了法線紋理類型,Unity會根據不同平臺對紋理進行壓縮,如DXT5nm格式,通過UnpackNormal函數進行採樣,見下面UnityCG.cginc中源碼。這種壓縮只用兩個通道(原來三個),減少法線紋理佔用的內存空間。

inline fixed3 UnpackNormalDXT5nm (fixed4 packednormal)
{
    fixed3 normal;
    normal.xy = packednormal.wy * 2 - 1;
    normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));
    return normal;
}
inline fixed3 UnpackNormal(fixed4 packednormal)
{
#if defined(UNITY_NO_DXT5nm)
    return packednormal.xyz * 2 - 1;
#else
    return UnpackNormalDXT5nm(packednormal);
#endif
}

 

Create from Grayscale

 

用於高度圖生成法線紋理。這樣就可以和切線空間下的法線紋理同等對待了。

- Bumpiness:控制凹凸程度

- Filtering:決定凹凸程度計算方式

- Smooth:生成平滑的法線紋理

- Sharp:使用Sobel濾波(一種邊緣檢測使用的濾波器)生成法線紋理

 

WrapMode

決定紋理座標超過[0, 1]範圍後將會被如何平鋪(Tiling)。

 

  • Repeat:如果紋理座標超過1(同理小於0)時,整數部分會被捨棄,如值爲2.23採樣值等於0.23。
  • Clamp:如果紋理座標超過1(同理小於0)時,會截取到1(或0)。

 

漸變紋理應該選擇Clamp(下右圖)。因爲Repeat(下左圖)可能產生如下錯誤,大於1的值如1.01會採樣爲0.01,爲黑色。

 

FilterMode

決定紋理拉伸時採樣哪種濾波模式。

 

Point、Bilinear、Trilinear  最鄰近插值法、雙線性插值以及雙三線性插值對比如下,效果依次提升,性能消耗同樣增大。

圖像插值就是當圖像進行放大/縮小時,圖像原有的像素數量不足以滿足需求,例如從3X3的像素矩陣往4X4的像素矩陣變換的時候,就會出現像素值不知該如何填充的問題,而圖像插值算法就是爲了解決這個問題。

 

  • Point:最鄰近濾波,縮放是採樣像素數目只有一個。當紋理的大小與貼圖的三維圖形的大小差不多時,這種方法非常有效和快捷。如果大小不同,紋理就需要進行放大或縮小,這樣,結果就會變得矮胖、變形或模糊。
  • Bilinear:使用線性濾波,找到四個近鄰像素,然後進行線性插值混合得到,圖像模糊了。

    雙線性過濾以pixel對應的紋理座標爲中心,採該紋理座標周圍4個texel的像素,再取平均,以平均值作爲採樣值。

    雙線性過濾像素之間的過渡更加平滑,但是它只作用於一個MipMap Level,它選取texel和pixel之間大小最接近的那一層MipMap進行採樣。當和pixel大小匹配的texel大小在兩層Mipmap level之間時,雙線性過濾在有些情況效果就不太好。於是就有了三線性過濾。

  • Trilinear:幾乎和Bilinear一樣,只是如果開啓多級漸遠紋理技術,那就會在多級漸遠紋理之間進行混合。

    三線性過濾以雙線性過濾爲基礎。會對pixel大小與texel大小最接近的兩層Mipmap level分別進行雙線性過濾,然後再對兩層得到的結果進生線性插值。

    三線性過濾在一般情況下效果非常理想了。但是到目前爲止,我們均是假設是texture投射到屏幕空間是各向同性的。但是當各向異性的情況時,效果仍然不理想,於是產生了Anisotropic Filtering(各向異性過濾)。

多級漸遠紋理(mipmapping)

面板中Advanced->Generate Mip Maps默認開啓。原理是提前用濾波處理得到更小的圖形,每一層都是上一層圖像降採樣得到,以此類推,形成一個圖像金字塔。在物體遠離攝像機時,直接使用較小的紋理。缺點是通常會多佔用33%的內存空間。

 

 

 

https://blog.csdn.net/candycat1992/article/details/17097907   【Unity Shaders】概述及Diffuse Shading介紹】

https://blog.csdn.net/candycat1992/article/details/39994049   初探Surface Shader背後的機制

第一章 漫反射

1.5 自定義漫反射

如果 你想在着色器代碼裏通過變量名來獲得它的屬性值,則必須創建與之對應的另一個變量。
 #pragma surface   告訴編輯器使用哪個光照模型計算。

三種格式的光照模型函數:命名 Lighting+任何名字

● half4 LightingName (SurfaceOutput s, half3 lightDir, half atten){} 該函數用於不需要視角方向的前向着色。

● half4 LightingName (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten){} 該函數用於需要視角方向的前向着色。

● half4 LightingName_PrePass (SurfaceOutput s, half4 light){} 該函數用於需要使用延遲着色的項目

1.6 創建 Half Lambert 光照模型

Half Lambert  : 用於在低光照區域照亮 物體的技術。它基本上提高了材質和物體表面周圍的漫反射光照。用來防止某個物體的背光面 丟失形狀並且顯得太過平面化。沒有物理原理,只是爲了視覺增強。

左:半蘭伯特模型  右:普通漫反射

Half Lambert 技術實現的原理:

    把漫反射光照值的範圍分成兩半,然後加上0.5。基本 意思就是如果光照值是1,對半開後就是 0.5,然後再加 0.5 回去,將會再得到 1。如果你對 0 進行操作,那麼你會得到 0.5,因此我們將 0 ~ 1 之間的所有值重新映射到區間 0.5 ~ 1。 

1.7 創建漸變紋理來控制漫反射着色

—使用漸變紋理(ramp texture)來控 制漫反射光照的顏色。這允許你突出表面的顏色,來模擬更多的反射光照或者其他高級的 燈光設置.想要突出藝術畫面,不需要真實物理模擬時使用。

tex2D 函數有兩個參數,第一個參數是我們使用的紋理,第二個參數包含的是映射紋理的 UV 座標。 ,tex2D 函數會去搜索(0,0)UV座標處的紋理像素。

1.8 使用 2D 漸變紋理創建假的 BRDF

由光照函數BRDF【雙向反射分佈函數】提供的視角方向,觀察方向指的是我們看向物體自身的方向。它是一個標註了方向的向量,這意味着我們可以將它和法線以及光照方向結合起來使用。這種視點向量可以爲我們提供一種更先進 的紋理索引技術。 

【雙向反射分佈函數】可以簡單理解爲入射光在不透明物體表面同時反射到觀察方向 (觀察者眼睛方向)和出射光兩個方向。

當使用觀察方向參數時,我們可以創建一個簡單的衰減渲染效果。你可以使用這個參 數來製作任何不同類型的效果:一個透明的泡泡、邊緣高光效果、盾牌效果,甚至可以制 作卡通邊緣線效果。

 

使用紋理貼圖製作特效

PC上都是按照最高精度float來計算,而在移動平臺。fixed在比較舊的移動平臺用,大多數都是把half和fixed當成同精度來處理。

注意: shader中的語法錯誤,定位行是40行,其錯誤可能在39行引起的下一行錯誤。

 

插值:

lerp(a,b,f)=(1-f )* a + b * f  ;

f的取值範圍是【0-1】。當f=1時,直接放回b, 當f=0時返回a , f=0.5時,返回(a+b)平均數。

返回的這個數是一個定值,應用時需要把上一次插值的結果作爲下一次插值的a.

//transform.position = Vector3.Lerp(transform.position, end, 0.5f);
//Debug.Log(transform.position + "   " + start + "      " + end);

 

2.4 壓縮和混合紋理貼圖

  原理是:利用插值從一個紋理圖片插值到另一個紋理插值,使用第三張貼圖的r來作爲影響參數。

2.5  法線貼圖

   用途: 它是用來在不增加額外多邊形的情況下 添加更多的細節。該技術的一個常見用途是通過一個高多邊形模型或高度圖形成法線貼圖, 這樣就顯著地提高了低多邊形模型的表現效果以及細節。 

UnpackNormals() 函數(法線解壓函數)來使用法線貼圖

2.6  創建程序紋理貼圖
   概念:需要動態創建紋理或者在運行時修改它們的像素 值,這種情況通常被稱爲程序性的紋理效果。

   創建流程: 需要在一個二維空間中創建一組像素然後將其應用到一個新的紋理上。再將創建 的新紋理傳入到着色器中,使它們可以在着色器中進行計算。

   應用:使用動態創建紋理貼圖的 方式可以製造一種玩家和遊戲環境之間的互動效果。也可以用它來製作一些貼花的效果, 或者創建一些可以在着色器函數中使用的程序化形狀等。

2.7 Photoshop 色階效果

色階是表示圖像亮度強弱的指數標準。

實現原理:


Shader "Custom/ColorStage" {
	Properties {
		_MainTex ("Albedo (RGB)", 2D) = "white" {}
		_inBlack("Input Black",Range(0,255)) = 0
		_inGamma("Input Gamma",Range(0,2)) = 1.61
		_inWhite("Input White",Range(0,255)) = 255
		_outWhite("Out White",Range(0,255)) = 255
		_outBlack("Out Black",Range(0,255)) = 0

	}
		SubShader{
			Tags { "RenderType" = "Opaque" }
			LOD 200

			CGPROGRAM
#pragma surface surf Lambert

		float _inBlack;
		float _inGamma;
		float _inWhite;
		float _outWhite;
		float _outBlack;

		float outRPixel;  //存儲紅色通道

		sampler2D _MainTex;

		struct Input {
			float2 uv_MainTex;
		};

		float GetPixelLevel(float pixelColor)
		{
			float pixelResult;
			// 因爲tex2D() 函數所提供的顏色值範圍是從0 到 1,所以我們需要將其重新映射至 0.0 到 255.0 的範圍內
			pixelResult = (pixelColor * 255.0);
			//. 然後減去我們的輸入值_inBlack,這樣當我們將輸入色階的黑色滑塊朝着255.0 滑動 時可以使所有像素變得更暗。
			pixelResult = max(0, pixelResult - _inBlack);
			//然後,當我們將輸入色階的白色滑塊朝着0.0 滑動時,可以將所有像素變得更亮,並 對得到的結果求 _inGamma 次方
			pixelResult = saturate(pow(pixelResult / (_inWhite - _inBlack), _inGamma));
			// 最後,我們將新的像素值與_outWhite 減去_outBlack 的差相乘,然後將新的像素值 重新映射到 0.0 ~ 1.0 的範圍內:
			//我們使用_outWhite 和 _outBlack 再次修改像素值,這樣你就可以對最小像素值 以及最大像素值有一個最終的全局控制了。
			pixelResult = (pixelResult * (_outWhite - _outBlack) + _outBlack) / 255.0;
			return pixelResult;
		}

		void surf (Input IN, inout SurfaceOutput o)
		{
			half4 c = tex2D(_MainTex, IN.uv_MainTex);

			float outRPixel = GetPixelLevel(c.r);
			float outGPixel = GetPixelLevel(c.g);
			float outBPixel = GetPixelLevel(c.b);

			o.Albedo = float3(outRPixel, outGPixel, outBPixel);
			o.Alpha = c.a;
		}
		ENDCG
	}
	FallBack "Diffuse"
}

第 3 章 利用鏡面反射讓遊戲閃耀起來

UnityCG.cginc 文件有Lambert 和 BlinnPhong 兩種光照模型可以使用。

 #pragma surface surf BlinnPhong 編譯着色器 的時候,你就會告訴着色器使用UnityCG.cginc 文件中的BlinnPhong 光照函數。

#pragma surface surf Lambert.... 實現前邊已經說過了。

3.3 創建Phong高光模型:

高光着色器:

告訴編輯器我們創建一個自定義的視點相關性着色器。注意和申明的語句一致。

 

 

 

第6章   透明度

6.2 使用Alpha參數創建透明效果

  修改表面着色器的#pragma語句的參數:

  用來告訴unity允許一個透明表面渲染到屏幕上,可以爲內置的值賦值。 o.Alpha = c.b * _MyTransVal;

   

修改表面着色器的輸出輸出參數:標準的輸入輸出參數改爲普通的輸入輸出

6.3 透明度裁剪着色器

使用一個值來簡單的控制某些特定的像素不渲染到屏幕上,因此可以實現一個完全透明和不透明混合的着色器。網易觀點:裁剪普遍情況下比半透耗。

Shader "91YGame/TransparentCutoff" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
        //申明_Cutoff變量;
        _Cutoff("Cutoff Value",Range(0.01,1))=0.5
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200
        
        //告訴着色器 我們需要的是一個裁剪類型的着色器;
        CGPROGRAM
        #pragma surface surf Lambert alphatest:_Cutoff

        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.r;
        }
        ENDCG
    } 
    FallBack "Diffuse"
}

透明度混合Blend:

    將片段着色器中計算出來的顏色稱之爲 “源顏色”,幀緩存中對應的像素已經存在的顏色叫做“目標顏色”。混合操作就是將源顏色與目標顏色以一些選項進行結合。

通用公式 float4 result = SrcFactor * fragment_output + DstFactor * pixel_color;

        Blend SrcAlpha OneMinusSrcAlpha        //alpha blending
        Blend One OneMinusSrcAlpha             //premultiplied alpha blending
        Blend One One                          //additive
        Blend SrcAlpha One                     //additive blending
        Blend OneMinusDstColor One             //soft additive
        Blend DstColor    Zero                 //multiplicative
        Blend DstColor SrcColor                //2x multiplicative
        Blend Zero SrcAlpha                    //multiplicative blending for attenuation by the fragment's alpha

(r,g,b) * a = (r*a , g*a , b*a)
(r,g,b) * (x,y,z) = (r*x , g*y , b*z)
(r,g,b) + (x,y,z) = (r+x , g+y , b+z)
(r,g,b) - (x,y,z)  = (r-x , g-y , b-z)

混合操作的基本語法: Blend SrcFactor DstFactor

例如:

 

根據通用公式:下圖

Blend SrcAlpha One  

//源顏色(輸出顏色) * 源透明值+目標因子(One) * 目標顏色(幀緩存中的顏色,一般是背景顏色)   

《==》 (1,0,0)*1+(1,1,1)(0,0,0)=(0.5,0.5,0.5)  

《shader入門精要》

Blend SrcFactor DstFactor:  稍微解釋一下,這行指令意思就是將本 Shader 計算出的顏色值(源顏色值,即藍色) * 源Alpha值(0.6) + 目標顏色值(可以理解爲背景色) * (1-0.6),從而讓藍色方塊展示出了40%的透明度。

 

 

6.4  通過渲染隊列進行深度排序

https://blog.csdn.net/puppet_master/article/details/73478905   //學習鏈接

深度排序: 物體被渲染的先後順序。利用層級方法來渲染你的物體,也就是利用Unity提供的內置標籤。

渲染順序: 其實前後無所謂的,因爲即使是先渲染人模,再渲染柵欄,遮擋部分深度測試成功也會替代人模的部分,這樣會造成OverDraw,所以Unity對於不透明物體一般採用從前向後的順序,把遮擋的部分不用替代了。

初始:

  

給前邊加上shader,設置成先渲染

Shader "Custom/Depth" { 
    Properties { 
        _MainTex ("Base (RGB)", 2D) = "white" {} 
    } 
    SubShader { 
        Tags { "Queue"="Geometry-20" } //設置渲染順序,Geometry爲2000,-20表示在所有幾何體後面顯示
        ZWrite Off                     //告訴Unity我們想自己控制該對象的渲染順序,而不寫到深度緩衝中,我們想要重寫對象的深度排序,並且我們將會爲它指定一個新的渲染隊列
        LOD 200  
        CGPROGRAM 
        #pragma surface surf Lambert  
        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; 
        } 
        ENDCG 
    }  
    FallBack "Diffuse" 
}

Pass通道:

之前的shader中都只有一個Pass,也就是單通道渲染,這樣的話如果要對同一個RenderTexture在不同的時刻進行不同的渲染效果輸出就需要不停的更換shader。

所有需要Pass,根據需求設定通過哪個Pass來進行渲染,從而實現在不同的時候對使用同一個shader對同一個對象進行不同的效果處理。

物體邊緣:

光向量和法向量求點積,得到的是光線的強度,即光線入眼的多少

攝像機看到這個物體,物體的頂點法線和攝像機視角夾角是90度,越暗,用點積來達到這種類似於邊緣查找的效果。

點積的結果越大,越暗, 即法向量和視向量>90度,則越暗。1減去結果作爲係數乘以一個邊緣光顏色就達到了邊緣光的效果。

缺陷:邊緣光效果只是在當前模型本身的光照計算時調整了邊緣位置的顏色值,並沒有達到真正的“描邊”

描邊 : 邊緣泛光shader 2

描邊效果:https://blog.csdn.net/puppet_master/article/details/54000951

一般都是在正常模型的渲染狀態下,在模型外面擴展出一個描邊的效果。既然要讓模型的形狀有所改變(向外拓一點),那麼肯定就和vertex shader有關係了。而我們的描邊效果,肯定就是要讓模型更“胖”一點,能夠把我們原來的大小包裹住;微觀一點來看,一個面,如果我們讓它向外拓展,而我們指的外,也就是這個面的法線所指向的方向,那麼就讓這個面朝着法線的方向平移一點;再微觀一點來看,對於頂點來說,也就是我們的vertex shader真正要寫的內容了,我們正常計算頂點的時候,傳入的vertex會經過MVP變換,最終傳遞給fragment shader,那麼我們就可以在這一步讓頂點沿着法線的方向稍微平移一些。我們在描邊後,描邊這一次渲染的邊緣其實是沒有辦法和我們正常的模型進行區分的,爲了解決這個問題,就需要用兩個Pass來渲染,第一個Pass渲染描邊的效果,進行外拓,而第二個Pass進行原本效果的渲染,這樣,後面顯示的就是稍微“胖”一點的模型,然後正常的模型貼在上面,把中間的部分擋住,邊緣擋不住就露出了描邊的部分了。
 

第7章  頂點魔法

1. 頂點信息基本應用------提取存儲的頂點信息

 

2. 頂點信息進階應用,頂點信息的應用

.

 

第8章   移動平臺上着色器的優化

https://www.cnblogs.com/jaffhan/p/7358383.html

8.2 輕型着色器

1.用最少的數據達到相同的效果   

 <1 .計算精度優化。

 float(32bits)half(16bits)fixed(11bits)

  • 對於世界空間位置和紋理座標,使用float精度。 
  • 對於其他一切(矢量,HDR顏色、UV、顏色值等),首先使用half精度,必要時增加精度。 +-60000
  • 對於紋理數據的非常簡單的操作,使用fixed精度。光照、顏色  +-2

  應該使用哪種數據精度取決於平臺和GPU::

  • 所有現代桌面級GPU總是以完全float精度進行計算,float/half/fixed在底層是完全相同的。因此在Unity編輯器中(即使切換爲移動平臺),難以確定半/固定精度是否足夠,因此請始終在目標設備上測試着色器以獲得準確的結果
  • 移動GPU具有實際half精度支持。通常更快,並且使用更少的功率來進行計算。
  • Fixed精度通常僅對較舊的移動GPU有效。fixed內部處理成和half精度完全一樣。 

<2 .把沒用到的輸入變量刪掉

<3. 通過設置燈光的渲染模式  自動選擇  逐像素渲染物體  逐頂點渲染物體

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章