From ab36fe24ec3f3aa6f41be6caaa1e043445d5f7d7 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Wed, 21 May 2025 07:10:54 +0100 Subject: [PATCH] fixes for opengl uniform buffer loading This fix allows uniform buffers to be used with glsl shaders. Small issue with uniform buffers not being initialized correctly. --- Engine/source/gfx/gl/gfxGLDevice.cpp | 4 ++++ Engine/source/gfx/gl/gfxGLShader.cpp | 5 +++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Engine/source/gfx/gl/gfxGLDevice.cpp b/Engine/source/gfx/gl/gfxGLDevice.cpp index 148a68648..766fbccd8 100644 --- a/Engine/source/gfx/gl/gfxGLDevice.cpp +++ b/Engine/source/gfx/gl/gfxGLDevice.cpp @@ -323,9 +323,13 @@ GLuint GFXGLDevice::getDeviceBuffer(const GFXShaderConstDesc desc) GLuint uboHandle; glGenBuffers(1, &uboHandle); + glBindBuffer(GL_UNIFORM_BUFFER, uboHandle); + glBufferData(GL_UNIFORM_BUFFER, desc.size, NULL, GL_DYNAMIC_DRAW); // allocate once mDeviceBufferMap[name] = uboHandle; + glBindBuffer(GL_UNIFORM_BUFFER, 0); + return uboHandle; } diff --git a/Engine/source/gfx/gl/gfxGLShader.cpp b/Engine/source/gfx/gl/gfxGLShader.cpp index e13ff1a52..ee156a6e0 100644 --- a/Engine/source/gfx/gl/gfxGLShader.cpp +++ b/Engine/source/gfx/gl/gfxGLShader.cpp @@ -713,7 +713,8 @@ void GFXGLShader::initConstantDescs() // fill out ubo desc. desc.name = String((char*)uboName); - desc.bindPoint = uboBinding; + desc.bindPoint = uboBinding == 0 ? glGetUniformBlockIndex(mProgram, uboName) : uboBinding; + glUniformBlockBinding(mProgram, glGetUniformBlockIndex(mProgram, uboName), desc.bindPoint); desc.size = uboSize; desc.constType = GFXSCT_ConstBuffer; desc.samplerReg = -1; @@ -888,7 +889,7 @@ void GFXGLShader::initHandles() // Index element 1 of the name to skip the '$' we inserted earier. GLint loc = glGetUniformLocation(mProgram, &desc.name.c_str()[1]); - AssertFatal(loc != -1, avar("uniform %s in shader file Vert: (%s) Frag: (%s)", &desc.name.c_str()[1], mVertexFile.getFullPath().c_str(), mPixelFile.getFullPath().c_str())); + //AssertFatal(loc != -1, avar("uniform %s in shader file Vert: (%s) Frag: (%s)", &desc.name.c_str()[1], mVertexFile.getFullPath().c_str(), mPixelFile.getFullPath().c_str())); HandleMap::Iterator handle = mHandles.find(desc.name); S32 sampler = -1;