Shader编程最容易犯的低级错误
作者:cywater2000
日期:2007-1-16
前段时间本人一直在用
shader
写程序,看似简单,结果发现经常犯低级错误。由于调试
shader
比较麻烦,特别是
pixel shader(
简称
ps)
,所以有时候一个小错误会花掉好几个小时甚至一天的功夫才能找到。于是本人把工作中遇到的问题都总结了下来,希望以后自己不要再犯,同时也希望对别人有所帮助
(
什么?这些
BC
级错误你从来没犯过?
u kidding… - -!)
。
在这里我用“
*
”来表示痛苦指数
>_<~~
1.
忘记计算光照应该在同一坐标系下
(
如
view space
,
tangent space)
**
2.
忘记矢量要单位化
**
3.
忘记矢量的
w=0(
顶点的
w=1)
***
4.mul
的左操作数与右操作数搞错
**
mul
(vector, matrix)
显然与
mul
(matrix, vector)
是不一样的
5.
忘记
ps
的参数都是线性插值传过去的
*
6.
忘记变量的维度
(
例如:写成
float
color
,实际上应该是
float4
color)
*
7.
给
shader
传递变量时总是忘记检查返回值
*****
D3D
并不会提示有错误发生
(
比如输出警告信息
)
,所以要养成检查返回值的习惯
比如
V( g_pEffect->SetVector(…) );
8.
忘记所有的计算应该在同一个
scale
下进行
******
这个在
GPGPU
中经常犯,比如在
[-1,1]
的尺度下你用
[0,100]
来计算。目前我遇到过最痛苦的事
…
9.
忘记
texel/pixel
的取值是在
cell
的中心
***
比如:如果将
lookup
表变成纹理,则查询的时候应该是
tex1D
(s0, (index + 0.5) / TextureSize);
10.
对于使用已经变换的
(transformed)
顶点,无法任意设置
vs
的输出数据
**
即如果顶点格式声明为
:D3DFVF_XYZRHW | D3DFVF_TEX1
则
ps
只能得到一组纹理坐标,且维数与声明的一致
你不能写成这样:
void
ps_main(float3 coords : TEXCOORD0, //=>
维数与声明必须一致
float2 myvar : TEXCOORD1, //=>
不能任意增加第二个
…
)