纹理类型

基础纹理

HLSL
Texture1D tex1D; // 一维纹理
Texture2D tex2D; // 二维纹理
Texture3D tex3D; // 三维纹理
TextureCube texCube; // 立方体纹理
点击展开查看更多

数组纹理

HLSL
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,其基本语法为:

HLSL
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)。 示例
HLSL
SamplerState anisotropicSampler {
	Filter = ANISOTROPIC;
	AddressU = WRAP;
	AddressV = WRAP;
	MaxAnisotropy = 16;
};
点击展开查看更多

示例

2D 纹理采样

HLSL
// 纹理与采样器声明
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;
}
点击展开查看更多

立方体纹理采样(环境反射)

HLSL
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;
}
点击展开查看更多

版权声明

作者: Cheyne Xie

链接: https://chaim.eu.org/posts/8bd3498c/

许可证: CC BY-NC-SA 4.0

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. Please attribute the source, use non-commercially, and maintain the same license.

开始搜索

输入关键词搜索文章内容

↑↓
ESC
⌘K 快捷键