Files
XCEngine/docs/api/XCEngine/RHI/OpenGL/OpenGLSampler/OpenGLSampler.md

66 lines
2.4 KiB
Markdown
Raw Normal View History

2026-03-26 16:45:24 +08:00
# OpenGLSampler
**命名空间**: `XCEngine::RHI`
**类型**: `class`
**头文件**: `XCEngine/RHI/OpenGL/OpenGLSampler.h`
**描述**: OpenGL 后端的独立 sampler object 封装用于保存过滤、寻址、LOD、比较采样和边框颜色等采样状态。
2026-03-26 16:45:24 +08:00
## 概览
2026-03-26 16:45:24 +08:00
`OpenGLSampler` 是当前后端里少数真正对应 OpenGL 原生对象的资源包装器之一。它的意义和现代图形 API 里的独立采样器对象一致:
2026-03-26 16:45:24 +08:00
- 纹理数据与采样状态解耦
- 同一张纹理可以复用不同采样策略
- descriptor set / resource binding 层更容易和 D3D12 / Vulkan 对齐
2026-03-26 16:45:24 +08:00
这类设计在商业引擎里非常常见,因为它能让“材质要什么采样方式”和“纹理本身存了什么像素数据”保持分离。
2026-03-26 16:45:24 +08:00
## 当前实现的真实行为
2026-03-26 16:45:24 +08:00
- [Initialize](Initialize.md) 会创建真实的 sampler object并立即写入全部采样参数
- [Bind](Bind.md) / [Unbind](Unbind.md) 直接作用于指定纹理单元
- [GetID](GetID.md) 返回 OpenGL sampler 对象名
- 析构函数为空实现,不自动 [Shutdown](Shutdown.md)
- 设备创建路径 `OpenGLDevice::CreateSampler(...)` 会先把通用 `SamplerDesc` 转成 `OpenGLSamplerDesc`
- `OpenGLDescriptorSet` 更新 sampler 时,会读取 `GetID()` 存下底层 sampler ID
## 设计背景
把 sampler 独立成对象有两个现实收益:
- 一张纹理可以被多个材质以不同过滤/寻址方式复用
- 跨后端 RHI 不必因为 OpenGL 而退化回“把采样参数写死在纹理对象里”的旧式接口
这也是商业级引擎常见的抽象路线:高层接口尽量保持现代资源模型,后端尽量映射到平台支持的最接近对象。
## 生命周期
- [OpenGLSampler()](Constructor.md) 初始化 `m_sampler = 0`
- [Initialize](Initialize.md) 创建原生 sampler object
- [Bind](Bind.md) 把它绑定到某个纹理单元
- [Shutdown](Shutdown.md) 删除 sampler object
## 重要限制
- 析构不自动释放原生 sampler
- 初始化没有显式错误检测
- 各向异性和比较采样能力依赖运行环境支持
- 直接使用 `OpenGLSamplerDesc` 时,调用方需要自己保证参数组合适合 OpenGL
## 关键方法
- [Initialize](Initialize.md)
- [Bind](Bind.md)
- [Unbind](Unbind.md)
- [GetID](GetID.md)
- [Shutdown](Shutdown.md)
2026-03-26 16:45:24 +08:00
## 相关文档
- [OpenGLDescriptorSet](../OpenGLDescriptorSet/OpenGLDescriptorSet.md)
- [OpenGLTexture](../OpenGLTexture/OpenGLTexture.md)
- [OpenGLDevice](../OpenGLDevice/OpenGLDevice.md)