在 Direct3D 9 中使用着色器

编译特定硬件的着色器

着色器首先添加到 DirectX 8.0 中的 Microsoft DirectX。 此时,定义了几个虚拟着色器计算机,每个计算机大致对应于由顶层3D 图形供应商生成的特定图形处理器。 对于每个虚拟着色器计算机,都设计了一种汇编语言。 写入着色器模型的程序 (名称 vs _ 1 _ 1 和 ps _ 1 _ 1-ps _ 1 _ 4) 相对较短,开发人员通常使用适当的汇编语言编写它们。 应用程序将使用 D3DXAssembleShader 将此人为可读的汇编语言代码传递到 D3DX 库,并返回着色器的二进制表示形式,该表示形式反过来将使用 CreateVertexShaderCreatePixelShader。 有关更多详细信息,请参阅软件开发工具包 (SDK) 。

Direct3D 9 中的情况类似。 应用程序使用 D3DXCompileShader 将 HLSL 着色器传递到 D3DX,并返回已编译的着色器的二进制表示形式,而该着色器又会使用 CreatePixelShaderCreateVertexShader传递到 Microsoft Direct3D。 运行时不知道有关 HLSL 的任何内容,只是二进制程序集着色器模型。 这很好,因为这意味着 HLSL 编译器可以独立于 Direct3D 运行时进行更新。 还可以使用 fxc.exe脱机编译着色器。

除了开发 HLSL 编译器以外,Direct3D 9 还引入了程序集级别的着色器模型以公开最新一代的图形硬件功能。 应用程序开发人员可以在程序集中使用 (vs _ 2 _ 0、vs _ 3 _ 0、ps _ 2 _ 0、ps 3 0) 的这些新模型, _ _ 但我们希望大多数开发人员可以转到 HLSL 进行着色器开发。

当然,编写 HLSL 程序以表达特定底纹算法的能力并不会自动使其在任何给定的硬件上运行。 应用程序调用 D3DX,以使用 D3DXCompileShader将着色器编译为二进制程序集代码。 此入口点的其中一项限制是参数,该参数定义 (或编译目标) 的程序集级别的模型,HLSL 编译器应该使用这些模型来表示最终的着色器代码。 如果应用程序在运行时执行 HLSL 着色器编译 (而不是编译时或脱机) ,则该应用程序可以检查 Direct3D 设备的功能并选择要匹配的编译目标。 如果 HLSL 着色器中表示的算法太复杂,无法在所选的编译目标上执行,则编译将失败。 这意味着,虽然 HLSL 是对着色器开发的巨大优势,但它不能让开发人员从使用具有不同功能的图形设备向目标受众发送游戏。 作为游戏开发人员,您仍然必须管理视觉对象的分层方法;这意味着编写更好的着色器以获得更好的图形卡,并为旧卡片编写更多的基本版本。 不过,这种负担很 HLSL,但这种负担可能会显著降低。

在应用程序加载时或首次使用时,不是在客户计算机上使用 D3DX 编译 HLSL 着色器,而是在第一次使用时,很多开发人员选择将其着色器从 HLSL 编译为二进制程序集代码。 这会使其 HLSL 源代码远离窥探的眼睛,同时还可确保其应用程序的所有着色器都能顺利完成。 用于脱机编译着色器的便利实用程序 fxc.exe。 此工具提供了许多选项,您可以使用这些选项编译指定的编译目标的代码。 如果要优化着色器,或只是通常在更详细的级别上了解虚拟着色器计算机的功能,则可以在开发过程中学习反汇编输出。 下面汇总了这些选项:

初始化着色器常量

着色器常量包含在常量表中。 这可以通过 ID3DXConstantTable 接口进行访问。 可以在着色器代码中初始化全局着色器变量。 这些方法在运行时通过调用 SetDefaults进行初始化。

将着色器参数绑定到特定寄存器

编译器将自动向全局变量分配寄存器。 编译器会将环境分配给采样器 register s0,SparkleNoise 到示例器 register s1,并将 k s 分配给 _ 常量寄存器 c0 (假设尚未为以下三个全局变量) 分配其他采样器或常量寄存器:

sampler Environment;
sampler SparkleNoise;
float4 k_s;

还可以将变量绑定到特定寄存器。 若要强制编译器分配给特定寄存器,请使用以下语法:

register(RegisterName)

其中寄存器名是特定寄存器的名称。 下面的示例演示了特定寄存器赋值语法,其中采样器环境将绑定到采样器 register s1,SparkleNoise 将绑定到采样器 register s0,k _ s 将绑定到常量寄存器 c12:

sampler Environment : register(s1);
sampler SparkleNoise : register(s0);
float4 k_s : register(c12);

呈现可编程着色器

着色器是通过设置设备中的当前着色器、初始化着色器常量、告诉设备上不同的输入数据,并最终呈现基元来呈现的。 每个可通过分别调用以下方法来完成:

调试着色器

Microsoft Visual Studio .net 的 DirectX 扩展在 Visual Studio .net 集成开发环境 (IDE) 中提供完全集成的 HLSL 调试器。 为了准备着色器调试,必须在计算机上安装正确的工具 (参阅Visual Studio (Direct3D 9) ) 中的调试着色器。

HLSL 编程指南