Delphi 检测GPU在运行时是否支持像素着色器2.0(Firemonkey)

Delphi 检测GPU在运行时是否支持像素着色器2.0(Firemonkey),delphi,directx,firemonkey,delphi-xe7,Delphi,Directx,Firemonkey,Delphi Xe7,这个问题来自我之前的问题: 基本上,我有几个应用了效果的样式控件。这种效果在大多数系统上都有效,所以我不想把它们一起从我的风格中去掉,因为只有少数几个客户不会使用它们。是否有方法可以检测客户端是否安装了DirectX 9并且安装的GPU是否支持像素着色器2.0?AFAIK没有直接的方法来确定DirectX版本,但是Microsoft提供了一个名为GetDXVersion的示例函数,它是DirectX SDK的一部分。此函数运行一组检查以确定DirectX版本。幸运的是,您可以在项目中找到该函数

这个问题来自我之前的问题:


基本上,我有几个应用了效果的样式控件。这种效果在大多数系统上都有效,所以我不想把它们一起从我的风格中去掉,因为只有少数几个客户不会使用它们。是否有方法可以检测客户端是否安装了DirectX 9并且安装的GPU是否支持像素着色器2.0?

AFAIK没有直接的方法来确定DirectX版本,但是Microsoft提供了一个名为GetDXVersion的示例函数,它是DirectX SDK的一部分。此函数运行一组检查以确定DirectX版本。幸运的是,您可以在项目中找到该函数的Delphi翻译

现在要检测像素着色器版本,必须使用该方法,然后检查记录的
PixelShaderVersion
字段的值

试试这个FMX样品

uses
  Winapi.Windows,
  Winapi.Direct3D9,
  FMX.Context.DX9;


procedure TForm1.Button1Click(Sender: TObject);
var
    LCaps: TD3DCaps9;
    LPixelShaderVersionMajor, LPixelShaderVersionMinor : Cardinal;
begin
  ZeroMemory(@LCaps, SizeOf(LCaps));
  if TCustomDX9Context.Direct3D9Obj.GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, LCaps) = S_OK then
  begin
    LPixelShaderVersionMajor:= D3DSHADER_VERSION_MAJOR(LCaps.PixelShaderVersion);
    LPixelShaderVersionMinor:= D3DSHADER_VERSION_MINOR(LCaps.PixelShaderVersion);
    ShowMessage(Format('PixelShaderVersion %d.%d', [LPixelShaderVersionMajor, LPixelShaderVersionMinor]));
  end;

   //also you can use the D3DPS_VERSION function to determine if the version returned meets the requirements
  if (LCaps.PixelShaderVersion >= D3DPS_VERSION(2, 0)) then
   ShowMessage('Hey your PixelShaderVersion is compatible');
end;

真的很感激!要扩展这个答案,有一个
TCustomDX9Context.hardware支持的
boolean函数,但它只检查是否可以初始化DirectX9,Embarcadero应该在这个函数中包含着色器版本检查。。。