Pixel Shader 2.x的问题
作者:
cywater2000
日期:
2007-4-19
一直以为支持
Pixel Shader(
以下简称
ps)2.0
的显卡自然支持
2.x
,因为
D3DPS_VERSION
只有
(2,0)
这个版本号可以检查。事实证明是错误的。
这几天把一个
demo
放到
ATI Radeon X600
上跑,结果发现程序始终无法正确运行。调了半天都找不出错误。由于我检查了每个函数的返回值
(
宏
V)
,所以应该不是
API
参数没有设对
(
比如创建的纹理格式不支持
)
。最后在
debug
信息窗口中发现了一些线索:
D3DX: ID3DXEffect: Warning! Failed to create shader on this device (probably because shader version is unsupported)
我靠
! D3DXCreateEffectFromFile
返回值是
S_OK
啊
! WTH!
然后把范围缩小到某个
ps
程序上。这个程序我是用
ps_2_a
编译的,难道
X 600
不支持?于是
google
之。
果然是这样
!
而且
ps_2_a
与
ps_2_b
也是不一样的。简单来说,前者是
NVIDIA
支持的标准,后者是
ATI
的
…
具体的比较可以看这个:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/cywater2000/2afe523dca224bd2a61aa95f8f733dc7.jpg)
于是有老外戏称使用
ps_2_nv
与
ps_2_at
更准确,更有甚者取名为:
ps_2_we_suck_too_much_to_just_make_it_3 (ps_2_a)
ps_2_wtf_we_dont_need_this (ps_2_b)
233max
实际上大家可以看到
ps_2_b
差不多可以算
2_a
的子集
(
除了
temp register)
,虽然名字靠后一些。
因此,如果要检测硬件是否支持
ps_2_x
,不能光用
D3DPS_VERSION(2, 0)
来判断。下面给出一个简单的方法:
g_pD3DDevice->GetDeviceCaps(&d3dCaps);
if
( d3dCaps.PixelShaderVersion >= D3DPS_VERSION(2, 0) ) //2.0
{
if(3dCaps.PS20Caps.Caps & D3DPS20CAPS_NOTEXINSTRUCTIONLIMIT) //2.x
{
if(d3dCaps.PS20Caps.Caps & D3DPS20CAPS_ARBITRARYSWIZZLE) //2.a
{
}
else //2.b
{
}
}
}
关于检测硬件信息更详细的例子,可以参考
D3D
的例子:
Config System Sample
。
最后说一句:也许
DX10
的作法是对的,之前的硬件差别确实太大,对开方者来说确实很不方便
...