Unity Shader Lab - HLSL

著色器中的參數(shù)

從應(yīng)用階段傳遞模型數(shù)據(jù)給頂點(diǎn)著色器時(shí) 常用的語義

命令? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?實(shí)例? ? ? ? ? ? ? ? ? ? ? ? ?說明

POSITION? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?模型空間中的頂點(diǎn)位置,一般是float4類型

NORMAL? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?頂點(diǎn)法線,float3類型

TANGENT? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?頂點(diǎn)切線 float4

TEXCOORD0~N? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?該頂點(diǎn)紋理坐標(biāo),0是第一組,一般是flkoat2 或float4類型

COLOR? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?頂點(diǎn)顏色,通常是fixed4或float4類型



unity 內(nèi)置的矩陣變換

命令? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 說明

UNITY_MATRIX_MVP? ? ? ? ?當(dāng)前的模型觀察投影矩陣,用于將頂點(diǎn)/方向矢量從模型空間變換到裁剪空間

UNITY_MATRIX_MV? ? ? ? ? ? 當(dāng)前的模型觀察矩陣,用于將頂點(diǎn)/方向矢量從模型空間變換到觀察空間

UNITY_MATRIX_V? ? ? ? ? ? ? ?當(dāng)前的觀察矩陣,用于將頂點(diǎn)/方向矢量從世界空間變換到觀察空間

UNITY_MATRIX_P? ? ? ? ? ? ? ?當(dāng)前的投影矩陣,用于將頂點(diǎn)/方向矢量從觀察空間變換到裁剪空間

UNITY_MATRIX_VP? ? ? ? ? ? ?當(dāng)前的觀察投影矩陣,用于將頂點(diǎn)/方向矢量從世界空間變換到裁剪空間

UNITY_MATRIX_T_MV? ? ? ? UNITY_MATRIX_MV 的轉(zhuǎn)置矩陣

UNITY_MATRIX_IT_MV? ? ? ?UNITY_MATRIX_MV的逆轉(zhuǎn)置矩陣,用于將法線從模型空間變換到觀察空間,也可以用于得到UNITY_MATRIX_MV的逆矩陣

_Object2World? ? ? ? ? ? ? ? ? ? ? 當(dāng)前的模型矩陣,用于將頂點(diǎn)/方向矢量從模型空間變換到世界空間

_World2Object? ? ? ? ? ? ? ? ? ? ? _Object2World的逆轉(zhuǎn)矩陣,用于將頂點(diǎn)/方向矢量從世界空間變換到模型空間


unity 頂點(diǎn)轉(zhuǎn)換函數(shù)

命令? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 說明

float4 UnityObjectToClipPos(float3 pos)? ? ? ? ? ? 將一個(gè)點(diǎn)從object空間轉(zhuǎn)換成相機(jī)在均勻坐標(biāo)下的剪輯空間。這就相當(dāng)于 mul(UNITY_MATRIX_MVP, float4(pos, 1.0)), 應(yīng)該在它的位置上使用。

float3 UnityObjectToViewPos(float3 pos)? ? ? ? ? ?將一個(gè)點(diǎn)從object空間轉(zhuǎn)換為view空間。這就相當(dāng)于mul(UNITY_MATRIX_MV, float4(pos, 1.0)).xyz, 應(yīng)該在它的位置上使用。


unity 內(nèi)置的攝像機(jī)和屏幕參數(shù)

命令? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?說明

float3 _WorldSpaceCameraPos? ? ? ? ? ?該攝像機(jī)在世界空間中的位置

float4 _ProjectionParams? ? ? ? ? ? ? ? ? ? ?x=1.0 或-1.0(使用反轉(zhuǎn)的投影矩陣渲染時(shí)是負(fù)數(shù)),y=Near,z=Far,w= 1.0+1.0/Far, 其中near和far分別是近裁剪平面和遠(yuǎn)裁剪平面與攝像機(jī)的距離

