Add OpenGLSampler

This commit is contained in:
2026-03-16 18:52:00 +08:00
parent aee4ae88db
commit 3cd47ea4c8
3 changed files with 132 additions and 0 deletions

View File

@@ -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

View File

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

View File

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