Skip to content

Commit 4da8ea8

Browse files
authored
Merge pull request pezcode#6 from alekseyt/hastextures-bitmask
Packing PBR texture flags into bitmask instead of using two uniforms
2 parents 38459c9 + ec598f0 commit 4da8ea8

3 files changed

Lines changed: 21 additions & 30 deletions

File tree

src/Renderer/PBRShader.cpp

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@ PBRShader::PBRShader() :
88
baseColorFactorUniform(BGFX_INVALID_HANDLE),
99
metallicRoughnessNormalOcclusionFactorUniform(BGFX_INVALID_HANDLE),
1010
emissiveFactorUniform(BGFX_INVALID_HANDLE),
11-
hasTextures1Uniform(BGFX_INVALID_HANDLE),
12-
hasTextures2Uniform(BGFX_INVALID_HANDLE),
11+
hasTexturesUniform(BGFX_INVALID_HANDLE),
1312
baseColorSampler(BGFX_INVALID_HANDLE),
1413
metallicRoughnessSampler(BGFX_INVALID_HANDLE),
1514
normalSampler(BGFX_INVALID_HANDLE),
@@ -25,8 +24,7 @@ void PBRShader::initialize()
2524
metallicRoughnessNormalOcclusionFactorUniform =
2625
bgfx::createUniform("u_metallicRoughnessNormalOcclusionFactor", bgfx::UniformType::Vec4);
2726
emissiveFactorUniform = bgfx::createUniform("u_emissiveFactorVec", bgfx::UniformType::Vec4);
28-
hasTextures1Uniform = bgfx::createUniform("u_hasTextures1", bgfx::UniformType::Vec4);
29-
hasTextures2Uniform = bgfx::createUniform("u_hasTextures2", bgfx::UniformType::Vec4);
27+
hasTexturesUniform = bgfx::createUniform("u_hasTextures", bgfx::UniformType::Vec4);
3028
baseColorSampler = bgfx::createUniform("s_texBaseColor", bgfx::UniformType::Sampler);
3129
metallicRoughnessSampler = bgfx::createUniform("s_texMetallicRoughness", bgfx::UniformType::Sampler);
3230
normalSampler = bgfx::createUniform("s_texNormal", bgfx::UniformType::Sampler);
@@ -41,8 +39,7 @@ void PBRShader::shutdown()
4139
bgfx::destroy(baseColorFactorUniform);
4240
bgfx::destroy(metallicRoughnessNormalOcclusionFactorUniform);
4341
bgfx::destroy(emissiveFactorUniform);
44-
bgfx::destroy(hasTextures1Uniform);
45-
bgfx::destroy(hasTextures2Uniform);
42+
bgfx::destroy(hasTexturesUniform);
4643
bgfx::destroy(baseColorSampler);
4744
bgfx::destroy(metallicRoughnessSampler);
4845
bgfx::destroy(normalSampler);
@@ -51,7 +48,7 @@ void PBRShader::shutdown()
5148
bgfx::destroy(defaultTexture);
5249

5350
baseColorFactorUniform = metallicRoughnessNormalOcclusionFactorUniform = emissiveFactorUniform =
54-
hasTextures1Uniform = hasTextures2Uniform = baseColorSampler = metallicRoughnessSampler = normalSampler =
51+
hasTexturesUniform = baseColorSampler = metallicRoughnessSampler = normalSampler =
5552
occlusionSampler = emissiveSampler = BGFX_INVALID_HANDLE;
5653
defaultTexture = BGFX_INVALID_HANDLE;
5754
}
@@ -66,8 +63,7 @@ uint64_t PBRShader::bindMaterial(const Material& material)
6663
glm::vec4 emissiveFactor = glm::vec4(material.emissiveFactor, 0.0f);
6764
bgfx::setUniform(emissiveFactorUniform, glm::value_ptr(emissiveFactor));
6865

