关于ATI显卡的一个奇怪问题?
2006-01-15 12:13
429 查看
近日编写shader的时候发现一个奇怪的问题,在我的6200卡上以下shader代码可以正确的计算出结果,而在ATI 9600的卡上就是错误的,查了很多资料还是百思不得其解,那就当做一点点经验把它记录下来,以后再有朋友遇到类似的问题就不用像我这样逐行代码排除找错误了:)
在我的shader里,有这样两行代码,用于算像素normal:
float3 vNormal=normalize(2*(vA+vB)-2);
...... 省略若干不相关代码
float NdotL=max(dot(vNormal,eyeDir),0);
这里vA,vB都是float3,来自于bump贴图取样和vs输入,在我的6200卡上可以正确计算出结果,也就是说NdotL的取值是[0,1]之间,而在同事的ATI 9600卡上, NdotL的结果是恒为0,经过逐行排除测试,最终发现是
float3 vNormal=normalize(2*(vA+vB)-2);
导致错误,vNormal的计算结果不在预期,将代码调整为:
float3 vNormal1=2*vA-1;
float3 vNormal2=2*vB-1;
float3 vNormal=vNormal1+vNormal2;
vNormal=normalize(vNormal);
问题得以解决,开始以为是同事的机器的DX版本太低,导致fxc编译出来的shader代码有错误,可是我和同事互相掉换fxo后,同事问题依旧,而我同样是正常,在令一同事的ATI 9800卡也是正常的,至此得出结论ATI 9600卡硬件设计可能存在问题,因为驱动已经更新至最新;抑或是DX的fxc编译的shader代码移植性不高,因为同样的代码使用nVidia CG编写在9600上是没有问题的。
在我的shader里,有这样两行代码,用于算像素normal:
float3 vNormal=normalize(2*(vA+vB)-2);
...... 省略若干不相关代码
float NdotL=max(dot(vNormal,eyeDir),0);
这里vA,vB都是float3,来自于bump贴图取样和vs输入,在我的6200卡上可以正确计算出结果,也就是说NdotL的取值是[0,1]之间,而在同事的ATI 9600卡上, NdotL的结果是恒为0,经过逐行排除测试,最终发现是
float3 vNormal=normalize(2*(vA+vB)-2);
导致错误,vNormal的计算结果不在预期,将代码调整为:
float3 vNormal1=2*vA-1;
float3 vNormal2=2*vB-1;
float3 vNormal=vNormal1+vNormal2;
vNormal=normalize(vNormal);
问题得以解决,开始以为是同事的机器的DX版本太低,导致fxc编译出来的shader代码有错误,可是我和同事互相掉换fxo后,同事问题依旧,而我同样是正常,在令一同事的ATI 9800卡也是正常的,至此得出结论ATI 9600卡硬件设计可能存在问题,因为驱动已经更新至最新;抑或是DX的fxc编译的shader代码移植性不高,因为同样的代码使用nVidia CG编写在9600上是没有问题的。
相关文章推荐
- 一个关于Unicode字符编码的奇怪问题
- 关于block的一个奇怪问题
- 关于虚继承和析构函数的一个奇怪的问题
- 关于BadgeView遇到的一个奇怪的问题和解决办法
- 关于Java包导入的一个奇怪问题(www.sunxin.org)
- 一个奇怪的关于脚本的问题
- 关于VS一个相当奇怪的问题!!!
- 一个奇怪的关于自冲销的问题,不解?
- 关于RelativeLayout的一个奇怪问题
- 一个关于inet_ntoa的奇怪问题
- 关于更改当前公司(三)--一个奇怪的问题
- [奇怪]一个关于type=submit 和 onsubmit的问题
- 关于虚继承和析构函数的一个奇怪的问题
- 关于在线编辑器的一个奇怪的问题
- 一个关于Unicode字符编码的奇怪问题
- 关于空格和回车带来的输入输出不一致问题,使用了一个奇怪的replace
- 关于随机数的一个奇怪问题
- 关于 weak 变量的一个奇怪问题
- 关于function输入的一个奇怪问题
- 一个关于Unicode字符编码的奇怪问题