Pixel Shader 2.x 的问题

本文探讨了PixelShader2.x在不同显卡上的兼容性问题,特别是ATI Radeon X600系列显卡对PixelShader2.x的支持情况。文章详细介绍了如何区分PixelShader的不同版本,并提供了检测硬件支持的具体方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
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 更准确,更有甚者取名为:
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 的作法是对的,之前的硬件差别确实太大,对开方者来说确实很不方便 ...
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值