纹理对象

在 Direct3D 10 中,可以单独指定采样器和纹理;纹理采样是通过模板化纹理对象实现的。 此模板化纹理对象具有特定格式,返回特定类型并实现多个方法。

Direct3D9 和 Direct3D10 的差别:

  • 在 Direct3D 9 中,采样器绑定到特定的纹理。
  • 在 Direct3D 10 中,纹理和采样器是独立的对象。 每个模板化纹理对象实现纹理采样方法,这些方法将纹理和采样器用作输入参数。

并非所有函数都支持所有格式。 因此,你应使用 CheckFeatureSupport 来检查某种格式是否支持特定的用途。

下面是用于创建所有纹理对象(多重采样对象除外)的语法。

Object1 [<Type>] Name;

多重采样对象(Texture2DMS 和 Texture2DMSArray)需要显式规定纹理大小并将其表示为样本数。

Object2 [<Type, Samples>] Name;

参数

项目 说明
对象
一个纹理对象。 必须是以下类型之一。
Object1 类型 说明
Buffer Buffer
Texture1D 1D 纹理
Texture1DArray 1D 纹理数组
Texture2D 2D 纹理
Texture2DArray 2D 纹理数组
Texture3D 3D 纹理
TextureCube 立方体纹理
TextureCubeArray 立方体纹理数组
Object2 类型 说明
Texture2DMS 2D 多重采样纹理
Texture2DMSArray 2D 多重采样纹理数组

  1. Buffer 类型支持除 GetDimensions 之外的大多数纹理对象方法。
  2. TextureCubeArray 在着色器模型 4.1 或更高版本中可用。
  3. 着色器模型 4.1 在 Direct3D 10.1 或更高版本中可用。

类型

可选。 任何标量 HLSL 类型矢量 HLSL 类型,用尖括号括起来。 默认类型为 float4

Name

一个用于指定纹理对象名称的 ASCII 字符串。

示例

样本数量(范围为 1 到 128)。

示例 1

下面是声明纹理对象的示例。

Texture2D <float4> MyTex;

Texture2DMS <float4, 128> MyMSTex;

纹理对象方法

每个纹理对象实现特定的方法;下表列出了所有方法。 请参阅每个方法的参考页,了解哪些对象可以使用该方法。

纹理方法 说明 vs_4_0 vs_4_1 ps_4_0 ps_4_1 gs_4_0 gs_4_1
CalculateLevelOfDetail 计算 LOD,返回钳定结果。 x
CalculateLevelOfDetailUnclamped 计算 LOD,返回未钳定的结果。 x
Gather 获取在纹理采样时用于双线性插值的四个样本(仅限红色分量)。 x x x
GetDimensions 获取指定 mipmap 级别的纹理维度。 x x x x x x
GetDimensions (MultiSample) 获取指定 mipmap 级别的纹理维度。 x x x
GetSamplePosition 获取指定样本的位置。 x x x
加载 在不进行任何筛选或采样的情况下加载数据。 x x x x x x
Load (Multisample) 在不进行任何筛选或采样的情况下加载数据。 x x x x
示例 对纹理采样。 x x
SampleBias 将偏差值应用于 mipmap 级别后对纹理采样。 x x
SampleCmp 对纹理采样,并使用比较值来拒绝样本。 x x
SampleCmpLevelZero 对纹理采样(仅限 mipmap 级别 0),并使用比较值来拒绝样本。 x x x x x x
SampleGrad 使用渐变对纹理进行采样,以影响采样位置的计算方式。 x x x x x x
SampleLevel 在指定的 mipmap 级别对纹理采样。 x x x x x x

返回类型

除非另有指定,否则纹理对象方法的返回类型为 float4,但始终需要指定类型和样本计数的多重采样抗锯齿纹理对象除外。 返回类型与纹理资源类型 (DXGI_FORMAT) 相同。 换言之,它可以是以下任何类型。

类型 说明
FLOAT 32 位浮点(有关与 IEEE 浮点的差异,请参阅浮点规则
int 32 位带符号整数
unsigned int 32 位无符号整数
snorm 范围为 -1 到 1(含)的 32 位浮点(有关与 IEEE 浮点的差异,请参阅浮点规则
unorm 范围为 0 到 1(含)的 32 位浮点(有关与 IEEE 浮点的差异,请参阅浮点规则
任何纹理类型或结构 返回的分量数量必须为 1 到 3(含)。

此外,返回类型可以是包含结构的任何纹理类型,但必须少于 4 个分量,例如返回一个分量的 float1 类型。

纹理中缺少的分量的默认值

对于除 alpha 分量 (A) 之外的任何分量,纹理资源类型中缺少的分量的默认值均为零;缺少的 A 分量的默认值为 1。 此项对着色器的显示方式取决于纹理资源类型。 它采用纹理资源类型中实际存在的第一个类型化分量的格式(从左侧开始按 RGBA 顺序显示)。 如果此格式为 UNORM 或 FLOAT,则缺少的 A 分量的默认值为 1.0f。 如果格式为 SINT 或 UINT,则缺少的 A 分量的默认值为 0x1。

例如,当着色器读取 DXGI_FORMAT_R24_UNORM_X8_TYPELESS 纹理资源类型时,G 和 B 的默认值为 0,A 的默认值为 1.0f;当着色器读取 DXGI_FORMAT_R16G16_UINT 纹理资源类型时,B 的默认值为零,A 的默认值为 0x00000001;当着色器读取 DXGI_FORMAT_R16_SINT 纹理资源类型时,G 和 B 的默认值为零,A 的默认值为 0x00000001。

示例 2

下面是使用纹理方法进行纹理采样的示例。

sampler MySamp;
Texture2D <float4> MyTex;
 
float4 main( float2 TexCoords[2] : TEXCOORD ) : SV_Target
{
    return MyTex.Sample( MySamp, TexCoords[0] ));
}

最小着色器模型

以下着色器模型支持此对象。

着色器模型 支持
着色器模型 4 和更高版本的着色器模型

另请参阅

着色器模型 4