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的…
具体的比较可以看这个:
于是有老外戏称使用ps_2_nv与ps_2_at更准确,更有甚者取名为:
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的作法是对的,之前的硬件差别确实太大,对开方者来说确实很不方便...