2026-03-16 18:52:00 +08:00
|
|
|
#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() {
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-17 17:31:32 +08:00
|
|
|
bool OpenGLSampler::Initialize(const OpenGLSamplerDesc& desc) {
|
2026-03-16 18:52:00 +08:00
|
|
|
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
|