float4 _ScreenParams? ? ? ? ? ? ? ? ? ? ? ? ? x=width,y=height,z=1.0+1.0/width,w=1.0+1.0/height, 其中width和height分別是該攝像機(jī)的渲染目標(biāo) (render target)的像素寬度和高度

float4 _ZBufferParams? ? ? ? ? ? ? ? ? ? ? ? ?x=1-Far/near,yFar/Near, 最x/Far,wy/Far,該變量用于線性化Z緩存中的深度值

floart4 unity_OrhoParams? ? ? ? ? ? ? ? ? ? x=width,y=height,z無意義,w=1.0(該相機(jī)是正交相機(jī))或w=0.0(透視相機(jī)),其中width和height是正交投影相機(jī)的寬和高

float4x4 unity_CameraProjection? ? ? ? 該攝像機(jī)的投影矩陣

floart4x4 unity_CameraInvProjection? 該攝像機(jī)的投影矩陣的逆矩陣

float4 unity_CameraWorldClipPlanes 該攝像機(jī)的6個(gè)裁剪屏幕在世界空間下的等式,按左右上下近遠(yuǎn)的順序裁剪平面


UnityCG.cginc 庫

UnityCG.cginc 該文件中包含了很多即成的參數(shù)方法。使用十分方便

引入文件

CGPROGRAM

#include "UnityCG.cginc"

ENDCG

unitycg.cginc 常用結(jié)構(gòu)

命令 參數(shù) 實(shí)例 說明

appdata_base? ? ? ? 頂點(diǎn)位置、頂點(diǎn)法線、第一組紋理坐標(biāo)? ? ? float4 vertex : POSITION; float3 normal : NORMAL; float4 texcoord: TEXCOORD0; 可用于頂點(diǎn)著色器的輸入

appdata_tan? ? ? ? ? ?頂點(diǎn)位置、頂點(diǎn)切線、頂點(diǎn)法線、第一組紋理坐標(biāo)? ? ? ? ?float4 vertex : POSITION; float4 tangent : TANGENT; float3 normal : NORMAL; float4 texcoord : TEXCOORD0; 可用于頂點(diǎn)著色器的輸入

appdata_full? ? ? ? ? 頂點(diǎn)位置、頂點(diǎn)切線、頂點(diǎn)法線、四組(或更多)紋理坐標(biāo)? ? ? float4 vertex : POSITION; float4 tangent : TANGENT; float3 normal : NORMAL; float4 texcoord : TEXCOORD0; float4 texcoord1 : TEXCOORD1; float4 texcoord2 : TEXCOORD2; float4 texcoord3 : TEXCOORD3; #if defined(SHADER_API_XBOX360) half4 texcoord4 : TEXCOORD4; half4 texcoord5 : TEXCOORD5; #endif fixed4 color : COLOR; 可用于頂點(diǎn)著色器的輸入

appdata_img? ? ? ? ? 可用于頂點(diǎn)著色器的輸入? ? ? ? ? float4 vertex : POSITION; half2 texcoord : TEXCOORD0; 可用于頂點(diǎn)著色器的輸入

v2f_img? ? ? ? ? ? ? ? ? ?裁剪空間中的位置、紋理坐標(biāo) 可用于頂點(diǎn)著色器的輸出

unitycg.cginc 常用函數(shù)

命令? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 說明

float4 WorldSpaceViewDir(float4 v)? ? ? ? ? ? ? ?輸入一個(gè)模型空間中的頂點(diǎn)位置,返回世界空間中從該點(diǎn)到攝像機(jī)的觀察方向

float4 UnityWorldSpaceViewDir(float4 v)? ? ? ?輸入一個(gè)世界空間中的頂點(diǎn)位置,返回世界空間中從該點(diǎn)到攝像機(jī)的觀察方向

