2.7 KiB
2.7 KiB
OpenGLPipelineState
命名空间: XCEngine::RHI
类型: class
头文件: XCEngine/RHI/OpenGL/OpenGLPipelineState.h
描述: OpenGL 后端的 RHIPipelineState 实现。它统一接受跨后端管线描述,但真实行为更接近“绑定时写回状态”的 CPU 侧状态容器,而不是显式 API 意义上的原生 PSO。
角色概述
OpenGL 没有 D3D12/Vulkan 那样的标准化 native PSO 语义,因此 OpenGLPipelineState 的职责不是预编译一个不可变的 GPU 管线对象,而是把高层状态先缓存下来,在 Bind() 时按需写回 OpenGL 上下文。
这类设计在商业引擎里非常常见:抽象层仍然保持现代 PSO 形状,后端实现则承认旧式状态机 API 的现实。
当前实现要点
Bind()会优先绑定 compute program,否则绑定 graphics programApply()负责把缓存的深度/模板、混合和光栅化状态写回 OpenGL- viewport 与 scissor 仍由独立方法处理
同时需要明确几件事情:
- SetRenderTargetFormats 当前基本是占位接口
- SetSampleCount 当前基本是占位接口
- SetSampleQuality 当前同样是占位接口
- GetHash 目前也不是严格的跨状态稳定键
- IsValid 近似恒为
true - EnsureValid 当前为空实现
为什么仍然保留 SetSampleQuality
虽然当前 OpenGL 后端并没有把 sample quality 落到真实状态,但接口仍然保留,原因并不奇怪:
- 上层渲染器希望使用统一的
RHIPipelineState契约 - 文档需要如实说明“该字段在 OpenGL 后端尚未真正消费”
- 将来如果后端补充更细的多重采样策略,不需要再改上层 API
这正是重构期商业引擎常见的渐进式契约策略。
重点限制
- 它不是原生 OpenGL pipeline object
- 它不是不可变对象,状态可以被持续覆盖
- MSAA 相关接口当前只保留抽象层形状,不代表后端已经完整支持
关键方法
- Bind
- Apply
- SetComputeShader
- SetOwnedGraphicsShader
- SetBlendState
- SetDepthStencilState
- SetRasterizerState
- SetSampleCount
- SetSampleQuality