add multisampled fbo support + multisampled fixes

This commit is contained in:
Green Sky 2022-02-17 16:27:49 +01:00
parent 4304701e5e
commit 60aca24ec6
4 changed files with 20 additions and 8 deletions

View File

@ -47,7 +47,11 @@ FBOBuilder& FBOBuilder::attachTexture(std::shared_ptr<Texture> tex, GLuint attac
} }
//glFramebufferTexture2D(target, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex->getHandle(), 0); //glFramebufferTexture2D(target, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex->getHandle(), 0);
glFramebufferTexture2D(target, attachment_type, GL_TEXTURE_2D, tex->getHandle(), 0); if (tex->samples == 0u) {
glFramebufferTexture2D(target, attachment_type, GL_TEXTURE_2D, tex->getHandle(), 0);
} else {
glFramebufferTexture2D(target, attachment_type, GL_TEXTURE_2D_MULTISAMPLE, tex->getHandle(), 0);
}
_fbo->_texAttachments.push_back(tex); // keep a ref at the fbo _fbo->_texAttachments.push_back(tex); // keep a ref at the fbo
return *this; return *this;

View File

@ -17,10 +17,10 @@ Texture::Texture(
uint32_t handle, uint32_t handle,
int32_t width_, int32_t height_, int32_t width_, int32_t height_,
int32_t internalFormat, int32_t format, int32_t type, int32_t internalFormat, int32_t format, int32_t type,
uint32_t samples uint32_t samples_
) : _handle(handle), width(width_), height(height_), ) : _handle(handle), width(width_), height(height_),
_internalFormat(internalFormat), _format(format), _type(type), samples(samples_),
_samples(samples) { _internalFormat(internalFormat), _format(format), _type(type) {
} }
Texture::~Texture(void) { Texture::~Texture(void) {
@ -34,7 +34,7 @@ void Texture::unbind(void) const {
void Texture::bind(uint32_t slot) const { void Texture::bind(uint32_t slot) const {
glActiveTexture(GL_TEXTURE0 + slot); glActiveTexture(GL_TEXTURE0 + slot);
if (_samples == 0) { if (samples == 0) {
glBindTexture(GL_TEXTURE_2D, _handle); glBindTexture(GL_TEXTURE_2D, _handle);
} else { } else {
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _handle); glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _handle);
@ -44,12 +44,12 @@ void Texture::bind(uint32_t slot) const {
void Texture::resize(int32_t new_width, int32_t new_height) { void Texture::resize(int32_t new_width, int32_t new_height) {
// if (glTexImage2D == true) // if (glTexImage2D == true)
if (_samples == 0) { if (samples == 0) {
glBindTexture(GL_TEXTURE_2D, _handle); glBindTexture(GL_TEXTURE_2D, _handle);
glTexImage2D(GL_TEXTURE_2D, 0, _internalFormat, new_width, new_height, 0, _format, _type, NULL); glTexImage2D(GL_TEXTURE_2D, 0, _internalFormat, new_width, new_height, 0, _format, _type, NULL);
} else { } else {
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _handle); glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _handle);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, _samples, _internalFormat, new_width, new_height, 0); glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, _internalFormat, new_width, new_height, 0);
} }
// HACK: super dirty // HACK: super dirty

View File

@ -30,11 +30,12 @@ namespace MM::OpenGL {
int32_t const width; int32_t const width;
int32_t const height; int32_t const height;
//int32_t const bpp; // bits per pixel //int32_t const bpp; // bits per pixel
uint32_t const samples{0u}; // sample count, 0 == off
private: private:
int32_t const _internalFormat; int32_t const _internalFormat;
int32_t const _format; int32_t const _format;
int32_t const _type; int32_t const _type;
uint32_t const _samples{0u}; // sample count, 0 == off
public: public:
~Texture(); ~Texture();

View File

@ -31,5 +31,12 @@ namespace MM::OpenGL {
} }
}; };
struct TextureLoaderEmptyMultiSampled final {
template<typename... Args>
std::shared_ptr<Texture> load(Args&& ... args) const {
return Texture::createEmptyMultiSampled(std::forward<Args>(args)...);
}
};
} // MM::OpenGL } // MM::OpenGL