float4 ObjSpaceViewDir(float4 v)? ? ? ? ? ? ? ? ? ?輸入一個(gè)模型空間中的頂點(diǎn)位置,返回模型空間中從該店到攝像機(jī)的觀察方向

float4 WorldSpace LightDir(flaot4 v)? ? ? ? ? ? ? 僅用于向前渲染。 輸入一個(gè)模型空間中的頂點(diǎn)位置,返回世界空間中從該點(diǎn)到光源的光照方向。沒有被歸一化

float4 ObjectSpaceLightDir(float4 v)? ? ? ? ? ? ? 僅用于向前渲染中,輸入一個(gè)模型空間中的頂點(diǎn)位置, 返回模型空間中從該點(diǎn)到光源的光照方向。沒有被歸一化

float4 UnityWorldSpaceLightDir(float4 v)? ? ? ? 僅用于向前渲染中,輸入一個(gè)世界空間中的頂點(diǎn)位置, 返回世界空間中從該點(diǎn)到光源的光照方向。沒有被歸一化

float3 UnityObjectToWorldNormal(float3 norm)? ? ? ? ? ?把法線方向從模型空間中轉(zhuǎn)換到世界空間中

float3 UnityObjectToWorldDir(float3 dir)? ? ? ? ? ?把方向矢量從模型空間中變換到世界空間中

float3 Unity WorldToObjectDir(float3 dir)? ? ? ? ? 把方向矢量從世界空間變換到模型空間中


shader數(shù)學(xué)函數(shù)

函數(shù)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?說明?

radians(degree)? ? ? ? ? ? ? ? ? ? 角度變弧度(一般默認(rèn)都用弧度)

degrees(radian)? ? ? ? ? ? ? ? ? ? 弧度變角度

sin(angle)? ? ? ? ? ? ? ? ? ? ? ? ? ? ?三角函數(shù)

cos(angle)? ? ? ? ? ? ? ? ? ? ? ? ? ? 三角函數(shù)

tan(angle)? ? ? ? ? ? ? ? ? ? ? ? ? ? ?三角函數(shù)

asin(x)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? arc sine, 返回弧度 [-PI/2, PI/2];

acos(x)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?arc cosine,返回弧度 [0, PI]

atan(y, x)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? arc tangent, 返回弧度 [-PI, PI];

atan(y/x)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?arc tangent, 返回弧度 [-PI/2, PI/2];

pow(x, y)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?x的y次方

exp(x)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?指數(shù), log(x)

exp2(x)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2的x次方, log2(x)

sqrt(x)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? x的根號(hào);

inversesqrt(x)? ? ? ? ? ? ? ? ? ? ? x根號(hào)的倒數(shù)

abs(x)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 絕對(duì)值

sign(x)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?取當(dāng)前數(shù)值的正負(fù)符號(hào),返回 1, 0 或 -1 (x>0;x=0;x<0)

floor(x)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?底部取整

ceil(x)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 頂部取整

fract(x)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?取小數(shù)部分

mod(x, y)? ? ? ? ? ? ? ? ? ? ? ? ? ? 取模, x - y*floor(x/y)

min(x, y)? ? ? ? ? ? ? ? ? ? ? ? ? ? ?取最小值

max(x, y)? ? ? ? ? ? ? ? ? ? ? ? ? ? 取最大值

clamp(x, min, max)? ? ? ? ? ? min(max(x, min), max);

mix(x, y, a)? ? ? ? ? ? ? ? ? ? ? ? ?x, y的線性混疊, x(1-a) + y*a;

step(edge, x)? ? ? ? ? ? ? ? ? ? 如 x smoothstep(edge0, edge1, x): threshod smooth transition時(shí)使用。 x<=edge0時(shí)為0.0, x>=edge1時(shí)為1.0

length(x)? ? ? ? ? ? ? ? ? ? ? ? ? ?向量長(zhǎng)度

