refactor: Combine features and general local uniforms
This commit is contained in:
parent
92f6cab491
commit
3ebd70f5db
5 changed files with 19 additions and 57 deletions
|
@ -249,7 +249,7 @@ void Control::drawBorder(const Border &border, const glm::ivec2 &offset, const g
|
||||||
transform = glm::scale(transform, glm::vec3(w, h, 1.0f));
|
transform = glm::scale(transform, glm::vec3(w, h, 1.0f));
|
||||||
|
|
||||||
LocalUniforms locals;
|
LocalUniforms locals;
|
||||||
locals.features.discardEnabled = _discardEnabled;
|
locals.general.discardEnabled = _discardEnabled;
|
||||||
locals.general.model = move(transform);
|
locals.general.model = move(transform);
|
||||||
locals.general.discardColor = glm::vec4(_discardColor, 1.0f);
|
locals.general.discardColor = glm::vec4(_discardColor, 1.0f);
|
||||||
|
|
||||||
|
|
|
@ -79,7 +79,7 @@ void WorldRenderPipeline::render() const {
|
||||||
transform = glm::scale(transform, glm::vec3(w, h, 1.0f));
|
transform = glm::scale(transform, glm::vec3(w, h, 1.0f));
|
||||||
|
|
||||||
LocalUniforms locals;
|
LocalUniforms locals;
|
||||||
locals.features.blurEnabled = true;
|
locals.general.blurEnabled = true;
|
||||||
locals.general.model = move(transform);
|
locals.general.model = move(transform);
|
||||||
locals.general.blurResolution = glm::vec2(w, h);
|
locals.general.blurResolution = glm::vec2(w, h);
|
||||||
locals.general.blurDirection = glm::vec2(1.0f, 0.0f);
|
locals.general.blurDirection = glm::vec2(1.0f, 0.0f);
|
||||||
|
@ -110,7 +110,7 @@ void WorldRenderPipeline::render() const {
|
||||||
transform = glm::scale(transform, glm::vec3(w, h, 1.0f));
|
transform = glm::scale(transform, glm::vec3(w, h, 1.0f));
|
||||||
|
|
||||||
LocalUniforms locals;
|
LocalUniforms locals;
|
||||||
locals.features.blurEnabled = true;
|
locals.general.blurEnabled = true;
|
||||||
locals.general.model = move(transform);
|
locals.general.model = move(transform);
|
||||||
locals.general.blurResolution = glm::vec2(_opts.width, _opts.height);
|
locals.general.blurResolution = glm::vec2(_opts.width, _opts.height);
|
||||||
locals.general.blurDirection = glm::vec2(0.0f, 1.0f);
|
locals.general.blurDirection = glm::vec2(0.0f, 1.0f);
|
||||||
|
@ -133,7 +133,7 @@ void WorldRenderPipeline::render() const {
|
||||||
transform = glm::scale(transform, glm::vec3(w, h, 1.0f));
|
transform = glm::scale(transform, glm::vec3(w, h, 1.0f));
|
||||||
|
|
||||||
LocalUniforms locals;
|
LocalUniforms locals;
|
||||||
locals.features.bloomEnabled = true;
|
locals.general.bloomEnabled = true;
|
||||||
locals.general.model = move(transform);
|
locals.general.model = move(transform);
|
||||||
|
|
||||||
Shaders::instance().activate(ShaderProgram::GUIBloom, locals);
|
Shaders::instance().activate(ShaderProgram::GUIBloom, locals);
|
||||||
|
|
|
@ -50,7 +50,7 @@ struct Light {
|
||||||
float radius;
|
float radius;
|
||||||
};
|
};
|
||||||
|
|
||||||
layout(std140) uniform Features {
|
layout(std140) uniform General {
|
||||||
bool uLightmapEnabled;
|
bool uLightmapEnabled;
|
||||||
bool uEnvmapEnabled;
|
bool uEnvmapEnabled;
|
||||||
bool uBumpyShinyEnabled;
|
bool uBumpyShinyEnabled;
|
||||||
|
@ -61,9 +61,7 @@ layout(std140) uniform Features {
|
||||||
bool uBlurEnabled;
|
bool uBlurEnabled;
|
||||||
bool uBloomEnabled;
|
bool uBloomEnabled;
|
||||||
bool uDiscardEnabled;
|
bool uDiscardEnabled;
|
||||||
};
|
|
||||||
|
|
||||||
layout(std140) uniform General {
|
|
||||||
uniform mat4 uModel;
|
uniform mat4 uModel;
|
||||||
uniform vec4 uColor;
|
uniform vec4 uColor;
|
||||||
uniform float uAlpha;
|
uniform float uAlpha;
|
||||||
|
@ -336,7 +334,6 @@ void Shaders::initGL() {
|
||||||
initProgram(ShaderProgram::ModelWhite, ShaderName::VertexModel, ShaderName::FragmentWhite);
|
initProgram(ShaderProgram::ModelWhite, ShaderName::VertexModel, ShaderName::FragmentWhite);
|
||||||
initProgram(ShaderProgram::ModelModel, ShaderName::VertexModel, ShaderName::FragmentModel);
|
initProgram(ShaderProgram::ModelModel, ShaderName::VertexModel, ShaderName::FragmentModel);
|
||||||
|
|
||||||
glGenBuffers(1, &_featuresUbo);
|
|
||||||
glGenBuffers(1, &_generalUbo);
|
glGenBuffers(1, &_generalUbo);
|
||||||
glGenBuffers(1, &_lightingUbo);
|
glGenBuffers(1, &_lightingUbo);
|
||||||
glGenBuffers(1, &_skeletalUbo);
|
glGenBuffers(1, &_skeletalUbo);
|
||||||
|
@ -345,13 +342,11 @@ void Shaders::initGL() {
|
||||||
glUseProgram(program.second);
|
glUseProgram(program.second);
|
||||||
_activeOrdinal = program.second;
|
_activeOrdinal = program.second;
|
||||||
|
|
||||||
uint32_t featuresBlockIdx = glGetUniformBlockIndex(_activeOrdinal, "Features");
|
|
||||||
if (featuresBlockIdx != GL_INVALID_INDEX) {
|
|
||||||
glUniformBlockBinding(_activeOrdinal, featuresBlockIdx, kFeaturesBindingPointIndex);
|
|
||||||
}
|
|
||||||
uint32_t generalBlockIdx = glGetUniformBlockIndex(_activeOrdinal, "General");
|
uint32_t generalBlockIdx = glGetUniformBlockIndex(_activeOrdinal, "General");
|
||||||
if (generalBlockIdx != GL_INVALID_INDEX) {
|
if (generalBlockIdx != GL_INVALID_INDEX) {
|
||||||
glUniformBlockBinding(_activeOrdinal, generalBlockIdx, kGeneralBindingPointIndex);
|
glUniformBlockBinding(_activeOrdinal, generalBlockIdx, kGeneralBindingPointIndex);
|
||||||
|
//GLint blockSize;
|
||||||
|
//glGetActiveUniformBlockiv(_activeOrdinal, generalBlockIdx, GL_UNIFORM_BLOCK_DATA_SIZE, &blockSize);
|
||||||
}
|
}
|
||||||
uint32_t lightingBlockIdx = glGetUniformBlockIndex(_activeOrdinal, "Lighting");
|
uint32_t lightingBlockIdx = glGetUniformBlockIndex(_activeOrdinal, "Lighting");
|
||||||
if (lightingBlockIdx != GL_INVALID_INDEX) {
|
if (lightingBlockIdx != GL_INVALID_INDEX) {
|
||||||
|
@ -431,10 +426,6 @@ void Shaders::deinitGL() {
|
||||||
glDeleteBuffers(1, &_generalUbo);
|
glDeleteBuffers(1, &_generalUbo);
|
||||||
_generalUbo = 0;
|
_generalUbo = 0;
|
||||||
}
|
}
|
||||||
if (_featuresUbo) {
|
|
||||||
glDeleteBuffers(1, &_featuresUbo);
|
|
||||||
_featuresUbo = 0;
|
|
||||||
}
|
|
||||||
for (auto &pair :_programs) {
|
for (auto &pair :_programs) {
|
||||||
glDeleteProgram(pair.second);
|
glDeleteProgram(pair.second);
|
||||||
}
|
}
|
||||||
|
@ -466,22 +457,14 @@ unsigned int Shaders::getOrdinal(ShaderProgram program) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Shaders::setLocalUniforms(const LocalUniforms &locals) {
|
void Shaders::setLocalUniforms(const LocalUniforms &locals) {
|
||||||
static unordered_map<ShaderProgram, FeatureUniforms> features;
|
|
||||||
|
|
||||||
auto maybeFeatures = features.find(_activeProgram);
|
|
||||||
if (maybeFeatures == features.end() || maybeFeatures->second != locals.features) {
|
|
||||||
glBindBufferBase(GL_UNIFORM_BUFFER, kFeaturesBindingPointIndex, _featuresUbo);
|
|
||||||
glBufferData(GL_UNIFORM_BUFFER, sizeof(FeatureUniforms), &locals.features, GL_STATIC_DRAW);
|
|
||||||
features[_activeProgram] = locals.features;
|
|
||||||
}
|
|
||||||
glBindBufferBase(GL_UNIFORM_BUFFER, kGeneralBindingPointIndex, _generalUbo);
|
glBindBufferBase(GL_UNIFORM_BUFFER, kGeneralBindingPointIndex, _generalUbo);
|
||||||
glBufferData(GL_UNIFORM_BUFFER, sizeof(GeneralUniforms), &locals.general, GL_STATIC_DRAW);
|
glBufferData(GL_UNIFORM_BUFFER, sizeof(GeneralUniforms), &locals.general, GL_STATIC_DRAW);
|
||||||
|
|
||||||
if (locals.features.skeletalEnabled) {
|
if (locals.general.skeletalEnabled) {
|
||||||
glBindBufferBase(GL_UNIFORM_BUFFER, kSkeletalBindingPointIndex, _skeletalUbo);
|
glBindBufferBase(GL_UNIFORM_BUFFER, kSkeletalBindingPointIndex, _skeletalUbo);
|
||||||
glBufferData(GL_UNIFORM_BUFFER, sizeof(SkeletalUniforms), locals.skeletal.get(), GL_STATIC_DRAW);
|
glBufferData(GL_UNIFORM_BUFFER, sizeof(SkeletalUniforms), locals.skeletal.get(), GL_STATIC_DRAW);
|
||||||
}
|
}
|
||||||
if (locals.features.lightingEnabled) {
|
if (locals.general.lightingEnabled) {
|
||||||
glBindBufferBase(GL_UNIFORM_BUFFER, kLightingBindingPointIndex, _lightingUbo);
|
glBindBufferBase(GL_UNIFORM_BUFFER, kLightingBindingPointIndex, _lightingUbo);
|
||||||
glBufferData(GL_UNIFORM_BUFFER, sizeof(LightingUniforms), locals.lighting.get(), GL_STATIC_DRAW);
|
glBufferData(GL_UNIFORM_BUFFER, sizeof(LightingUniforms), locals.lighting.get(), GL_STATIC_DRAW);
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,7 +57,7 @@ struct GlobalUniforms {
|
||||||
glm::vec3 cameraPosition { 0.0f };
|
glm::vec3 cameraPosition { 0.0f };
|
||||||
};
|
};
|
||||||
|
|
||||||
struct FeatureUniforms {
|
struct GeneralUniforms {
|
||||||
int lightmapEnabled { false };
|
int lightmapEnabled { false };
|
||||||
int envmapEnabled { false };
|
int envmapEnabled { false };
|
||||||
int bumpyShinyEnabled { false };
|
int bumpyShinyEnabled { false };
|
||||||
|
@ -68,31 +68,12 @@ struct FeatureUniforms {
|
||||||
int blurEnabled { false };
|
int blurEnabled { false };
|
||||||
int bloomEnabled { false };
|
int bloomEnabled { false };
|
||||||
int discardEnabled { false };
|
int discardEnabled { false };
|
||||||
|
char padding1[8];
|
||||||
|
|
||||||
bool operator==(const FeatureUniforms &other) {
|
|
||||||
return
|
|
||||||
lightmapEnabled == other.lightmapEnabled &&
|
|
||||||
envmapEnabled == other.envmapEnabled &&
|
|
||||||
bumpyShinyEnabled == other.bumpyShinyEnabled &&
|
|
||||||
bumpmapEnabled == other.bumpmapEnabled &&
|
|
||||||
skeletalEnabled == other.skeletalEnabled &&
|
|
||||||
lightingEnabled == other.lightingEnabled &&
|
|
||||||
selfIllumEnabled == other.selfIllumEnabled &&
|
|
||||||
blurEnabled == other.blurEnabled &&
|
|
||||||
bloomEnabled == other.bloomEnabled &&
|
|
||||||
discardEnabled == other.discardEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator!=(const FeatureUniforms &other) {
|
|
||||||
return !operator==(other);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct GeneralUniforms {
|
|
||||||
glm::mat4 model { 1.0f };
|
glm::mat4 model { 1.0f };
|
||||||
glm::vec4 color { 1.0f };
|
glm::vec4 color { 1.0f };
|
||||||
float alpha { 1.0f };
|
float alpha { 1.0f };
|
||||||
char padding[12];
|
char padding2[12];
|
||||||
glm::vec4 selfIllumColor { 1.0f };
|
glm::vec4 selfIllumColor { 1.0f };
|
||||||
glm::vec4 discardColor { 0.0f };
|
glm::vec4 discardColor { 0.0f };
|
||||||
glm::vec2 blurResolution { 0.0f };
|
glm::vec2 blurResolution { 0.0f };
|
||||||
|
@ -120,7 +101,6 @@ struct LightingUniforms {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct LocalUniforms {
|
struct LocalUniforms {
|
||||||
FeatureUniforms features;
|
|
||||||
GeneralUniforms general;
|
GeneralUniforms general;
|
||||||
std::shared_ptr<SkeletalUniforms> skeletal;
|
std::shared_ptr<SkeletalUniforms> skeletal;
|
||||||
std::shared_ptr<LightingUniforms> lighting;
|
std::shared_ptr<LightingUniforms> lighting;
|
||||||
|
@ -160,7 +140,6 @@ private:
|
||||||
|
|
||||||
// Uniform buffer objects
|
// Uniform buffer objects
|
||||||
|
|
||||||
uint32_t _featuresUbo { 0 };
|
|
||||||
uint32_t _generalUbo { 0 };
|
uint32_t _generalUbo { 0 };
|
||||||
uint32_t _lightingUbo { 0 };
|
uint32_t _lightingUbo { 0 };
|
||||||
uint32_t _skeletalUbo { 0 };
|
uint32_t _skeletalUbo { 0 };
|
||||||
|
|
|
@ -72,19 +72,19 @@ void ModelNodeSceneNode::renderSingle() const {
|
||||||
locals.general.alpha = _modelSceneNode->alpha() * _modelNode->alpha();
|
locals.general.alpha = _modelSceneNode->alpha() * _modelNode->alpha();
|
||||||
|
|
||||||
if (mesh->hasEnvmapTexture()) {
|
if (mesh->hasEnvmapTexture()) {
|
||||||
locals.features.envmapEnabled = true;
|
locals.general.envmapEnabled = true;
|
||||||
}
|
}
|
||||||
if (mesh->hasLightmapTexture()) {
|
if (mesh->hasLightmapTexture()) {
|
||||||
locals.features.lightmapEnabled = true;
|
locals.general.lightmapEnabled = true;
|
||||||
}
|
}
|
||||||
if (mesh->hasBumpyShinyTexture()) {
|
if (mesh->hasBumpyShinyTexture()) {
|
||||||
locals.features.bumpyShinyEnabled = true;
|
locals.general.bumpyShinyEnabled = true;
|
||||||
}
|
}
|
||||||
if (mesh->hasBumpmapTexture()) {
|
if (mesh->hasBumpmapTexture()) {
|
||||||
locals.features.bumpmapEnabled = true;
|
locals.general.bumpmapEnabled = true;
|
||||||
}
|
}
|
||||||
if (skeletal) {
|
if (skeletal) {
|
||||||
locals.features.skeletalEnabled = true;
|
locals.general.skeletalEnabled = true;
|
||||||
locals.skeletal = Shaders::instance().skeletalUniforms();
|
locals.skeletal = Shaders::instance().skeletalUniforms();
|
||||||
locals.skeletal->absTransform = _modelNode->absoluteTransform();
|
locals.skeletal->absTransform = _modelNode->absoluteTransform();
|
||||||
locals.skeletal->absTransformInv = _modelNode->absoluteTransformInverse();
|
locals.skeletal->absTransformInv = _modelNode->absoluteTransformInverse();
|
||||||
|
@ -103,7 +103,7 @@ void ModelNodeSceneNode::renderSingle() const {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (_modelNode->isSelfIllumEnabled()) {
|
if (_modelNode->isSelfIllumEnabled()) {
|
||||||
locals.features.selfIllumEnabled = true;
|
locals.general.selfIllumEnabled = true;
|
||||||
locals.general.selfIllumColor = glm::vec4(_modelNode->selfIllumColor(), 1.0f);
|
locals.general.selfIllumColor = glm::vec4(_modelNode->selfIllumColor(), 1.0f);
|
||||||
}
|
}
|
||||||
int lightCount = 0;
|
int lightCount = 0;
|
||||||
|
@ -111,7 +111,7 @@ void ModelNodeSceneNode::renderSingle() const {
|
||||||
if (_modelSceneNode->isLightingEnabled()) {
|
if (_modelSceneNode->isLightingEnabled()) {
|
||||||
const vector<LightSceneNode *> &lights = _modelSceneNode->lightsAffectedBy();
|
const vector<LightSceneNode *> &lights = _modelSceneNode->lightsAffectedBy();
|
||||||
|
|
||||||
locals.features.lightingEnabled = true;
|
locals.general.lightingEnabled = true;
|
||||||
locals.lighting = Shaders::instance().lightingUniforms();
|
locals.lighting = Shaders::instance().lightingUniforms();
|
||||||
locals.lighting->ambientLightColor = glm::vec4(_sceneGraph->ambientLightColor(), 1.0f);
|
locals.lighting->ambientLightColor = glm::vec4(_sceneGraph->ambientLightColor(), 1.0f);
|
||||||
locals.lighting->lightCount = static_cast<int>(lights.size());
|
locals.lighting->lightCount = static_cast<int>(lights.size());
|
||||||
|
|
Loading…
Reference in a new issue