Add OpenGLRenderTargetView and OpenGLDepthStencilView

This commit is contained in:
2026-03-16 19:06:21 +08:00
parent 3cd47ea4c8
commit bf98fa0b89
5 changed files with 161 additions and 0 deletions

View File

@@ -136,6 +136,8 @@ add_library(XCEngine STATIC
include/XCEngine/RHI/OpenGL/OpenGLSwapChain.h include/XCEngine/RHI/OpenGL/OpenGLSwapChain.h
include/XCEngine/RHI/OpenGL/OpenGLFence.h include/XCEngine/RHI/OpenGL/OpenGLFence.h
include/XCEngine/RHI/OpenGL/OpenGLSampler.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/OpenGLDevice.cpp
src/RHI/OpenGL/OpenGLShader.cpp src/RHI/OpenGL/OpenGLShader.cpp
src/RHI/OpenGL/OpenGLBuffer.cpp src/RHI/OpenGL/OpenGLBuffer.cpp
@@ -146,6 +148,8 @@ add_library(XCEngine STATIC
src/RHI/OpenGL/OpenGLSwapChain.cpp src/RHI/OpenGL/OpenGLSwapChain.cpp
src/RHI/OpenGL/OpenGLFence.cpp src/RHI/OpenGL/OpenGLFence.cpp
src/RHI/OpenGL/OpenGLSampler.cpp src/RHI/OpenGL/OpenGLSampler.cpp
src/RHI/OpenGL/OpenGLRenderTargetView.cpp
src/RHI/OpenGL/OpenGLDepthStencilView.cpp
) )
target_include_directories(XCEngine PUBLIC target_include_directories(XCEngine PUBLIC

View File

@@ -0,0 +1,35 @@
#pragma once
#include <GLFW/glfw3.h>
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

View File

@@ -0,0 +1,28 @@
#pragma once
#include <GLFW/glfw3.h>
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

View File

@@ -0,0 +1,47 @@
#define GLFW_INCLUDE_NONE
#include "XCEngine/RHI/OpenGL/OpenGLDepthStencilView.h"
#include <glad/glad.h>
#include <GLFW/glfw3.h>
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

View File

@@ -0,0 +1,47 @@
#define GLFW_INCLUDE_NONE
#include "XCEngine/RHI/OpenGL/OpenGLRenderTargetView.h"
#include <glad/glad.h>
#include <GLFW/glfw3.h>
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