Skip to content

Commit dbaa6cb

Browse files
authored
Added a pass system to shaders (#544)
1 parent 7b2705d commit dbaa6cb

18 files changed

Lines changed: 248 additions & 118 deletions

File tree

Resources/Engine/Shaders/Atmosphere.ovfx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
#feature OUTLINE_PASS
2-
#feature PICKING_PASS
1+
#pass OUTLINE_PASS
2+
#pass PICKING_PASS
3+
34
#feature DISABLE_TRACKING
45

56
#shader vertex

Resources/Engine/Shaders/Skysphere.ovfx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
#feature OUTLINE_PASS
2-
#feature PICKING_PASS
1+
#pass OUTLINE_PASS
2+
#pass PICKING_PASS
33

44
#shader vertex
55
#version 450 core

Resources/Engine/Shaders/Standard.ovfx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
#feature SHADOW_PASS
1+
#pass SHADOW_PASS
2+
23
#feature PARALLAX_MAPPING
34
#feature ALPHA_CLIPPING
45
#feature ALPHA_DITHERING

Resources/Engine/Shaders/Unlit.ovfx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
#feature SHADOW_PASS
1+
#pass SHADOW_PASS
2+
23
#feature ALPHA_CLIPPING
34

45
#shader vertex

Sources/Overload/OvCore/src/OvCore/Rendering/ShadowRenderPass.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ void OvCore::Rendering::ShadowRenderPass::DrawShadows(
112112

113113
// If the material has shadow pass, use it, otherwise use the shadow fallback material
114114
auto& targetMaterial =
115-
material->SupportsFeature(shadowPassName) ?
115+
material->HasPass(shadowPassName) ?
116116
*material :
117117
m_shadowMaterial;
118118

@@ -133,7 +133,7 @@ void OvCore::Rendering::ShadowRenderPass::DrawShadows(
133133
drawable.stateMask.frontfaceCulling = false;
134134
drawable.stateMask.backfaceCulling = false;
135135

136-
drawable.featureSetOverride = targetMaterial.GetFeatures() + shadowPassName;
136+
drawable.pass = shadowPassName;
137137

138138
drawable.AddDescriptor<EngineDrawableDescriptor>({
139139
modelMatrix,

Sources/Overload/OvCore/src/OvCore/Resources/Material.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ void OvCore::Resources::Material::OnSerialize(tinyxml2::XMLDocument& p_doc, tiny
3838
tinyxml2::XMLNode* uniformsNode = p_doc.NewElement("uniforms");
3939
p_node->InsertEndChild(uniformsNode);
4040

41-
const auto program = GetProgram();
41+
const auto program = GetVariant();
4242

4343
// If the material has no valid program for the current feature set, we skip serialization of properties.
4444
if (!program)

Sources/Overload/OvEditor/src/OvEditor/Panels/MaterialEditor.cpp

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
* @licence: MIT
55
*/
66

7-
8-
97
#include <OvCore/Helpers/GUIDrawer.h>
108
#include <OvCore/Resources/Loaders/MaterialLoader.h>
119

@@ -382,6 +380,11 @@ void OvEditor::Panels::MaterialEditor::GenerateMaterialPropertiesContent()
382380

383381
m_materialPropertiesColumns->RemoveAllWidgets(); // Ensure that the m_shaderSettingsColumns is empty
384382

383+
if (!m_target->HasShader())
384+
{
385+
return;
386+
}
387+
385388
std::multimap<
386389
int,
387390
std::pair<
@@ -390,6 +393,8 @@ void OvEditor::Panels::MaterialEditor::GenerateMaterialPropertiesContent()
390393
>
391394
> sortedProperties;
392395

396+
std::unordered_set<std::string> usedProperties;
397+
393398
auto typeIndexVisitor = [&](auto& arg) -> uint32_t {
394399
using T = std::decay_t<decltype(arg)>;
395400

@@ -405,25 +410,36 @@ void OvEditor::Panels::MaterialEditor::GenerateMaterialPropertiesContent()
405410

406411
for (auto& [name, prop] : m_target->GetProperties())
407412
{
408-
if (auto program = m_target->GetProgram(); !program || !program->GetUniformInfo(name))
413+
for (const auto& pass : m_target->GetShader()->GetPasses())
409414
{
410-
// This property isn't used in the shader program, so skip it
411-
continue;
412-
}
415+
if (auto variant = m_target->GetVariant(pass); !variant || !variant->GetUniformInfo(name))
416+
{
417+
// This property isn't used in the shader program, so skip it
418+
continue;
419+
}
413420

414-
// Uniforms starting with '_' are internal (private), so not exposed
415-
if (name.length() == 0 || name[0] == '_')
416-
{
417-
continue;
418-
}
421+
// Uniforms starting with '_' are internal (private), so not exposed
422+
if (name.length() == 0 || name[0] == '_')
423+
{
424+
continue;
425+
}
419426

420-
sortedProperties.emplace(
421-
std::visit(typeIndexVisitor, prop.value),
422-
std::pair<std::string, std::reference_wrapper<OvRendering::Data::MaterialPropertyType>>{
423-
name,
424-
std::ref(prop.value)
427+
// Skip properties that already got added (e.g. if they are used in multiple passes)
428+
if (usedProperties.contains(name))
429+
{
430+
continue;
425431
}
426-
);
432+
433+
usedProperties.insert(name);
434+
435+
sortedProperties.emplace(
436+
std::visit(typeIndexVisitor, prop.value),
437+
std::pair<std::string, std::reference_wrapper<OvRendering::Data::MaterialPropertyType>>{
438+
name,
439+
std::ref(prop.value)
440+
}
441+
);
442+
}
427443
}
428444

429445
for (auto& [index, propInfo] : sortedProperties)

Sources/Overload/OvEditor/src/OvEditor/Rendering/OutlineRenderFeature.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ void OvEditor::Rendering::OutlineRenderFeature::DrawModelToStencil(
156156
{
157157
auto getStencilMaterial = [&]() -> OvCore::Resources::Material& {
158158
auto material = p_materials.has_value() ? p_materials->at(mesh->GetMaterialIndex()) : nullptr;
159-
if (material && material->IsValid() && material->SupportsFeature(outlinePassName))
159+
if (material && material->IsValid() && material->HasPass(outlinePassName))
160160
{
161161
return *material;
162162
}
@@ -178,7 +178,7 @@ void OvEditor::Rendering::OutlineRenderFeature::DrawModelToStencil(
178178
element.stateMask = stateMask;
179179
element.stateMask.depthTest = false;
180180
element.stateMask.colorWriting = false;
181-
element.featureSetOverride = targetMaterial.GetFeatures() + outlinePassName;
181+
element.pass = outlinePassName;
182182

183183
element.AddDescriptor(engineDrawableDescriptor);
184184

@@ -200,7 +200,7 @@ void OvEditor::Rendering::OutlineRenderFeature::DrawModelOutline(
200200
{
201201
auto getStencilMaterial = [&]() -> OvCore::Resources::Material& {
202202
auto material = p_materials.has_value() ? p_materials->at(mesh->GetMaterialIndex()) : nullptr;
203-
if (material && material->IsValid() && material->SupportsFeature(outlinePassName))
203+
if (material && material->IsValid() && material->HasPass(outlinePassName))
204204
{
205205
return *material;
206206
}
@@ -227,7 +227,7 @@ void OvEditor::Rendering::OutlineRenderFeature::DrawModelOutline(
227227
drawable.material = targetMaterial;
228228
drawable.stateMask = stateMask;
229229
drawable.stateMask.depthTest = false;
230-
drawable.featureSetOverride = targetMaterial.GetFeatures() + outlinePassName;
230+
drawable.pass = outlinePassName;
231231

232232
drawable.AddDescriptor(engineDrawableDescriptor);
233233

Sources/Overload/OvEditor/src/OvEditor/Rendering/PickingRenderPass.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ void OvEditor::Rendering::PickingRenderPass::DrawPickableModels(
172172

173173
// If the material has picking pass, use it, otherwise use the picking fallback material
174174
auto& targetMaterial =
175-
(customMaterial && customMaterial->IsValid() && customMaterial->SupportsFeature(pickingPassName)) ?
175+
(customMaterial && customMaterial->IsValid() && customMaterial->HasPass(pickingPassName)) ?
176176
*customMaterial :
177177
m_actorPickingFallbackMaterial;
178178

@@ -190,7 +190,7 @@ void OvEditor::Rendering::PickingRenderPass::DrawPickableModels(
190190
drawable.stateMask = stateMask;
191191
drawable.stateMask.frontfaceCulling = false;
192192
drawable.stateMask.backfaceCulling = false;
193-
drawable.featureSetOverride = targetMaterial.GetFeatures() + pickingPassName;
193+
drawable.pass = pickingPassName;
194194

195195
drawable.AddDescriptor<OvCore::Rendering::EngineDrawableDescriptor>({
196196
modelMatrix

Sources/Overload/OvRendering/include/OvRendering/Data/Material.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,12 @@ namespace OvRendering::Data
6262
void SetShader(OvRendering::Resources::Shader* p_shader);
6363

6464
/**
65-
* Returns the shader program (variant) given the current feature set
65+
* Returns the variant (shader program) given a pass and the current feature set (or an override)
66+
* @param p_pass
6667
* @param p_override
6768
*/
68-
OvTools::Utils::OptRef<OvRendering::HAL::ShaderProgram> GetProgram(
69+
OvTools::Utils::OptRef<OvRendering::HAL::ShaderProgram> GetVariant(
70+
std::optional<const std::string_view> p_pass = std::nullopt,
6971
OvTools::Utils::OptRef<const Data::FeatureSet> p_override = std::nullopt
7072
) const;
7173

@@ -77,10 +79,12 @@ namespace OvRendering::Data
7779
/**
7880
* Bind the material and send its uniform data to the GPU
7981
* @param p_emptyTexture (The texture to use if a texture uniform is null)
82+
* @param p_pass
8083
* @param p_featureSetOverride
8184
*/
8285
void Bind(
8386
HAL::Texture* p_emptyTexture = nullptr,
87+
std::optional<const std::string_view> p_pass = std::nullopt,
8488
OvTools::Utils::OptRef<const Data::FeatureSet> p_featureSetOverride = std::nullopt
8589
);
8690

@@ -305,6 +309,12 @@ namespace OvRendering::Data
305309
*/
306310
bool SupportsFeature(const std::string& p_feature) const;
307311

312+
/**
313+
* Returns true if the material has a pass
314+
* @param p_pass
315+
*/
316+
bool HasPass(const std::string& p_pass) const;
317+
308318
/**
309319
* Returns true if the material supports orthopgraphic projection
310320
*/

0 commit comments

Comments
 (0)