Add OpenGLSampler
This commit is contained in:
@@ -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
|
||||
|
||||
61
engine/include/XCEngine/RHI/OpenGL/OpenGLSampler.h
Normal file
61
engine/include/XCEngine/RHI/OpenGL/OpenGLSampler.h
Normal 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
|
||||
69
engine/src/RHI/OpenGL/OpenGLSampler.cpp
Normal file
69
engine/src/RHI/OpenGL/OpenGLSampler.cpp
Normal 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
|
||||
Reference in New Issue
Block a user