From 3cd47ea4c8c6e1bd24639fd95ac29ae9101361a1 Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Mon, 16 Mar 2026 18:52:00 +0800 Subject: [PATCH] Add OpenGLSampler --- engine/CMakeLists.txt | 2 + .../XCEngine/RHI/OpenGL/OpenGLSampler.h | 61 ++++++++++++++++ engine/src/RHI/OpenGL/OpenGLSampler.cpp | 69 +++++++++++++++++++ 3 files changed, 132 insertions(+) create mode 100644 engine/include/XCEngine/RHI/OpenGL/OpenGLSampler.h create mode 100644 engine/src/RHI/OpenGL/OpenGLSampler.cpp diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index 6c92b268..e4cb425c 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -135,6 +135,7 @@ add_library(XCEngine STATIC include/XCEngine/RHI/OpenGL/OpenGLCommandList.h include/XCEngine/RHI/OpenGL/OpenGLSwapChain.h include/XCEngine/RHI/OpenGL/OpenGLFence.h + include/XCEngine/RHI/OpenGL/OpenGLSampler.h src/RHI/OpenGL/OpenGLDevice.cpp src/RHI/OpenGL/OpenGLShader.cpp src/RHI/OpenGL/OpenGLBuffer.cpp @@ -144,6 +145,7 @@ add_library(XCEngine STATIC src/RHI/OpenGL/OpenGLCommandList.cpp src/RHI/OpenGL/OpenGLSwapChain.cpp src/RHI/OpenGL/OpenGLFence.cpp + src/RHI/OpenGL/OpenGLSampler.cpp ) target_include_directories(XCEngine PUBLIC diff --git a/engine/include/XCEngine/RHI/OpenGL/OpenGLSampler.h b/engine/include/XCEngine/RHI/OpenGL/OpenGLSampler.h new file mode 100644 index 00000000..8dee4e9e --- /dev/null +++ b/engine/include/XCEngine/RHI/OpenGL/OpenGLSampler.h @@ -0,0 +1,61 @@ +#pragma once + +#include + +namespace XCEngine { +namespace RHI { + +enum class SamplerWrapMode { + Repeat, + MirroredRepeat, + ClampToEdge, + ClampToBorder +}; + +enum class SamplerFilter { + Nearest, + Linear, + NearestMipmapNearest, + LinearMipmapNearest, + NearestMipmapLinear, + LinearMipmapLinear +}; + +enum class SamplerCompareMode { + None, + CompareToRef +}; + +struct SamplerDesc { + SamplerFilter minFilter = SamplerFilter::LinearMipmapLinear; + SamplerFilter magFilter = SamplerFilter::Linear; + SamplerWrapMode wrapS = SamplerWrapMode::Repeat; + SamplerWrapMode wrapT = SamplerWrapMode::Repeat; + SamplerWrapMode wrapR = SamplerWrapMode::Repeat; + SamplerCompareMode compareMode = SamplerCompareMode::None; + int compareFunc = 0; + float maxAnisotropy = 1.0f; + float minLod = -1000.0f; + float maxLod = 1000.0f; +}; + +class OpenGLSampler { +public: + OpenGLSampler(); + ~OpenGLSampler(); + + bool Initialize(const SamplerDesc& desc); + void Shutdown(); + + void Bind(unsigned int unit); + void Unbind(unsigned int unit); + + unsigned int GetID() const { return m_sampler; } + +private: + unsigned int m_sampler; + SamplerDesc m_desc; +}; + +} // namespace RHI +} // namespace XCEngine diff --git a/engine/src/RHI/OpenGL/OpenGLSampler.cpp b/engine/src/RHI/OpenGL/OpenGLSampler.cpp new file mode 100644 index 00000000..3596a0ca --- /dev/null +++ b/engine/src/RHI/OpenGL/OpenGLSampler.cpp @@ -0,0 +1,69 @@ +#define GLFW_INCLUDE_NONE +#include "XCEngine/RHI/OpenGL/OpenGLSampler.h" +#include +#include + +namespace XCEngine { +namespace RHI { + +static unsigned int ToGLWrapMode(SamplerWrapMode mode) { + switch (mode) { + case SamplerWrapMode::Repeat: return GL_REPEAT; + case SamplerWrapMode::MirroredRepeat: return GL_MIRRORED_REPEAT; + case SamplerWrapMode::ClampToEdge: return GL_CLAMP_TO_EDGE; + case SamplerWrapMode::ClampToBorder: return GL_CLAMP_TO_BORDER; + default: return GL_REPEAT; + } +} + +static unsigned int ToGLFilter(SamplerFilter filter) { + switch (filter) { + case SamplerFilter::Nearest: return GL_NEAREST; + case SamplerFilter::Linear: return GL_LINEAR; + case SamplerFilter::NearestMipmapNearest: return GL_NEAREST_MIPMAP_NEAREST; + case SamplerFilter::LinearMipmapNearest: return GL_LINEAR_MIPMAP_NEAREST; + case SamplerFilter::NearestMipmapLinear: return GL_NEAREST_MIPMAP_LINEAR; + case SamplerFilter::LinearMipmapLinear: return GL_LINEAR_MIPMAP_LINEAR; + default: return GL_LINEAR; + } +} + +OpenGLSampler::OpenGLSampler() : m_sampler(0) { +} + +OpenGLSampler::~OpenGLSampler() { +} + +bool OpenGLSampler::Initialize(const SamplerDesc& desc) { + m_desc = desc; + glGenSamplers(1, &m_sampler); + + glSamplerParameteri(m_sampler, GL_TEXTURE_MIN_FILTER, ToGLFilter(desc.minFilter)); + glSamplerParameteri(m_sampler, GL_TEXTURE_MAG_FILTER, ToGLFilter(desc.magFilter)); + glSamplerParameteri(m_sampler, GL_TEXTURE_WRAP_S, ToGLWrapMode(desc.wrapS)); + glSamplerParameteri(m_sampler, GL_TEXTURE_WRAP_T, ToGLWrapMode(desc.wrapT)); + glSamplerParameteri(m_sampler, GL_TEXTURE_WRAP_R, ToGLWrapMode(desc.wrapR)); + glSamplerParameterf(m_sampler, GL_TEXTURE_MIN_LOD, desc.minLod); + glSamplerParameterf(m_sampler, GL_TEXTURE_MAX_LOD, desc.maxLod); + glSamplerParameterf(m_sampler, GL_TEXTURE_MAX_ANISOTROPY, desc.maxAnisotropy); + + return true; +} + +void OpenGLSampler::Shutdown() { + if (m_sampler) { + glDeleteSamplers(1, &m_sampler); + m_sampler = 0; + } +} + +void OpenGLSampler::Bind(unsigned int unit) { + glBindSampler(unit, m_sampler); +} + +void OpenGLSampler::Unbind(unsigned int unit) { + glBindSampler(unit, 0); +} + +} // namespace RHI +} // namespace XCEngine