Skip to content

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,阴影深度使用比较采样。

text
Texture:有哪些图像数据
Sampler:坐标越界怎么办、像素如何过滤、选哪级 Mip

三、一个 Texture 配多个 Sampler ​

HLSL 中通常可以分别声明:

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 缓存起来:

text
Texture A ─┬─ LinearWrap
           └─ PointClamp
Texture B ─── LinearWrap
Texture C ─── AnisotropicWrap

这让资源复用、材质选择和绑定管理更灵活。图形 API 可能在 Shader 声明或 Descriptor 形式上把二者组合起来,但概念上仍可以区分。

五、不同 API 中的组合方式 ​

API常见表达
Direct3D / HLSLTexture 资源视图与 Sampler 分开绑定;Sampler 可由不同 Texture 采样调用复用
VulkanImage View 与 Sampler 分别创建;Descriptor 可分开,也可以使用 Combined Image Sampler
OpenGLTexture 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 把它们关联起来:

cpp
struct TextureBinding {
    TextureHandle texture;
    SamplerHandle sampler;
};

底层资源管理器可以缓存标准采样器:

text
PointClamp
LinearClamp
LinearWrap
AnisotropicWrap
ShadowComparison

材质选择合适的 Texture 和 Sampler 组合。实际绑定对象、Descriptor 数量和更新成本由图形 API 与引擎实现决定。

小结 ​

text
Texture = 图像数据及其布局
Sampler = 过滤、寻址、Mip 与比较规则
Descriptor / Binding = 让 Shader 访问资源的接口

同一个 Texture 可以配多个 Sampler,同一个 Sampler 也可以服务多个 Texture。它们被分开,是为了复用图像数据和采样规则,并让资源绑定更灵活。

进一步阅读:DX12 Root Signature 与 Descriptor、Vulkan 分离 Image 与 Sampler 示例、OpenGL Sampler Objects 规范。

← 上一篇:2x2 Pixel Quad 与纹理采样指令 · 返回学习路线