平民程序 - linghuye's blog

天下风云出我辈,一入江湖岁月催。皇图霸业谈笑中,不胜人生一场醉。提剑跨骑挥鬼雨,白骨如山鸟惊飞。尘事如潮人如水,只笑江湖几人回。

随笔 - 221, 文章 - 0, 评论 - 680, 引用 - 0
数据加载中……

GLSL/HLSL易犯错误和注意点

我的blog里有许多此类笔记,主要是记录写程序时犯下的错误.有相当多的错误,我都是一犯再犯,而且每次都因这种小错耽误时间而骂自己是猪,所以很有必要记录下来,以备查找.作程序的要懂得积累经验,并书面化,抽象化.

渲染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

posted on 2008-01-29 20:30 linghuye 阅读(6492) 评论(6)  编辑 收藏 引用 所属分类: 3D图形学研究

评论

# re: GLSL/HLSL易犯错误和注意点  回复  更多评论   

好文,Mark了。不过10不对
"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. "
乱讲
2008-07-07 16:55 | 依仔

# re: GLSL/HLSL易犯错误和注意点  回复  更多评论   

10.GLSL可以只有PixelShader,没有VertexShader,HLSL不支持

HLSL支持fragment
2008-10-27 17:25 | 风之翼CC

# re: GLSL/HLSL易犯错误和注意点  回复  更多评论   

10错了,HLSL可以只有PS。不知道楼主这条结论是怎么得出来的
2009-03-01 16:15 | cywater2000

# re: GLSL/HLSL易犯错误和注意点[未登录]  回复  更多评论   

10th is not correct, we can have only pixel shader without vertex shader by setting the vertex position as transformed vertex in shader 3
2009-05-12 23:43 | wang

# re: GLSL/HLSL易犯错误和注意点  回复  更多评论   

我用 D3DXCompileShaderFromFile 编译ps_3_0 时总是返回错误不知为何。 返回错误为(error X3506: unrecognized compiler target 'ps_3_0')我在
if(caps.PixelShaderVersion < D3DPS_VERSION(3, 0))测试硬件是支持的,为何总是编译不过。希望指教,谢谢。

QQ:36046869
2009-06-09 11:18 | LSJ

# re: GLSL/HLSL易犯错误和注意点  回复  更多评论   

HLSL没有shadow2DProj函数
有个tex2Dproj
2009-12-14 11:04 | xoyojank
只有注册用户登录后才能发表评论。