纹理对象
在 Direct3D 10 中,可以单独指定采样器和纹理;纹理采样是通过模板化纹理对象实现的。 此模板化纹理对象具有特定格式,返回特定类型并实现多个方法。
Direct3D9 和 Direct3D10 的差别:
- 在 Direct3D 9 中,采样器绑定到特定的纹理。
- 在 Direct3D 10 中,纹理和采样器是独立的对象。 每个模板化纹理对象实现纹理采样方法,这些方法将纹理和采样器用作输入参数。
并非所有函数都支持所有格式。 因此,你应使用 CheckFeatureSupport 来检查某种格式是否支持特定的用途。
下面是用于创建所有纹理对象(多重采样对象除外)的语法。
Object1 [<Type>] Name; |
---|
多重采样对象(Texture2DMS 和 Texture2DMSArray)需要显式规定纹理大小并将其表示为样本数。
Object2 [<Type, Samples>] Name; |
---|
参数
项目 | 说明 | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
对象 |
一个纹理对象。 必须是以下类型之一。
|
||||||||||||||||||||||||
类型 |
可选。 任何标量 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 和更高版本的着色器模型 | 是 |