From bf98fa0b898f6c44349f706f186b8ff5f905e2d6 Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Mon, 16 Mar 2026 19:06:21 +0800 Subject: [PATCH] Add OpenGLRenderTargetView and OpenGLDepthStencilView --- engine/CMakeLists.txt | 4 ++ .../RHI/OpenGL/OpenGLDepthStencilView.h | 35 ++++++++++++++ .../RHI/OpenGL/OpenGLRenderTargetView.h | 28 +++++++++++ .../src/RHI/OpenGL/OpenGLDepthStencilView.cpp | 47 +++++++++++++++++++ .../src/RHI/OpenGL/OpenGLRenderTargetView.cpp | 47 +++++++++++++++++++ 5 files changed, 161 insertions(+) create mode 100644 engine/include/XCEngine/RHI/OpenGL/OpenGLDepthStencilView.h create mode 100644 engine/include/XCEngine/RHI/OpenGL/OpenGLRenderTargetView.h create mode 100644 engine/src/RHI/OpenGL/OpenGLDepthStencilView.cpp create mode 100644 engine/src/RHI/OpenGL/OpenGLRenderTargetView.cpp diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index e4cb425c..42719b05 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -136,6 +136,8 @@ add_library(XCEngine STATIC include/XCEngine/RHI/OpenGL/OpenGLSwapChain.h include/XCEngine/RHI/OpenGL/OpenGLFence.h include/XCEngine/RHI/OpenGL/OpenGLSampler.h + include/XCEngine/RHI/OpenGL/OpenGLRenderTargetView.h + include/XCEngine/RHI/OpenGL/OpenGLDepthStencilView.h src/RHI/OpenGL/OpenGLDevice.cpp src/RHI/OpenGL/OpenGLShader.cpp src/RHI/OpenGL/OpenGLBuffer.cpp @@ -146,6 +148,8 @@ add_library(XCEngine STATIC src/RHI/OpenGL/OpenGLSwapChain.cpp src/RHI/OpenGL/OpenGLFence.cpp src/RHI/OpenGL/OpenGLSampler.cpp + src/RHI/OpenGL/OpenGLRenderTargetView.cpp + src/RHI/OpenGL/OpenGLDepthStencilView.cpp ) target_include_directories(XCEngine PUBLIC diff --git a/engine/include/XCEngine/RHI/OpenGL/OpenGLDepthStencilView.h b/engine/include/XCEngine/RHI/OpenGL/OpenGLDepthStencilView.h new file mode 100644 index 00000000..ad0e6c57 --- /dev/null +++ b/engine/include/XCEngine/RHI/OpenGL/OpenGLDepthStencilView.h @@ -0,0 +1,35 @@ +#pragma once + +#include + +namespace XCEngine { +namespace RHI { + +enum class DepthStencilFormat { + D16_UNORM, + D24_UNORM_S8_UINT, + D32_FLOAT, + D32_FLOAT_S8X24_UINT +}; + +class OpenGLDepthStencilView { +public: + OpenGLDepthStencilView(); + ~OpenGLDepthStencilView(); + + bool Initialize(unsigned int texture, int mipLevel = 0); + void Shutdown(); + + void Bind(); + void Unbind(); + + unsigned int GetID() const { return m_texture; } + +private: + unsigned int m_texture; + unsigned int m_framebuffer; + int m_mipLevel; +}; + +} // namespace RHI +} // namespace XCEngine diff --git a/engine/include/XCEngine/RHI/OpenGL/OpenGLRenderTargetView.h b/engine/include/XCEngine/RHI/OpenGL/OpenGLRenderTargetView.h new file mode 100644 index 00000000..fdcbaab6 --- /dev/null +++ b/engine/include/XCEngine/RHI/OpenGL/OpenGLRenderTargetView.h @@ -0,0 +1,28 @@ +#pragma once + +#include + +namespace XCEngine { +namespace RHI { + +class OpenGLRenderTargetView { +public: + OpenGLRenderTargetView(); + ~OpenGLRenderTargetView(); + + bool Initialize(unsigned int texture, int mipLevel = 0); + void Shutdown(); + + void Bind(unsigned int slot); + void Unbind(); + + unsigned int GetID() const { return m_texture; } + +private: + unsigned int m_texture; + unsigned int m_framebuffer; + int m_mipLevel; +}; + +} // namespace RHI +} // namespace XCEngine diff --git a/engine/src/RHI/OpenGL/OpenGLDepthStencilView.cpp b/engine/src/RHI/OpenGL/OpenGLDepthStencilView.cpp new file mode 100644 index 00000000..c3810334 --- /dev/null +++ b/engine/src/RHI/OpenGL/OpenGLDepthStencilView.cpp @@ -0,0 +1,47 @@ +#define GLFW_INCLUDE_NONE +#include "XCEngine/RHI/OpenGL/OpenGLDepthStencilView.h" +#include +#include + +namespace XCEngine { +namespace RHI { + +OpenGLDepthStencilView::OpenGLDepthStencilView() : m_texture(0), m_framebuffer(0), m_mipLevel(0) { +} + +OpenGLDepthStencilView::~OpenGLDepthStencilView() { +} + +bool OpenGLDepthStencilView::Initialize(unsigned int texture, int mipLevel) { + m_texture = texture; + m_mipLevel = mipLevel; + + glGenFramebuffers(1, &m_framebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, texture, mipLevel); + + if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { + return false; + } + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + return true; +} + +void OpenGLDepthStencilView::Shutdown() { + if (m_framebuffer) { + glDeleteFramebuffers(1, &m_framebuffer); + m_framebuffer = 0; + } +} + +void OpenGLDepthStencilView::Bind() { + glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer); +} + +void OpenGLDepthStencilView::Unbind() { + glBindFramebuffer(GL_FRAMEBUFFER, 0); +} + +} // namespace RHI +} // namespace XCEngine diff --git a/engine/src/RHI/OpenGL/OpenGLRenderTargetView.cpp b/engine/src/RHI/OpenGL/OpenGLRenderTargetView.cpp new file mode 100644 index 00000000..8174cfa3 --- /dev/null +++ b/engine/src/RHI/OpenGL/OpenGLRenderTargetView.cpp @@ -0,0 +1,47 @@ +#define GLFW_INCLUDE_NONE +#include "XCEngine/RHI/OpenGL/OpenGLRenderTargetView.h" +#include +#include + +namespace XCEngine { +namespace RHI { + +OpenGLRenderTargetView::OpenGLRenderTargetView() : m_texture(0), m_framebuffer(0), m_mipLevel(0) { +} + +OpenGLRenderTargetView::~OpenGLRenderTargetView() { +} + +bool OpenGLRenderTargetView::Initialize(unsigned int texture, int mipLevel) { + m_texture = texture; + m_mipLevel = mipLevel; + + glGenFramebuffers(1, &m_framebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, mipLevel); + + if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { + return false; + } + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + return true; +} + +void OpenGLRenderTargetView::Shutdown() { + if (m_framebuffer) { + glDeleteFramebuffers(1, &m_framebuffer); + m_framebuffer = 0; + } +} + +void OpenGLRenderTargetView::Bind(unsigned int slot) { + glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer); +} + +void OpenGLRenderTargetView::Unbind() { + glBindFramebuffer(GL_FRAMEBUFFER, 0); +} + +} // namespace RHI +} // namespace XCEngine