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