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