69-
float hasTextures1Values[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
70-
float hasTextures2Values[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
66+
float hasTexturesValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
7167

7268
auto setTextureOrDefault = [&](uint8_t stage, bgfx::UniformHandle uniform, bgfx::TextureHandle texture) -> bool {
7369
bool valid = bgfx::isValid(texture);
@@ -77,18 +73,15 @@ uint64_t PBRShader::bindMaterial(const Material& material)
7773
return valid;
7874
};
7975

80-
hasTextures1Values[0] =
81-
(float)setTextureOrDefault(Samplers::PBR_BASECOLOR, baseColorSampler, material.baseColorTexture);
82-
hasTextures1Values[1] = (float)setTextureOrDefault(
83-
Samplers::PBR_METALROUGHNESS, metallicRoughnessSampler, material.metallicRoughnessTexture);
84-
hasTextures1Values[2] = (float)setTextureOrDefault(Samplers::PBR_NORMAL, normalSampler, material.normalTexture);
85-
hasTextures1Values[3] =
86-
(float)setTextureOrDefault(Samplers::PBR_OCCLUSION, occlusionSampler, material.occlusionTexture);
87-
hasTextures2Values[0] =
88-
(float)setTextureOrDefault(Samplers::PBR_EMISSIVE, emissiveSampler, material.emissiveTexture);
76+
const uint32_t hasTexturesMask = 0
77+
| ((setTextureOrDefault(Samplers::PBR_BASECOLOR, baseColorSampler, material.baseColorTexture) ? 1 : 0) << 0)
78+
| ((setTextureOrDefault(Samplers::PBR_METALROUGHNESS, metallicRoughnessSampler, material.metallicRoughnessTexture) ? 1 : 0) << 1)
79+
| ((setTextureOrDefault(Samplers::PBR_NORMAL, normalSampler, material.normalTexture) ? 1 : 0) << 2)
80+
| ((setTextureOrDefault(Samplers::PBR_OCCLUSION, occlusionSampler, material.occlusionTexture) ? 1 : 0) << 3)
81+
| ((setTextureOrDefault(Samplers::PBR_EMISSIVE, emissiveSampler, material.emissiveTexture) ? 1 : 0) << 4);
82+
hasTexturesValues[0] = static_cast<float>(hasTexturesMask);
8983

90-
bgfx::setUniform(hasTextures1Uniform, hasTextures1Values);
91-
bgfx::setUniform(hasTextures2Uniform, hasTextures2Values);
84+
bgfx::setUniform(hasTexturesUniform, hasTexturesValues);
9285

9386
uint64_t state = 0;
9487
if(material.blend)

src/Renderer/PBRShader.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ class PBRShader
1818
bgfx::UniformHandle baseColorFactorUniform;
1919
bgfx::UniformHandle metallicRoughnessNormalOcclusionFactorUniform;
2020
bgfx::UniformHandle emissiveFactorUniform;
21-
bgfx::UniformHandle hasTextures1Uniform;
22-
bgfx::UniformHandle hasTextures2Uniform;
21+
bgfx::UniformHandle hasTexturesUniform;
2322
bgfx::UniformHandle baseColorSampler;
2423
bgfx::UniformHandle metallicRoughnessSampler;
2524
bgfx::UniformHandle normalSampler;

src/Renderer/Shaders/pbr.sh

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,13 @@ SAMPLER2D(s_texEmissive, SAMPLER_PBR_EMISSIVE);
1616
uniform vec4 u_baseColorFactor;
1717
uniform vec4 u_metallicRoughnessNormalOcclusionFactor;
1818
uniform vec4 u_emissiveFactorVec;
19-
uniform vec4 u_hasTextures1;
20-
uniform vec4 u_hasTextures2;
21-
22-
#define u_hasBaseColorTexture (u_hasTextures1.x != 0.0f)
23-
#define u_hasMetallicRoughnessTexture (u_hasTextures1.y != 0.0f)
24-
#define u_hasNormalTexture (u_hasTextures1.z != 0.0f)
25-
#define u_hasOcclusionTexture (u_hasTextures1.w != 0.0f)
26-
#define u_hasEmissiveTexture (u_hasTextures2.x != 0.0f)
19+
uniform vec4 u_hasTextures;
20+
21+
#define u_hasBaseColorTexture ((uint(u_hasTextures.x) & (1 << 0)) != 0)
22+
#define u_hasMetallicRoughnessTexture ((uint(u_hasTextures.x) & (1 << 1)) != 0)
23+
#define u_hasNormalTexture ((uint(u_hasTextures.x) & (1 << 2)) != 0)
24+
#define u_hasOcclusionTexture ((uint(u_hasTextures.x) & (1 << 3)) != 0)
25+
#define u_hasEmissiveTexture ((uint(u_hasTextures.x) & (1 << 4)) != 0)
2726

2827
#define u_metallicRoughnessFactor (u_metallicRoughnessNormalOcclusionFactor.xy)
2928
#define u_normalScale (u_metallicRoughnessNormalOcclusionFactor.z)

0 commit comments

Comments
 (0)