Files
filament/libs/filamat/src/shaders/UibGenerator.cpp
T
Patrick RibasandMathias Agopian a90019baa2 Remove nonlinear fog from FL0 (#9658)
* Remove fog and lighting uniforms from FL0

---------

Co-authored-by: Mathias Agopian <mathias@google.com>
2026-02-05 12:51:37 -08:00

298 lines
16 KiB
C++

/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "UibGenerator.h"
#include "private/filament/UibStructs.h"
#include "private/filament/BufferInterfaceBlock.h"
#include <private/filament/EngineEnums.h>
#include <backend/DriverEnums.h>
#include <utils/debug.h>
#include <stdlib.h>
namespace filament {
using namespace backend;
BufferInterfaceBlock const& UibGenerator::get(UibGenerator::Ubo ubo) noexcept {
assert_invariant(ubo != Ubo::MaterialParams);
switch (ubo) {
case Ubo::FrameUniforms:
return getPerViewUib();
case Ubo::ObjectUniforms:
return getPerRenderableUib();
case Ubo::BonesUniforms:
return getPerRenderableBonesUib();
case Ubo::MorphingUniforms:
return getPerRenderableMorphingUib();
case Ubo::LightsUniforms:
return getLightsUib();
case Ubo::ShadowUniforms:
return getShadowUib();
case Ubo::FroxelRecordUniforms:
return getFroxelRecordUib();
case Ubo::FroxelsUniforms:
return getFroxelsUib();
case Ubo::MaterialParams:
abort();
}
}
UibGenerator::Binding UibGenerator::getBinding(UibGenerator::Ubo ubo) noexcept {
switch (ubo) {
case Ubo::FrameUniforms:
return { +DescriptorSetBindingPoints::PER_VIEW,
+PerViewBindingPoints::FRAME_UNIFORMS };
case Ubo::ObjectUniforms:
return { +DescriptorSetBindingPoints::PER_RENDERABLE,
+PerRenderableBindingPoints::OBJECT_UNIFORMS };
case Ubo::BonesUniforms:
return { +DescriptorSetBindingPoints::PER_RENDERABLE,
+PerRenderableBindingPoints::BONES_UNIFORMS };
case Ubo::MorphingUniforms:
return { +DescriptorSetBindingPoints::PER_RENDERABLE,
+PerRenderableBindingPoints::MORPHING_UNIFORMS };
case Ubo::LightsUniforms:
return { +DescriptorSetBindingPoints::PER_VIEW,
+PerViewBindingPoints::LIGHTS };
case Ubo::ShadowUniforms:
return { +DescriptorSetBindingPoints::PER_VIEW,
+PerViewBindingPoints::SHADOWS };
case Ubo::FroxelRecordUniforms:
return { +DescriptorSetBindingPoints::PER_VIEW,
+PerViewBindingPoints::RECORD_BUFFER };
case Ubo::FroxelsUniforms:
return { +DescriptorSetBindingPoints::PER_VIEW,
+PerViewBindingPoints::FROXEL_BUFFER };
case Ubo::MaterialParams:
return { +DescriptorSetBindingPoints::PER_MATERIAL,
+PerMaterialBindingPoints::MATERIAL_PARAMS };
}
}
static_assert(CONFIG_MAX_SHADOW_CASCADES == 4,
"Changing CONFIG_MAX_SHADOW_CASCADES affects PerView size and breaks materials.");
BufferInterfaceBlock const& UibGenerator::getPerViewUib() noexcept {
using Type = BufferInterfaceBlock::Type;
static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder()
.name(PerViewUib::_name)
.add({
{ "viewFromWorldMatrix", 0, Type::MAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
{ "worldFromViewMatrix", 0, Type::MAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
{ "clipFromViewMatrix", 0, Type::MAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
{ "viewFromClipMatrix", 0, Type::MAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
{ "eyeFromViewMatrix", CONFIG_MAX_STEREOSCOPIC_EYES,
Type::MAT4, Precision::HIGH },
{ "clipFromWorldMatrix", CONFIG_MAX_STEREOSCOPIC_EYES,
Type::MAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
{ "worldFromClipMatrix", 0, Type::MAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
{ "userWorldFromWorldMatrix",0,Type::MAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
{ "clipTransform", 0, Type::FLOAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
{ "clipControl", 0, Type::FLOAT2, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
{ "time", 0, Type::FLOAT, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
{ "temporalNoise", 0, Type::FLOAT, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
{ "userTime", 0, Type::FLOAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
// ------------------------------------------------------------------------------------
// values below should only be accessed in surface materials
// ------------------------------------------------------------------------------------
{ "resolution", 0, Type::FLOAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
{ "logicalViewportScale", 0, Type::FLOAT2, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
{ "logicalViewportOffset", 0, Type::FLOAT2, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
{ "lodBias", 0, Type::FLOAT, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 },
{ "refractionLodOffset", 0, Type::FLOAT, Precision::DEFAULT },
{ "derivativesScale", 0, Type::FLOAT2 },
{ "oneOverFarMinusNear", 0, Type::FLOAT, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
{ "nearOverFarMinusNear", 0, Type::FLOAT, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
{ "cameraFar", 0, Type::FLOAT, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
{ "exposure", 0, Type::FLOAT, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 }, // high precision to work around #3602 (qualcom),
{ "ev100", 0, Type::FLOAT, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 },
{ "needsAlphaChannel", 0, Type::FLOAT, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 },
// AO
{ "aoSamplingQualityAndEdgeDistance", 0, Type::FLOAT },
{ "aoBentNormals", 0, Type::FLOAT },
// ------------------------------------------------------------------------------------
// Dynamic Lighting [variant: DYN]
// ------------------------------------------------------------------------------------
{ "zParams", 0, Type::FLOAT4 },
{ "fParams", 0, Type::UINT3 },
{ "lightChannels", 0, Type::INT },
{ "froxelCountXY", 0, Type::FLOAT2 },
{ "enableFroxelViz", 0, Type::INT },
{ "dynReserved0", 0, Type::INT },
{ "dynReserved1", 0, Type::INT },
{ "dynReserved2", 0, Type::INT },
{ "iblLuminance", 0, Type::FLOAT, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 },
{ "iblRoughnessOneLevel", 0, Type::FLOAT, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 },
{ "iblSH", 9, Type::FLOAT3 },
// ------------------------------------------------------------------------------------
// Directional Lighting [variant: DIR]
// ------------------------------------------------------------------------------------
{ "lightDirection", 0, Type::FLOAT3, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
{ "padding0", 0, Type::FLOAT },
{ "lightColorIntensity", 0, Type::FLOAT4, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 },
{ "sun", 0, Type::FLOAT4, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 },
{ "shadowFarAttenuationParams", 0, Type::FLOAT2, Precision::HIGH },
// ------------------------------------------------------------------------------------
// Directional light shadowing [variant: SRE | DIR]
// ------------------------------------------------------------------------------------
{ "directionalShadows", 0, Type::INT },
{ "ssContactShadowDistance", 0, Type::FLOAT },
{ "cascadeSplits", 0, Type::FLOAT4, Precision::HIGH },
{ "cascades", 0, Type::INT },
{ "shadowPenumbraRatioScale", 0, Type::FLOAT },
{ "lightFarAttenuationParams", 0, Type::FLOAT2, Precision::HIGH },
// ------------------------------------------------------------------------------------
// VSM shadows [variant: VSM]
// ------------------------------------------------------------------------------------
{ "vsmExponent", 0, Type::FLOAT },
{ "vsmDepthScale", 0, Type::FLOAT },
{ "vsmLightBleedReduction", 0, Type::FLOAT },
{ "shadowSamplingType", 0, Type::UINT },
// ------------------------------------------------------------------------------------
// Fog [variant: FOG]
// ------------------------------------------------------------------------------------
{ "fogDensity", 0, Type::FLOAT3,Precision::HIGH },
{ "fogStart", 0, Type::FLOAT, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
{ "fogMaxOpacity", 0, Type::FLOAT, Precision::DEFAULT },
{ "fogMinMaxMip", 0, Type::UINT, Precision::HIGH },
{ "fogHeightFalloff", 0, Type::FLOAT, Precision::HIGH },
{ "fogCutOffDistance", 0, Type::FLOAT, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
{ "fogColor", 0, Type::FLOAT3, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 },
{ "fogColorFromIbl", 0, Type::FLOAT, Precision::DEFAULT },
{ "fogInscatteringStart", 0, Type::FLOAT, Precision::HIGH },
{ "fogInscatteringSize", 0, Type::FLOAT, Precision::DEFAULT },
{ "fogOneOverFarMinusNear", 0, Type::FLOAT, Precision::HIGH },
{ "fogNearOverFarMinusNear", 0, Type::FLOAT, Precision::HIGH },
{ "fogFromWorldMatrix", 0, Type::MAT3, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
{ "fogLinearParams", 0, Type::FLOAT2, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
{ "fogReserved0", 0, Type::FLOAT2, Precision::HIGH },
// ------------------------------------------------------------------------------------
// Screen-space reflections [variant: SSR (i.e.: VSM | SRE)]
// ------------------------------------------------------------------------------------
{ "ssrReprojection", 0, Type::MAT4, Precision::HIGH },
{ "ssrUvFromViewMatrix", 0, Type::MAT4, Precision::HIGH },
{ "ssrThickness", 0, Type::FLOAT },
{ "ssrBias", 0, Type::FLOAT },
{ "ssrDistance", 0, Type::FLOAT },
{ "ssrStride", 0, Type::FLOAT },
// --------------------------------------------------------------------------------------------
// user defined global variables
// --------------------------------------------------------------------------------------------
{ "custom", 4, Type::FLOAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 },
// --------------------------------------------------------------------------------------------
// for feature level 0 / es2 usage
// --------------------------------------------------------------------------------------------
{ "rec709", 0, Type::INT, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 },
{ "es2Reserved0", 0, Type::FLOAT },
{ "es2Reserved1", 0, Type::FLOAT },
{ "es2Reserved2", 0, Type::FLOAT },
// bring PerViewUib to 2 KiB
{ "reserved", sizeof(PerViewUib::reserved)/16, Type::FLOAT4 }
})
.build();
return uib;
}
BufferInterfaceBlock const& UibGenerator::getPerRenderableUib() noexcept {
static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder()
.name(PerRenderableUib::_name)
.add({{ "data", CONFIG_MAX_INSTANCES, BufferInterfaceBlock::Type::STRUCT, {}, {},
"PerRenderableData", sizeof(PerRenderableData), "CONFIG_MAX_INSTANCES" }})
.build();
return uib;
}
BufferInterfaceBlock const& UibGenerator::getLightsUib() noexcept {
static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder()
.name(LightsUib::_name)
.add({{ "lights", CONFIG_MAX_LIGHT_COUNT,
BufferInterfaceBlock::Type::MAT4, Precision::HIGH }})
.build();
return uib;
}
BufferInterfaceBlock const& UibGenerator::getShadowUib() noexcept {
static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder()
.name(ShadowUib::_name)
.add({{ "shadows", CONFIG_MAX_SHADOWMAPS,
BufferInterfaceBlock::Type::STRUCT, {}, {},
"ShadowData", sizeof(ShadowUib::ShadowData) }})
.build();
return uib;
}
BufferInterfaceBlock const& UibGenerator::getPerRenderableBonesUib() noexcept {
static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder()
.name(PerRenderableBoneUib::_name)
.add({{ "bones", CONFIG_MAX_BONE_COUNT,
BufferInterfaceBlock::Type::STRUCT, {}, {},
"BoneData", sizeof(PerRenderableBoneUib::BoneData) }})
.build();
return uib;
}
BufferInterfaceBlock const& UibGenerator::getPerRenderableMorphingUib() noexcept {
static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder()
.name(PerRenderableMorphingUib::_name)
.add({{ "weights", CONFIG_MAX_MORPH_TARGET_COUNT,
BufferInterfaceBlock::Type::FLOAT4 }})
.build();
return uib;
}
BufferInterfaceBlock const& UibGenerator::getFroxelRecordUib() noexcept {
static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder()
.name(FroxelRecordUib::_name)
.add({{ "records", 1024, BufferInterfaceBlock::Type::UINT4, Precision::HIGH, {},
{}, {}, "CONFIG_FROXEL_RECORD_BUFFER_HEIGHT"}})
.build();
return uib;
}
BufferInterfaceBlock const& UibGenerator::getFroxelsUib() noexcept {
static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder()
.name(FroxelsUib::_name)
.add({{ "records", 1024, BufferInterfaceBlock::Type::UINT4, Precision::HIGH, {},
{}, {}, "CONFIG_FROXEL_BUFFER_HEIGHT"}})
.build();
return uib;
}
} // namespace filament