幾種常見的資料型別:
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 ...