66 lines
2.4 KiB
Markdown
66 lines
2.4 KiB
Markdown
# OpenGLSampler
|
||
|
||
**命名空间**: `XCEngine::RHI`
|
||
|
||
**类型**: `class`
|
||
|
||
**头文件**: `XCEngine/RHI/OpenGL/OpenGLSampler.h`
|
||
|
||
**描述**: OpenGL 后端的独立 sampler object 封装,用于保存过滤、寻址、LOD、比较采样和边框颜色等采样状态。
|
||
|
||
## 概览
|
||
|
||
`OpenGLSampler` 是当前后端里少数真正对应 OpenGL 原生对象的资源包装器之一。它的意义和现代图形 API 里的独立采样器对象一致:
|
||
|
||
- 纹理数据与采样状态解耦
|
||
- 同一张纹理可以复用不同采样策略
|
||
- descriptor set / resource binding 层更容易和 D3D12 / Vulkan 对齐
|
||
|
||
这类设计在商业引擎里非常常见,因为它能让“材质要什么采样方式”和“纹理本身存了什么像素数据”保持分离。
|
||
|
||
## 当前实现的真实行为
|
||
|
||
- [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)
|
||
|
||
## 相关文档
|
||
|
||
- [OpenGLDescriptorSet](../OpenGLDescriptorSet/OpenGLDescriptorSet.md)
|
||
- [OpenGLTexture](../OpenGLTexture/OpenGLTexture.md)
|
||
- [OpenGLDevice](../OpenGLDevice/OpenGLDevice.md)
|