Unity Shader(四) 資料型別

2021-10-04 06:46:02 字數 1779 閱讀 3455

幾種常見的資料型別:

1:float、half、fixed(三個都是浮點型  只是精度不一樣)

2:integer(整型)

3:sampler2d(2d紋理)

4:samplercube(3d紋理)

高精度型別,32位,通常用於世界座標下的位置,紋理uv,或涉及複雜函式的標量計算,如三角函式、冪運算等。

中精度型別,16位,數值範圍為[-60000,+60000],通常用於本地座標下的位置、方向向量、hdr顏色等。

低精度型別,11位,數值範圍為[-2,+2],通常用於常規的顏色與貼圖,以及低精度間的一些運算變數等。

在pc平台不管你shader中寫的是half還是fixed,統統都會被當作float來處理。half與fixed僅在一些移動裝置上有效。

比較常用的乙個規則是,除了位置和座標用float以外,其餘的全部用half。主要原因也是因為大部分的現代gpu只支援32位與16位,也就是說只支援float和half,不支援fixed。

整型型別,通常用於迴圈與陣列的索引。

在 direct3d 9 和 opengl es 2.0平台上整型可能會被直接用浮點數來處理,在direct3d 11、opengl es 3等現代gpu上可以正確的以整型型別來處理。
紋理,預設情況下在移動平台紋理會被自動轉換成低精度的紋理型別,如果你需要中精度的或者高精度的需要用以下方式來宣告:

sampler2d_half(中精度2d紋理)

sampler2d_float(高精度2d紋理)

sampler3d_half(中精度3d紋理)

sampler3d_float(高精度3d紋理)

samplercube_halft(中精度立方體紋理)

samplercube_float(高精度立方體紋理)

好了,現在我們已經了解了cg/hlsl中的資料型別,那麼properties中的與cg/hlsl中的是如何對應的呢?

單個浮點數值比較好理解,像vector與color的float4要如何理解呢?

其實不管是vector還是color,都是由四個同樣精度的浮點數值組成的,所以我們在定義的時候才會寫成float4、half4或者fixed4.

比如,我們在properties中宣告了如下的顏色:

_color("color", color) = (1,1,1,1)
在cg/hlsl中我們需要同樣再宣告一次:

fixed4 _color;
顏色的四個分量:

在cg/hlsl中我們可以通過_color來訪問顏色,也可以通過_color.rgba來訪問,這裡的.rgba就是表示顏色的四個分量,如果只想獲得顏色的紅通道就是_color.r,又如果只想獲取綠通道和透明通道就是_color.ga,以此類推~

表示分量除了可以用.rgba,我們還可以使用.xyzw,它們的意義是一樣的,你可以使用vector.rgba,也可以使用color.xyzw,這兩者本身並沒有什麼區別,只是我們通常在顏色上用rgba,在向量上用xyzw,這樣比較直觀方便理解。
再說下矩陣,在shader中,矩陣是乙個按照長方形陣列排列的浮點數集合。

你可以想像成是一隊站列整齊的士兵,橫向有m人,豎向有n人。就可以用floatmxn來表示。如果是4x4矩陣,就是float4x4(同樣支援其它精度),不過有一點要注意,在某些平台上是不支援非方矩陣的(比如float3x2),特別是opengl es 2.0平台。
語義:

;

Unity Shader入門精要 閱讀筆記四

在基礎的圖形學數學中,點 向量以及矩陣是較為基礎的元素。通常三維世界中最基礎的就是點 x,y,z 向量可以看成是兩點指向的方向。向量是一種方向,與位置無關。矩陣是一系列的運算。我們在學習矩陣的時候通常會先學習多元一次方程。矩陣其實就是運算的集合。這裡我主要記錄我自己覺得容易忘記的一些知識點。向量的加...

unityshader學習(三)資料 語義

shder中主要書寫的兩個階段。乙個是幾何階段。它由乙個頂點著色器函式完成,接收來自應用階段的資料,生成資料傳遞給下乙個光柵化階段。光柵化階段由片元著色器函式完成。不同的資料表示什麼具體的含義?shader中用 語義 這個概念進行指示。應用階段的語義種類如下 比如這裡 struct v2f 頂點著色...

Unity Shader (四)頂點程式示例

1 在頂點函式中實現凸起效果 2 漸變及溜光效果 3 頂點扭曲效果 旋轉矩陣去影響頂點 優化繞y軸旋轉的矩陣,除去0與其他項相乘的項 float x cos angle v.vertex.x sin angle v.vertex.z float z sin angle v.vertex.x cos ...