Formalize cubemap skybox pipeline across backends

This commit is contained in:
2026-04-06 01:37:04 +08:00
parent 66a6818b89
commit f014ae6e6f
24 changed files with 549 additions and 196 deletions

View File

@@ -2,6 +2,8 @@
#include "XCEngine/RHI/OpenGL/OpenGLPipelineLayout.h"
#include "XCEngine/RHI/OpenGL/OpenGLTextureUnitAllocator.h"
#include "XCEngine/RHI/OpenGL/OpenGLResourceView.h"
#include "XCEngine/RHI/OpenGL/OpenGLEnums.h"
#include "XCEngine/RHI/OpenGL/OpenGLTexture.h"
#include "XCEngine/RHI/OpenGL/OpenGLSampler.h"
#include <glad/glad.h>
@@ -81,6 +83,7 @@ bool OpenGLDescriptorSet::Initialize(OpenGLTextureUnitAllocator* allocator, uint
m_bindings[i].count = layout.bindings[i].count;
m_bindings[i].textureUnits.resize(layout.bindings[i].count);
m_bindings[i].textureIds.resize(layout.bindings[i].count, 0);
m_bindings[i].textureTargets.resize(layout.bindings[i].count, GL_TEXTURE_2D);
m_bindings[i].samplerIds.resize(layout.bindings[i].count, 0);
if (m_bindings[i].type != DescriptorType::SRV &&
@@ -159,6 +162,9 @@ void OpenGLDescriptorSet::Update(uint32_t offset, RHIResourceView* view) {
OpenGLResourceView* glView = static_cast<OpenGLResourceView*>(view);
binding->textureIds[0] = glView->GetTexture();
if (const OpenGLTexture* texture = glView->GetTextureResource()) {
binding->textureTargets[0] = static_cast<uint32_t>(ToOpenGL(texture->GetOpenGLType()));
}
}
void OpenGLDescriptorSet::UpdateSampler(uint32_t offset, RHISampler* sampler) {
@@ -200,7 +206,9 @@ void OpenGLDescriptorSet::Bind() {
if (textureId != 0 && binding.type != DescriptorType::Sampler) {
glActiveTexture(GL_TEXTURE0 + unit);
glBindTexture(GL_TEXTURE_2D, textureId);
glBindTexture(
j < binding.textureTargets.size() ? binding.textureTargets[j] : GL_TEXTURE_2D,
textureId);
}
if (samplerId != 0) {
@@ -246,7 +254,9 @@ void OpenGLDescriptorSet::BindWithPipelineLayout(const OpenGLPipelineLayout* pip
glBindImageTexture(bindingPoint, textureId, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA8);
} else if (binding.type != DescriptorType::Sampler) {
glActiveTexture(GL_TEXTURE0 + bindingPoint);
glBindTexture(GL_TEXTURE_2D, textureId);
glBindTexture(
i < binding.textureTargets.size() ? binding.textureTargets[i] : GL_TEXTURE_2D,
textureId);
}
}
@@ -276,7 +286,9 @@ void OpenGLDescriptorSet::Unbind() {
uint32_t unit = binding.textureUnits[j];
glActiveTexture(GL_TEXTURE0 + unit);
glBindTexture(GL_TEXTURE_2D, 0);
glBindTexture(
j < binding.textureTargets.size() ? binding.textureTargets[j] : GL_TEXTURE_2D,
0);
glBindSampler(unit, 0);
}
}