注意
适用于DirectX10+的语法,旧版参考:[2D 纹理(Built-In)](/posts/2D 纹理(Built-In))
纹理类型
基础纹理
Texture1D tex1D; // 一维纹理
Texture2D tex2D; // 二维纹理
Texture3D tex3D; // 三维纹理
TextureCube texCube; // 立方体纹理数组纹理
Texture2DArray tex2DArray;
float3 texCoord = float3(u, v, 2.0); // 索引2对应第3个纹理
float4 color = tex2DArray.Sample(sampler, texCoord);其他特殊纹理
- RWTexture:可读写纹理(如 RWTexture2D),支持在着色器中修改纹理数据,用于 GPGPU 计算、渲染到纹理(RTV)等场景。
- Texture2DMS/Texture2DMSArray:多重采样纹理,用于抗锯齿渲染,需通过 Load 方法按采样索引读取数据(不支持 Sample 方法)。
纹理采样
HLSL 的纹理对象提供了多种采样方法,最常用的是Sample,其基本语法为:
float4 Sample(
SamplerState sampler,
floatN texCoord,
[int mipLevel],
[float bias]
);- 参数:
sampler—— 采样器状态(定义过滤、寻址等规则)texCoord—— 纹理坐标mipLevel—— (可选)指定 MIP 层级(默认自动计算)bias—— (可选)MIP 层级偏移(用于调整采样的 MIP 级别)
其他采样函数
- SampleLevel:强制指定 MIP 层级采样,无需自动 MIP 计算。
- Load:直接读取纹素(无过滤,需整数坐标),适用于精确数据访问(如 GPGPU)。
- SampleCmp/SampleCmpLevelZero:比较采样(用于阴影映射),结合比较采样器返回 0 或 1。
采样器状态 SamplerState
采样器定义了纹理采样的规则(过滤方式、寻址模式、比较函数等),在 DirectX10 + 中通过SamplerState对象声明,与纹理资源分离。 核心属性包括:
- 过滤(Filter):控制纹素插值方式,影响缩放和 MIP 层级过渡效果。
- 如:
MIN_MAG_MIP_LINEAR(缩小、放大、MIP 均使用线性过滤);ANISOTROPIC(各向异性过滤,画质最佳但性能消耗高)
- 如:
- 寻址模式(AddressU/V/W):定义纹理坐标超出 [0,1] 范围时的处理方式。
- 常用模式:
WRAP(重复纹理)、MIRROR(镜像重复)、CLAMP(拉伸边缘像素)、BORDER(使用边界颜色)
- 常用模式:
- 边界颜色(BorderColor):当寻址模式为 BORDER 时使用的颜色(float4 类型)。
- MIPLODBias:全局 MIP 层级偏移(影响采样时的 MIP 选择)。
- MaxAnisotropy:各向异性过滤的最大各向异性程度(1-16)。 示例:
SamplerState anisotropicSampler {
Filter = ANISOTROPIC;
AddressU = WRAP;
AddressV = WRAP;
MaxAnisotropy = 16;
};示例
2D 纹理采样
// 纹理与采样器声明
Texture2D diffuseTex;
SamplerState linearWrapSampler {
Filter = MIN_MAG_MIP_LINEAR;
AddressU = WRAP;
AddressV = WRAP;
};
// 像素着色器
float4 PS(float2 texCoord : TEXCOORD0) : SV_Target {
// 采样2D纹理
float4 diffuseColor = diffuseTex.Sample(linearWrapSampler, texCoord);
return diffuseColor;
}立方体纹理采样(环境反射)
TextureCube envMap;
SamplerState cubeSampler {
Filter = MIN_MAG_MIP_LINEAR;
AddressU = WRAP; // 立方体纹理坐标为方向向量,寻址模式通常不影响
AddressV = WRAP;
AddressW = WRAP;
};
float4 PS(float3 worldNormal : NORMAL, float3 worldPos : POSITION) : SV_Target {
// 计算反射方向(假设视角方向为viewDir)
float3 viewDir = normalize(cameraPos - worldPos);
float3 reflectDir = reflect(-viewDir, worldNormal);
// 采样环境贴图
float4 reflectionColor = envMap.Sample(cubeSampler, reflectDir);
return reflectionColor;
}