Vertex and Fragment Shader
Semantics語義詞:
定義:GPU工作時,數據通常暫存在寄存器,那么在Cg中,語義詞就指定了輸入/輸出數據和圖形硬件寄存器之間的映射關系。
原理:根據輸入語義,圖形處理器從某個寄存器取數據;然后再將處理好的數據,根據輸出語義,放到指定的寄存器。
?VS中綁定語義的輸出數據會傳遞到PS中綁定相同語義的輸入參數。
?語義只對VS和PS入口函數的輸入/輸出參數有意義,是VS/PS輸入輸出和寄存器之間的橋梁。
VS輸入語義詞:POSITION BLENDWEIGHT NORMAL TANGENT BINORMAL PSIZE BLENDINDICES TEXCOORD0-TEXCOORD7
VS輸出語義:POSITION PSIZE FOG COLOR0-COLOR1 TEXCOORD0-TEXCOORD7
?VS的輸出中必須包含POSITION語義變量,該值不能在PS中直接使用,它只被用于光柵化。
?VS的輸出中的自定義數據可以使用TEXCOORD系列的語義詞來表示。
PS輸入語義詞:除POSITION外,VS的輸出語義,也是VP的輸入語義
PS輸出語義:通常只有一個輸出COLOR,最終顏色值。
VS輸入參數的定義:
VS的輸入參數可以是通用類型appdata_base,也可以是自定義結構體,并在其中指定需要的參數。
[UnityGC.cginc]VS預定義輸入參數:
appdata_base:包含頂點的position、normal、one texture coordinate
appdata_tan:包含頂點的position、tangent、normal、one texture coordinate
appdata_full:包含頂點的position、tangent、normal、tow texture coordinate、color
自定義輸入結構示例:
Unity中,頂點只能包含以下這些數據,所以自定義輸入結構中的成員也必須在此范圍內(具體類型可以不一樣,比如fixed4 color):
float4 vertex/float3 normal/float4 texcoord/float4 texcoord1/float4 tangent/float4 color
注意:其中沒有副法向量binoraml,它可以通過noraml和tangent計算得出來,公式如下所示:
Cg訪問屬性定義:
Cg訪問Properties塊中定義的變量的方式:聲明同名并匹配類型的變量。
Color/Vector --> float4/half4/fixed4
Range/Float --> float/half/fixed
2D --> sampler2D
3D --> sampler3D
Cube --> samplerCUBE
可以看下面的例子:
屬性:
Cg變量:
fixed4 _MyColor; // low precision type is enough for colorsfloat4 _MyVector;float _MyFloat; sampler2D _MyTexture;samplerCUBE _MyCubemap shader中的Cg片段會被Unity編輯器編譯成low-level shader assembly,并被包含在生成的版本的data files里面。因為Cg片段需要被預編譯,所以不能在運行時動態創建Cg shader。
#pragma glsl_no_auto_normalization 當給移動平臺編譯GLSL時,不自動normalize法向量和切線向量。在IOS/Android平臺,noramls和tangents會在vertex shader中自動noramize。
#pragma exclude_renderers d3d11 xbox360 在DX11和Xbox360平臺上不渲染
常用預定義和Cg函數:
[Cg]采樣2dtexture: tex2D(_MainTex, i.texcoord0);
[Cg]frac函數:取小數部分
[Cg]any函數:輸入參數只要有其中一個不為0,則返回true
[Cg]saturate函數:如果小于0則返回0,如果大于1則返回1,否則返回原值
[Cg]語義詞VPOS表示像素的屏幕坐標,至少需要支持target 3.0。
[UnityCG.cginc]_ScreenParam表示屏幕的寬和高。
[UnityCG.cginc]ComputeScreenPos(MVP_pos)該函數返回像素的屏幕坐標,不需要target 3.0的支持。
一些代碼片段:
// 3D坐標轉換到2D Window坐標return mul(UNITY_MATRIX_MVP, v.vertex); // 計算像素的屏幕坐標 方法一 vertOut vert(appdata_base v) {vertOut o;o.pos = mul (UNITY_MATRIX_MVP, v.vertex);o.scrPos = ComputeScreenPos(o.pos);return o;// PS中轉化[0-1]:float2 wcoord = (i.scrPos.xy/i.scrPos.w); }// 計算像素的屏幕坐標 方法二 fixed4 frag(float4 sp:VPOS) : SV_Target {float2 wcoord = sp.xy/_ScreenParams.xy;...}// 判斷uv是否在[0-1]返回內,可用來做uv檢查if (any(saturate(i.uv) - i.uv))...?
轉載于:https://www.cnblogs.com/sifenkesi/p/4707991.html
總結
以上是生活随笔為你收集整理的Vertex and Fragment Shader的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BUUCTF misc 专题(77)间谍
- 下一篇: Ubuntu开启FTP服务方法(Ubun