GLSL/HLSL易犯錯誤和注意點


渲染API容易出錯,根源於其本質是個狀態機,作一個渲染時,幾十上百個狀態都必須設置正確,才能得到正確的圖像,這就很容易出點小差錯.
1.GLSL的vec4有3種分量形式xyzw/rgba/stpq, 注意到的r分量是指顏色r分量, 習慣上的紋理座標分量strq的r由於和顏色r衝突,改作p.

2.Global Amibient也要乘以材質Material.

3.HLSL沒有shadow2DProj函數, GLSL的shadow2DProj返回的是深度比較的結果1.0或0.0的4元組,不是深度值!且要記住,shadow2DProj受到固定流水中紋理GL_TEXTURE_COMPARE_MODE/GL_TEXTURE_COMPARE_FUNC的影響,要使用shadow2DProj必須打開深度紋理比較模式.

4.HLSL允許如vec4向下強轉爲vec3這種隱式轉換. GLSL語法上不允許,但實踐上N卡出warning仍可以編譯運行,A卡直接報錯無法運行.

5.DirectX的shader調試狀態和硬件實際運行狀態的結果有很大區別,不能全信.

6.設置   glEnable(GL_COLOR_MATERIAL);
              glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
在shader中, A卡的glFrontMaterial.diffuse不會跟蹤設置爲當前頂點色,而N卡正確.

7.GLSL: N卡可以使用vec3 temp = { 1.0, 0.0, 1.0}; 這種形式的構造, A卡報錯. 
   HLSL: 都可以使用float3 temp = { 1.0, 0.0, 1.0};形式.

8.HLSL的mul接受mul(vec, matrix)或mul(matrix, vec),要注意通常HLSL要依DirectX計算(V * M)使用mul(vec, matrix)的形式.
特別需要小心的是,vec如果是float3,前後行列不等,違反HLSL規範,但shader編譯也不報錯,直接當成float4(vec, 0)處理,而不是當成float4(vec, 1).即mul(float3, matrix)中的float3被當成向量,而不是頂點.

9.不要在一行中寫過於複雜的表達式, N卡沒問題, A卡很爛,通常都編譯不過.例如:
http://www.ozone3d.net/blogs/lab/?p=38


10.GLSL可以只有PixelShader, 沒有Vertex Shader, HLSL不支持. 
vs_3_0 shader executed in hardware vertex processing mode can only be paired with at least a ps_3_0 shader. 

11.GLSL的1.2版本開始支持mat4x3這種non-square矩陣,要注意4x3是4列3行,而不是4行3列. 

References:
http://jegx.ozone3d.net/index.php?entry=entry070529-094845
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章