Texture 与 Sampler:图像数据和采样规则如何组合
Shader 采样纹理时,Texture 与 Sampler 经常一起出现,但它们描述的是不同内容:Texture 提供图像数据,Sampler 决定如何从数据中取样。
一、Texture 保存什么
Texture 是图像资源,通常描述:
- 纹理维度、宽高、层数和数组结构;
- 像素格式、颜色空间和各级 Mip 数据;
- 图像数据本身,以及它当前的 GPU 资源状态。
可把它先理解为“可被 Shader 读取的一组图像数据”。是否需要 SRV、Image View 等资源视图,取决于图形 API 和引擎的资源模型。
二、Sampler 决定怎么取
Sampler 保存采样规则,常见内容包括:
- 过滤:Point、Linear、Anisotropic;
- 地址模式:Wrap、Clamp、Mirror、Border;
- Mip 选择和 LOD 范围、偏移;
- 深度比较采样规则。
因此同一张 Texture 可以在不同用途下采用不同规则。例如重复铺贴时用 Wrap,UI 边缘用 Clamp,像素风图像用 Point,阴影深度使用比较采样。
Texture:有哪些图像数据
Sampler:坐标越界怎么办、像素如何过滤、选哪级 Mip三、一个 Texture 配多个 Sampler
HLSL 中通常可以分别声明:
Texture2D albedoTexture : register(t0);
SamplerState linearWrap : register(s0);
SamplerState pointClamp : register(s1);
float4 sampleTiled(float2 uv)
{
return albedoTexture.Sample(linearWrap, uv);
}
float4 samplePixelArt(float2 uv)
{
return albedoTexture.Sample(pointClamp, uv);
}两次采样访问同一份图像数据,却采用不同过滤和寻址方式。反过来,一个常用 Sampler 也可以被多个 Texture 复用。
四、为什么分开管理
如果每一种过滤和寻址组合都复制一份 Texture,会造成重复的图像存储。把图像资源和采样规则拆开后,可以把少量常用 Sampler 缓存起来:
Texture A ─┬─ LinearWrap
└─ PointClamp
Texture B ─── LinearWrap
Texture C ─── AnisotropicWrap这让资源复用、材质选择和绑定管理更灵活。图形 API 可能在 Shader 声明或 Descriptor 形式上把二者组合起来,但概念上仍可以区分。
五、不同 API 中的组合方式
| API | 常见表达 |
|---|---|
| Direct3D / HLSL | Texture 资源视图与 Sampler 分开绑定;Sampler 可由不同 Texture 采样调用复用 |
| Vulkan | Image View 与 Sampler 分别创建;Descriptor 可分开,也可以使用 Combined Image Sampler |
| OpenGL | Texture Object 持有图像数据;Sampler Object 可以单独覆盖采样状态;GLSL 常用 sampler2D 表达采样接口 |
因此看到 GLSL 的 sampler2D,不要据此推断图像存储和采样状态在概念上不可分。Shader 类型和 API 的绑定模型会把资源组合成一个采样接口。
六、Sampler 可以复用,但组合仍有约束
分离不代表任意组合都有效。使用时仍要确认:
- Texture 维度和 Shader 声明相符,例如 2D、Cube 或数组纹理;
- 纹理提供了采样模式所需的 Mip 数据;
- 比较采样与深度数据、比较规则相匹配;
- 格式、资源视图、布局和当前 Resource State 支持对应访问;
- 目标硬件与 API 支持所选过滤和扩展。
例如 Sampler 要求使用 Mip 过滤,而 Texture 没有完整 Mip 链时,可能得到不完整或不符合预期的采样结果;具体行为按 API 规则处理。
七、引擎中的数据组织
引擎通常分别管理资源,再由 Material Binding 或 Descriptor 把它们关联起来:
struct TextureBinding {
TextureHandle texture;
SamplerHandle sampler;
};底层资源管理器可以缓存标准采样器:
PointClamp
LinearClamp
LinearWrap
AnisotropicWrap
ShadowComparison材质选择合适的 Texture 和 Sampler 组合。实际绑定对象、Descriptor 数量和更新成本由图形 API 与引擎实现决定。
小结
Texture = 图像数据及其布局
Sampler = 过滤、寻址、Mip 与比较规则
Descriptor / Binding = 让 Shader 访问资源的接口同一个 Texture 可以配多个 Sampler,同一个 Sampler 也可以服务多个 Texture。它们被分开,是为了复用图像数据和采样规则,并让资源绑定更灵活。
进一步阅读:DX12 Root Signature 与 Descriptor、Vulkan 分离 Image 与 Sampler 示例、OpenGL Sampler Objects 规范。