distance(p0, p1)? ? ? ? ? ? ? ?兩點(diǎn)距離, length(p0-p1);

dot(x, y)? ? ? ? ? ? ? ? ? ? ? ? ? ? 點(diǎn)積,各分量分別相乘 后 相加

cross(x, y)? ? ? ? ? ? ? ? ? ? ? ? 差積 x[1]*y[2]-y[1]*x[2], x[2]*y[0] - y[2]*x[0], x[0]*y[1] - y[0]*x[1]

normalize(x)? ? ? ? ? ? ? ? ? ? ?歸一化 length(x)=1;

faceforward(N, I, Nref)? ? ?如 dot(Nref, I)< 0則N, 否則 -N

reflect(I, N)? ? ? ? ? ? ? ? ? ? ? I的反射方向 I -2*dot(N, I)*N, N必須先歸一化

refract(I, N, eta)? ? ? ? ? ? ? ?折射 k=1.0-etaeta(1.0 - dot(N, I) * dot(N, I)); 如k<0.0 則0.0,否則 etaI - (etadot(N, I)+sqrt(k))*N

matrixCompMult(matX, matY)? ? ? ? ? ? ? ?矩陣相乘, 每個(gè)分量 自行相乘 r[j] = x[j]*y[j];

lessThan(vecX, vecY)? ? ? ? ? ? ? ?向量 每個(gè)分量比較 x < y

lessThanEqual(vecX, vecY)? ? ?向量 每個(gè)分量比較 x<=y

greaterThan(vecX, vecY)? ? ? ? ?向量 每個(gè)分量比較 x>y

greaterThanEqual(vecX, vecY) 向量 每個(gè)分量比較 x>=y

equal(vecX, vecY)? ? ? ? ? ? ? ? ? ?向量 每個(gè)分量比較 x==y

notEqual(vecX, vexY)? ? ? ? ? ? ? 向量 每個(gè)分量比較 x!=y

any(bvecX)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 只要有一個(gè)分量是true, 則true

all(bvecX)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 所有分量是true, 則true

not(bvecX)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?所有分量取反



ShaderlabVS? ? ? ? ? ? ? ? ? https://marketplace.visualstudio.com/items?itemName=ShaderlabVS2019.ShaderlabVS

ShaderlabVSCode? ? ? ? ?https://marketplace.visualstudio.com/items?itemName=amlovey.shaderlabvscodefree#overview

HLSL Tools for Visual Studio? ? ??https://marketplace.visualstudio.com/items?itemName=TimGJones.HLSLToolsforVisualStudio

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 簡(jiǎn)介 今天來研究幾個(gè)效果,最近比較忙,所以來弄幾個(gè)比較簡(jiǎn)單的效果玩一下。不過也是游戲中常用的一些效果,流光效果,按...
    樹上的cat_ee3c閱讀 5,849評(píng)論 0 5
  • <轉(zhuǎn)>我也忘了轉(zhuǎn)自哪里,抱歉,感謝原作者 什么是Shader Shader(著色器)是一段能夠針對(duì)3D對(duì)象進(jìn)行操作...
    星易乾川閱讀 5,852評(píng)論 1 16
  • 轉(zhuǎn)載注明出處:點(diǎn)擊打開鏈接 Shader(著色器)是一段能夠針對(duì)3D對(duì)象進(jìn)行操作、并被GPU所執(zhí)行的程序。Shad...
    游戲開發(fā)小Y閱讀 3,685評(píng)論 0 4
  • 簡(jiǎn)介 游戲里面角色死亡的時(shí)候,有很多方式可以表現(xiàn)人物死亡效果。最簡(jiǎn)單粗暴的,播放完死亡動(dòng)畫直接刪除或者直接Y軸逐漸...
    梓易_寒江雪閱讀 751評(píng)論 0 2
  • 夜鶯2517閱讀 128,155評(píng)論 1 9

友情鏈接更多精彩內(nèi)容