Shader编程最容易犯的低级错误

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, //=> 不能任意增加第二个
)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值