@@ -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 )
0 commit comments