標籤:style blog http color 使用 資料
Normal: 法線
Normao mapping: 法線貼圖
Lighting mapping: 光照貼圖
Bump mapping: 凹凸貼圖;類比粗糙外表面的技術。 FX-Water simple.shader中即用到了。類比波浪效果。
Rim lighting: 邊緣光照; 在對象的邊緣部分添加?亮度。
Base Texture, 基礎紋理。
Detail Texture,細節紋理。與base texture使用同樣的uv,可是在material中的Tiling值不同。
Cubemap:立方圖
Cubemap reflection,立方圖反射。
Lambert: 漫反射的lightmodel
cg函數:數學、幾何、紋理映射、偏導、調試幾大類。
from wenku.baidu.com/link?url=5lj1AuzFz6YEZDt72eHEIooI42GhwA_hL0_YO6N827tmzqYV85kNqL7WXmvZZ5JJv7GZiYXaIZKAKSY2Rnaf8IdpL2HiwzsiCydgdOcUfWu
tex2D: Tex2D(sampler2D tex, float2 s),二維紋理查詢。 返回四元向量值。 紋理映射函數都返回四元向量值。
mul: 矩陣乘法
UnpackNormal: U3D的標準法線解壓函數; 在UnityCG.cginc中。
unity3d 定製的表面著色器(Surface Shader)的標準輸出結構是這種:struct SurfaceOutput { half3 Albedo; //反射率 half3 Normal; //法線 half3 Emission; //自發光,用於增強物體自身的亮度,使之看起來好像能夠自己發光 half Specular; //鏡面 half Gloss; //光澤 half Alpha; //透明 };#pragma surfacesurfaceFunction lightModel [optionalparams]
surfaceFunction -表示Cg函數中有表面著色器(surface shader)代碼。這個函數的格式應該是這樣:void surf (InputIN,inout SurfaceOutput o),Input是你自訂的結構。Input結構中應該包括全部紋理座標(texturecoordinates)和和表面函數(surfaceFunction)所須要的額外的必需變數。
lightModel-在光照模式中使用。內建的是Lambert (diffuse)和 BlinnPhong(specular)。
//vertex shader的輸入
struct appdata_base { float4 vertex : POSITION; //頂點位置 float3 normal : NORMAL; //法線方向 float4 texcoord : TEXCOORD0;//紋理座標。。?};
// scroll bump wavesfloat4 temp;//四元向量xyzw v.vertex.xzxz表示去除vertex的x z x z四個分量組成一個新的向量; 計算後給temp賦值。 temp.xyzw = v.vertex.xzxz * _WaveScale / unity_Scale.w + _WaveOffset;o.bumpuv[0] = temp.xy * float2(.4, .45);o.bumpuv[1] = temp.wz;
from
http://hi.baidu.com/stupidboys1027/item/e6ac3cbb4faccbd684dd799a
語意輸入,語意輸出, uniform
依據語意將參數與頂點的資訊綁定。
非常明顯地看到,入口變數中有三種不同類型的參數:語義型輸入參數,語義型輸出參數,uniform輸入參數。 首先我們來理解“語義”,這個詞的真正含義,事實上,更準確地說我們應該把它叫“綁定語義”(Binding Semantics),從Binding這個詞我們就能想像得到,POSITION這個語義,它就是用來把pInitial 這個參數與外部環境(OpenGL)中的頂點位置向量綁在一起。輸出語義也是這種原理。讓我們來回答開始時提出的問題:從哪裡來,到哪裡處。1、從哪裡來。如今讓我們假設,OpenGL在對頂點進行渲染之前,在程式中都自己主動產生了這樣一個資料結構struct vertex; 這個資料結構包括了vertex.position, vertex.normal, vertex.color, vertex.texcoord.等等全部與頂點相關的狀態資訊。而這些資訊都是公開的,可以被外部函數所引用。所以,CG中的語義型輸入參數的值就是從這些資訊中自己主動擷取。如範例中的“float4 pInitial : POSITION”,通過POSITION這個綁定語義,把pInitial這個變數與vertex.position這個資訊綁定在一起,於是pInitial就被賦值了。這是不是和C++中的引用一樣的原理呢?注意:輸入參數是僅僅讀的。2、到哪裡去?假設知道了從哪裡來,那麼到哪裡去也非常好理解,(out float3 color : COLOR),有個OUT在前面作修飾的參數就是語義型輸出參數。這裡通過COLOR這個綁定語義,把color向量與vertex.color這個值綁定在一起。在CG的代碼中,經過一系列的運算和處理之後,終於得到頂點的新的顏色,把這個顏色值又一次返回給OpenGL的頂點屬性中,OpenGL再通過讀取該屬性對頂點進行渲染。總的來說,語義型參數的輸入與輸出都是由CG自己主動完畢,程式要做的僅僅是把它與相應的語義綁定。 說了那麼多,另一個uniform輸入參數,我們還沒有說。假設說語義型參數是CG自己主動處理的,那麼uniform型參數就是要程式猿在程式中為它賦值的。
http://blog.sina.com.cn/s/blog_63507a56010115gr.html
from cg users manual
float2 * float2; 相應分量相乘後得到的向量。 不是叉乘。
dot, 點乘, 得到的是標量。 相應分量相乘後的和值。
標量與向量相乘, 是將向量的每一個分量乘以標量後得到的新向量。 (向量放縮了。)
mul, 矩陣乘法; 矩陣乘以向量、 或者矩陣相乘。
Swizzle operator:
-------float3(a,b,c).zyx yields float3(c, b, a)
-------float4(a,bc,d).xxyy yields float4(a,a,b,b)
Texture Lookups 須要兩個參數: Texture sampler, texture coordinate
--------texture sampler: sampler, sampler1D, sampler2D, sampler3D, samplerCUBE, sampleRECT.
--------tex2D/RECT/CUBE, nonprojective
--------text2D/RECT/CUBEproj, projective texture lookup
float, 32bit浮點數, s23e8 + 1bit
halft, 16bit, s10e5
int, 32 bit integer
fixed, 12bit
bool,
sampler*, texture object的HANDLE。
string
向量、矩陣。
mul(MVP, pos)---->將vertex的postion轉化為螢幕上的座標
tex2D(texture, texcoordinate)--------->Output the color taken from our texture
vertex的輸出 是 fragment的輸入
螢幕繪製過程:
1) 螢幕繪製到temporary texture中; 而不是通常的screen buffer
2) temporary texture 會經過filter的處理。
3) 處理結果放到screen buffer中準備繪製到螢幕上顯示給使用者