delphi - 在运行时检测 GPU 是否支持 Pixel Shader 2.0 (Firemonkey)

标签 delphi directx firemonkey delphi-xe7

这个问题来 self 之前的问题:

Delphi XE7 Abstract Error on StyleLookup with Effect (FireMonkey)

基本上,我有几个应用了效果的样式控件。这些效果适用于大多数系统,因此我不想将它们从我的风格中全部剔除,以供少数客户使用。有没有办法检测客户端是否有 DirectX 9 并且安装的 GPU 是否支持 Pixel Shader 2.0?

最佳答案

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

现在要检测像素着色器版本,您必须使用 IDirect3D9::GetDeviceCaps方法,然后检查 D3DCAPS9PixelShaderVersion 字段的值记录一下。

尝试这个 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;

关于delphi - 在运行时检测 GPU 是否支持 Pixel Shader 2.0 (Firemonkey),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28971884/

相关文章:

delphi - 如何在 Delphi 2009 中创建 Microsoft 管理控制台 (MMC) 管理单元?

delphi - 我必须使用哪些选项来取消 Delphi 应用程序中的一长串操作?

c++ - HLSL 采样器状态

c++ - 更新 Directx 10 和 11 中的顶点缓冲区

ios - 为什么我们需要对 Objective-C 对象字段进行保留?

delphi - Delphi 11.1 FMX 关闭时 TGPUObjectsPool 内存泄漏

java - 查找与 DLL 中的偏移量匹配的 Delphi 源代码行

delphi - 如何从窗体单元外部访问delphi控件?

c++ - 在 Directx 11 中加载 ColorMap 时的文件路径

delphi - 如何在 Firemonkey (FMX) 中无缝循环声音?