variable rate shading tier2 #152

This commit is contained in:
Turanszki Janos
2020-08-30 20:20:24 +02:00
parent 4df1769cc9
commit 256fda93fc
36 changed files with 371 additions and 88 deletions
@@ -63,6 +63,7 @@ This is a reference for the C++ features of Wicked Engine
14. [GPU Queries](#gpu-queries)
15. [RayTracingAccelerationStructure](#raytracingaccelerationstructure)
16. [RayTracingPipelineState](#raytracingpipelinestate)
17. [Variable Rate Shading](#variable-rate-shading)
2. [GraphicsDevice_DX11](#wigraphicsdevice_dx11)
3. [GraphicsDevice_DX12](#wigraphicsdevice_dx12)
4. [GraphicsDevice_Vulkan](#wigraphicsdevice_vulkan)
@@ -633,6 +634,17 @@ The acceleration strucuture can be bottom level or top level, and decided by the
##### RayTracingPipelineState
Binding a ray tracing pipeline state is required to dispatch ray tracing shaders. A ray tracing pipeline state holds a collection of shader libraries and hitgroup definitions. It also declares information about max resource usage of the pipeline.
##### Variable Rate Shading
Variable Rate Shading can be used to decrease shading quality while retaining depth testing accuracy. The shading rate can be set up in different ways:
- `BindShadingRate()`: Set the shading rate for the following draw calls. The first parameter is the shading rate, which is by default `SHADING_RATE_1X1` (the best quality). The increasing enum values are standing for decreasing shading rates.
- `BindShadingRateImage()`: Set the shading rate for the screen via a tiled texture. The texture must be using the `FORMAT_R8_UINT` format. In each pixel, the texture contains the shading rate value for a tile of pixels (8x8, 16x16 or 32x32). The tile size can be queried via `GetVariableRateShadingTileSize()`. The shading rate values that the texture contains are not the raw values from `SHADING_RATE` enum, but they must be converted to values that are native to the graphics API used using the `WriteShadingRateValue()` function. The shading rate texture must be written with a compute shader and transitioned to `IMAGE_LAYOUT_SHADING_RATE_SOURCE` with a [GPUBarrier](#gpu-barriers) before setting it with `BindShadingRateImage()`. It is valid to set a `nullptr` instead of the texture, indicating that the shading rate is not specified by a texture.
- Or setting the shading rate from a vertex or geometry shader with the `SV_ShadingRate` system value semantic.
The final shading rate will be determined from the above methods using the maximum shading rate (least detailed) which is applicable to the screen tile. In the future it might be considered to expose the operator to define this.
To read more about variable rate shading, refer to the [DirectX specifications.](https://microsoft.github.io/DirectX-Specs/d3d/VariableRateShading)
#### GraphicsDevice_DX11
[[Header]](../WickedEngine/wiGraphicsDevice_DX11.h) [[Cpp]](../WickedEngine/wiGraphicsDevice_DX11.cpp)
+1 -1
View File
@@ -698,7 +698,7 @@ void EditorComponent::Load()
{
filename += ".wiscene";
}
wiArchive archive(fileName, false);
wiArchive archive(filename, false);
if (archive.IsOpen())
{
Scene& scene = wiScene::GetScene();
+3
View File
@@ -456,6 +456,9 @@
<FxCompile Update="C:\PROJECTS\WickedEngine\WickedEngine\rtaoLIB.hlsl">
<FileType>Document</FileType>
</FxCompile>
<FxCompile Update="C:\PROJECTS\WickedEngine\WickedEngine\shadingRateClassificationCS.hlsl">
<FileType>Document</FileType>
</FxCompile>
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
+1 -26
View File
@@ -84,7 +84,7 @@ EmitterWindow::EmitterWindow(EditorComponent* editor) : GUI(&editor->GetGUI())
shaderTypeComboBox = new wiComboBox("ShaderType: ");
shaderTypeComboBox->SetPos(XMFLOAT2(x, y += step));
shaderTypeComboBox->SetSize(XMFLOAT2(250, itemheight));
shaderTypeComboBox->SetSize(XMFLOAT2(300, itemheight));
shaderTypeComboBox->AddItem("SOFT");
shaderTypeComboBox->AddItem("SOFT + DISTORTION");
shaderTypeComboBox->AddItem("SIMPLEST");
@@ -101,28 +101,6 @@ EmitterWindow::EmitterWindow(EditorComponent* editor) : GUI(&editor->GetGUI())
emitterWindow->AddWidget(shaderTypeComboBox);
shadingRateComboBox = new wiComboBox("Shading Rate: ");
shadingRateComboBox->SetTooltip("Select shading rate for this material. \nSelecting larger shading rate will decrease rendering quality of this material, \nbut increases performance.\nDX12 only and requires Tier1 hardware support for variable shading rate");
shadingRateComboBox->SetPos(XMFLOAT2(x + 400, y));
shadingRateComboBox->SetSize(XMFLOAT2(40, itemheight));
shadingRateComboBox->OnSelect([&](wiEventArgs args) {
auto emitter = GetEmitter();
if (emitter != nullptr)
{
emitter->shadingRate = (wiGraphics::SHADING_RATE)args.iValue;
}
});
shadingRateComboBox->AddItem("1X1");
shadingRateComboBox->AddItem("1X2");
shadingRateComboBox->AddItem("2X1");
shadingRateComboBox->AddItem("2X2");
shadingRateComboBox->AddItem("2X4");
shadingRateComboBox->AddItem("4X2");
shadingRateComboBox->AddItem("4X4");
shadingRateComboBox->SetEnabled(false);
emitterWindow->AddWidget(shadingRateComboBox);
sortCheckBox = new wiCheckBox("Sorting Enabled: ");
sortCheckBox->SetPos(XMFLOAT2(x, y += step));
sortCheckBox->SetSize(XMFLOAT2(itemheight, itemheight));
@@ -573,7 +551,6 @@ void EmitterWindow::SetEntity(Entity entity)
emitterNameField->SetEnabled(true);
restartButton->SetEnabled(true);
shaderTypeComboBox->SetEnabled(true);
shadingRateComboBox->SetEnabled(true);
meshComboBox->SetEnabled(true);
debugCheckBox->SetEnabled(true);
volumeCheckBox->SetEnabled(true);
@@ -600,7 +577,6 @@ void EmitterWindow::SetEntity(Entity entity)
sph_e_Slider->SetEnabled(true);
shaderTypeComboBox->SetSelected((int)emitter->shaderType);
shadingRateComboBox->SetSelected((int)emitter->shadingRate);
sortCheckBox->SetCheck(emitter->IsSorted());
depthCollisionsCheckBox->SetCheck(emitter->IsDepthCollisionEnabled());
@@ -642,7 +618,6 @@ void EmitterWindow::SetEntity(Entity entity)
emitterNameField->SetEnabled(false);
restartButton->SetEnabled(false);
shaderTypeComboBox->SetEnabled(false);
shadingRateComboBox->SetEnabled(false);
meshComboBox->SetEnabled(false);
debugCheckBox->SetEnabled(false);
volumeCheckBox->SetEnabled(false);
-1
View File
@@ -59,7 +59,6 @@ public:
wiSlider* sph_K_Slider;
wiSlider* sph_p0_Slider;
wiSlider* sph_e_Slider;
wiComboBox* shadingRateComboBox;
wiTextInputField* frameRateInput;
wiTextInputField* framesXInput;
-22
View File
@@ -216,27 +216,6 @@ HairParticleWindow::HairParticleWindow(EditorComponent* editor) : GUI(&editor->G
shadingRateComboBox = new wiComboBox("Shading Rate: ");
shadingRateComboBox->SetTooltip("Select shading rate for this material. \nSelecting larger shading rate will decrease rendering quality of this material, \nbut increases performance.\nDX12 only and requires Tier1 hardware support for variable shading rate");
shadingRateComboBox->SetPos(XMFLOAT2(x, y += step));
shadingRateComboBox->SetSize(XMFLOAT2(100, 20));
shadingRateComboBox->OnSelect([&](wiEventArgs args) {
auto hair = GetHair();
if (hair != nullptr)
{
hair->shadingRate = (wiGraphics::SHADING_RATE)args.iValue;
}
});
shadingRateComboBox->AddItem("1X1");
shadingRateComboBox->AddItem("1X2");
shadingRateComboBox->AddItem("2X1");
shadingRateComboBox->AddItem("2X2");
shadingRateComboBox->AddItem("2X4");
shadingRateComboBox->AddItem("4X2");
shadingRateComboBox->AddItem("4X4");
shadingRateComboBox->SetEnabled(false);
hairWindow->AddWidget(shadingRateComboBox);
hairWindow->Translate(XMFLOAT3(200, 50, 0));
hairWindow->SetVisible(false);
@@ -270,7 +249,6 @@ void HairParticleWindow::SetEntity(Entity entity)
framesYInput->SetValue((int)hair->framesY);
frameCountInput->SetValue((int)hair->frameCount);
frameStartInput->SetValue((int)hair->frameStart);
shadingRateComboBox->SetSelected((int)hair->shadingRate);
hairWindow->SetEnabled(true);
}
-1
View File
@@ -44,7 +44,6 @@ public:
wiTextInputField* framesYInput;
wiTextInputField* frameCountInput;
wiTextInputField* frameStartInput;
wiComboBox* shadingRateComboBox;
};
+1
View File
@@ -360,6 +360,7 @@ MaterialWindow::MaterialWindow(EditorComponent* editor) : GUI(&editor->GetGUI())
shadingRateComboBox->AddItem("4X2");
shadingRateComboBox->AddItem("4X4");
shadingRateComboBox->SetEnabled(false);
shadingRateComboBox->SetMaxVisibleItemCount(4);
materialWindow->AddWidget(shadingRateComboBox);
+24 -2
View File
@@ -13,10 +13,10 @@ RendererWindow::RendererWindow(EditorComponent* editor) : GUI(&editor->GetGUI())
wiRenderer::SetToDrawDebugCameras(true);
rendererWindow = new wiWindow(GUI, "Renderer Window");
rendererWindow->SetSize(XMFLOAT2(640, 710));
rendererWindow->SetSize(XMFLOAT2(580, 600));
GUI->AddWidget(rendererWindow);
float x = 220, y = 5, step = 28, itemheight = 26;
float x = 220, y = 5, step = 22, itemheight = 20;
vsyncCheckBox = new wiCheckBox("VSync: ");
vsyncCheckBox->SetTooltip("Toggle vertical sync");
@@ -150,6 +150,28 @@ RendererWindow::RendererWindow(EditorComponent* editor) : GUI(&editor->GetGUI())
wireFrameCheckBox->SetCheck(wiRenderer::IsWireRender());
rendererWindow->AddWidget(wireFrameCheckBox);
variableRateShadingClassificationCheckBox = new wiCheckBox("VRS Classification: ");
variableRateShadingClassificationCheckBox->SetTooltip("Enable classification of variable rate shading on the screen. Less important parts will be shaded with lesser resolution.\nDX12 only and requires Tier1 hardware support for variable shading rate");
variableRateShadingClassificationCheckBox->SetPos(XMFLOAT2(x, y += step));
variableRateShadingClassificationCheckBox->SetSize(XMFLOAT2(itemheight, itemheight));
variableRateShadingClassificationCheckBox->OnClick([](wiEventArgs args) {
wiRenderer::SetVariableRateShadingClassification(args.bValue);
});
variableRateShadingClassificationCheckBox->SetCheck(wiRenderer::GetVariableRateShadingClassification());
rendererWindow->AddWidget(variableRateShadingClassificationCheckBox);
variableRateShadingClassificationCheckBox->SetEnabled(wiRenderer::GetDevice()->CheckCapability(wiGraphics::GraphicsDevice::GRAPHICSDEVICE_CAPABILITY_VARIABLE_RATE_SHADING_TIER2));
variableRateShadingClassificationDebugCheckBox = new wiCheckBox("DEBUG: ");
variableRateShadingClassificationDebugCheckBox->SetTooltip("Toggle visualization of variable rate shading classification feature");
variableRateShadingClassificationDebugCheckBox->SetPos(XMFLOAT2(x + 122, y));
variableRateShadingClassificationDebugCheckBox->SetSize(XMFLOAT2(itemheight, itemheight));
variableRateShadingClassificationDebugCheckBox->OnClick([](wiEventArgs args) {
wiRenderer::SetVariableRateShadingClassificationDebug(args.bValue);
});
variableRateShadingClassificationDebugCheckBox->SetCheck(wiRenderer::GetVariableRateShadingClassificationDebug());
rendererWindow->AddWidget(variableRateShadingClassificationDebugCheckBox);
variableRateShadingClassificationDebugCheckBox->SetEnabled(wiRenderer::GetDevice()->CheckCapability(wiGraphics::GraphicsDevice::GRAPHICSDEVICE_CAPABILITY_VARIABLE_RATE_SHADING_TIER2));
advancedLightCullingCheckBox = new wiCheckBox("2.5D Light Culling: ");
advancedLightCullingCheckBox->SetTooltip("Enable a more aggressive light culling approach which can result in slower culling but faster rendering (Tiled renderer only)");
advancedLightCullingCheckBox->SetPos(XMFLOAT2(x, y += step));
+2
View File
@@ -51,6 +51,8 @@ public:
wiCheckBox* debugForceFieldsCheckBox;
wiCheckBox* debugRaytraceBVHCheckBox;
wiCheckBox* wireFrameCheckBox;
wiCheckBox* variableRateShadingClassificationCheckBox;
wiCheckBox* variableRateShadingClassificationDebugCheckBox;
wiCheckBox* advancedLightCullingCheckBox;
wiCheckBox* debugLightCullingCheckBox;
wiCheckBox* tessellationCheckBox;
+3
View File
@@ -486,6 +486,9 @@
<FxCompile Update="C:\PROJECTS\WickedEngine\WickedEngine\rtaoLIB.hlsl">
<FileType>Document</FileType>
</FxCompile>
<FxCompile Update="C:\PROJECTS\WickedEngine\WickedEngine\shadingRateClassificationCS.hlsl">
<FileType>Document</FileType>
</FxCompile>
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
+1
View File
@@ -1,5 +1,6 @@
This file contains changelog of wiArchive versions
49: Particles are just using material's shading rate, so removed shading rate from particles
48: Serialized shading rate for material and particles
47: Serialized animation speed
46: Decoupled animation data from targets
+14 -1
View File
@@ -201,6 +201,19 @@ void RenderPath3D::ResizeBuffers()
device->SetName(&rtGUIBlurredBackground[2], "rtGUIBlurredBackground[2]");
}
if(device->CheckCapability(GraphicsDevice::GRAPHICSDEVICE_CAPABILITY_VARIABLE_RATE_SHADING_TIER2))
{
uint32_t tileSize = device->GetVariableRateShadingTileSize();
TextureDesc desc;
desc.BindFlags = BIND_UNORDERED_ACCESS;
desc.Format = FORMAT_R8_UINT;
desc.Width = (wiRenderer::GetInternalResolution().x + tileSize - 1) / tileSize;
desc.Height = (wiRenderer::GetInternalResolution().y + tileSize - 1) / tileSize;
device->CreateTexture(&desc, nullptr, &rtShadingRate);
device->SetName(&rtShadingRate, "rtShadingRate");
}
// Depth buffers:
{
TextureDesc desc;
@@ -408,7 +421,7 @@ void RenderPath3D::Compose(CommandList cmd) const
wiImage::Draw(GetLastPostprocessRT(), fx, cmd);
device->EventEnd(cmd);
if (wiRenderer::GetDebugLightCulling())
if (wiRenderer::GetDebugLightCulling() || wiRenderer::GetVariableRateShadingClassificationDebug())
{
wiImage::Draw((Texture*)wiRenderer::GetTexture(TEXTYPE_2D_DEBUGUAV), wiImageParams((float)wiRenderer::GetDevice()->GetScreenWidth(), (float)wiRenderer::GetDevice()->GetScreenHeight()), cmd);
}
+1
View File
@@ -75,6 +75,7 @@ protected:
wiGraphics::Texture rtSun[2]; // 0: sun render target used for lightshafts (can be MSAA), 1: radial blurred lightshafts
wiGraphics::Texture rtSun_resolved; // sun render target, but the resolved version if MSAA is enabled
wiGraphics::Texture rtGUIBlurredBackground[3]; // downsampled, gaussian blurred scene for GUI
wiGraphics::Texture rtShadingRate; // UINT8 shading rate per tile
wiGraphics::Texture rtPostprocess_HDR; // ping-pong with main scene RT in HDR post-process chain
wiGraphics::Texture rtPostprocess_LDR[2]; // ping-pong with itself in LDR post-process chain
+9
View File
@@ -212,6 +212,13 @@ void RenderPath3D_Forward::Render() const
GraphicsDevice* device = wiRenderer::GetDevice();
wiRenderer::UpdateCameraCB(wiRenderer::GetCamera(), cmd);
if (wiRenderer::GetVariableRateShadingClassification() && device->CheckCapability(GraphicsDevice::GRAPHICSDEVICE_CAPABILITY_VARIABLE_RATE_SHADING_TIER2))
{
wiRenderer::ComputeShadingRateClassification(*GetSceneRT_Read(1), rtLinearDepth, rtShadingRate, cmd);
device->BindShadingRate(SHADING_RATE_1X1, cmd);
device->BindShadingRateImage(&rtShadingRate, cmd);
}
// Opaque Scene:
{
auto range = wiProfiler::BeginRangeGPU("Opaque Scene", cmd);
@@ -235,6 +242,8 @@ void RenderPath3D_Forward::Render() const
wiProfiler::EndRange(range); // Opaque Scene
}
device->BindShadingRateImage(nullptr, cmd);
});
cmd = device->BeginCommandList();
@@ -110,6 +110,13 @@ void RenderPath3D_TiledForward::Render() const
cmd
);
if (wiRenderer::GetVariableRateShadingClassification() && device->CheckCapability(GraphicsDevice::GRAPHICSDEVICE_CAPABILITY_VARIABLE_RATE_SHADING_TIER2))
{
wiRenderer::ComputeShadingRateClassification(*GetSceneRT_Read(1), rtLinearDepth, rtShadingRate, cmd);
device->BindShadingRate(SHADING_RATE_1X1, cmd);
device->BindShadingRateImage(&rtShadingRate, cmd);
}
device->UnbindResources(TEXSLOT_ONDEMAND0, 1, cmd);
// Opaque scene:
@@ -135,6 +142,8 @@ void RenderPath3D_TiledForward::Render() const
wiProfiler::EndRange(range); // Opaque Scene
}
device->BindShadingRateImage(nullptr, cmd);
});
cmd = device->BeginCommandList();
+13
View File
@@ -54,6 +54,19 @@ CBUFFER(MSAO_UPSAMPLECB, CBSLOT_RENDERER_POSTPROCESS)
float kUpsampleTolerance;
};
CBUFFER(ShadingRateClassificationCB, CBSLOT_RENDERER_POSTPROCESS)
{
uint xShadingRateTileSize;
uint SHADING_RATE_1X1;
uint SHADING_RATE_1X2;
uint SHADING_RATE_2X1;
uint SHADING_RATE_2X2;
uint SHADING_RATE_2X4;
uint SHADING_RATE_4X2;
uint SHADING_RATE_4X4;
};
static const uint MOTIONBLUR_TILESIZE = 32;
#define motionblur_strength xPPParams0.x
+23
View File
@@ -616,6 +616,29 @@
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">Pixel</ShaderType>
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">Pixel</ShaderType>
</FxCompile>
<FxCompile Include="$(MSBuildThisFileDirectory)shadingRateClassificationCS.hlsl">
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Compute</ShaderType>
<ShaderModel Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">5.0</ShaderModel>
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Compute</ShaderType>
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compute</ShaderType>
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">Compute</ShaderType>
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">Compute</ShaderType>
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compute</ShaderType>
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">Compute</ShaderType>
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">Compute</ShaderType>
<FileType>Document</FileType>
</FxCompile>
<FxCompile Include="$(MSBuildThisFileDirectory)shadingRateClassificationCS_DEBUG.hlsl">
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Compute</ShaderType>
<ShaderModel Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">5.0</ShaderModel>
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Compute</ShaderType>
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compute</ShaderType>
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">Compute</ShaderType>
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">Compute</ShaderType>
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compute</ShaderType>
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">Compute</ShaderType>
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">Compute</ShaderType>
</FxCompile>
<FxCompile Include="$(MSBuildThisFileDirectory)volumetricCloud_curlnoiseCS.hlsl">
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Compute</ShaderType>
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Compute</ShaderType>
@@ -1007,5 +1007,11 @@
<FxCompile Include="$(MSBuildThisFileDirectory)volumetricCloud_weathermapCS.hlsl">
<Filter>CS</Filter>
</FxCompile>
<FxCompile Include="$(MSBuildThisFileDirectory)shadingRateClassificationCS.hlsl">
<Filter>CS</Filter>
</FxCompile>
<FxCompile Include="$(MSBuildThisFileDirectory)shadingRateClassificationCS_DEBUG.hlsl">
<Filter>CS</Filter>
</FxCompile>
</ItemGroup>
</Project>
+1 -1
View File
@@ -43,7 +43,7 @@ for item in root.iter():
if profile == "LIB":
cmd += "lib"
raytracing_inline = 1
raytracing_inline = 0
if raytracing_inline == 1:
cmd += "_6_5 "
cmd += "-D RAYTRACING_INLINE "
@@ -0,0 +1,85 @@
#include "globals.hlsli"
#include "ShaderInterop_Postprocess.h"
RWTEXTURE2D(output, uint, 0);
#ifdef DEBUG_SHADINGRATECLASSIFICATION
RWTEXTURE2D(output_debug, float4, 1);
#endif // DEBUG_SHADINGRATECLASSIFICATION
// TODO optimize this shader by removing loops
[numthreads(POSTPROCESS_BLOCKSIZE, POSTPROCESS_BLOCKSIZE, 1)]
void main( uint3 DTid : SV_DispatchThreadID )
{
const uint2 tile = DTid.xy;
const uint2 pixel_upperleft = tile * xShadingRateTileSize;
uint2 dim;
texture_gbuffer1.GetDimensions(dim.x, dim.y);
float magnitude = 1000000;
uint i, j;
[loop]
for (i = 0; i < xShadingRateTileSize; ++i)
{
[loop]
for (j = 0; j < xShadingRateTileSize; ++j)
{
const uint2 pixel = min(pixel_upperleft + uint2(i, j), dim - 1);
const float2 velocity = abs(texture_gbuffer1[pixel].zw);
magnitude = min(magnitude, max(velocity.x, velocity.y));
}
}
uint rate = 0;
if (magnitude > 0.1f)
{
rate = SHADING_RATE_4X4; // least detailed
}
else if (magnitude > 0.01f)
{
rate = SHADING_RATE_2X4;
}
else if (magnitude > 0.005f)
{
rate = SHADING_RATE_2X2;
}
else if (magnitude > 0.001f)
{
rate = SHADING_RATE_1X2;
}
else
{
rate = SHADING_RATE_1X1; // most detailed
}
output[tile] = rate;
#ifdef DEBUG_SHADINGRATECLASSIFICATION
[loop]
for (i = 0; i < xShadingRateTileSize; ++i)
{
[loop]
for (j = 0; j < xShadingRateTileSize; ++j)
{
float4 debugcolor = float4(0, 0, 0, 0);
float debugalpha = 0.6f;
if(rate == SHADING_RATE_4X4)
debugcolor = float4(1, 0, 0, debugalpha);
else if(rate == SHADING_RATE_2X4 || rate == SHADING_RATE_4X2)
debugcolor = float4(1, 1, 0, debugalpha);
else if (rate == SHADING_RATE_2X2)
debugcolor = float4(0, 1, 0, debugalpha);
else if (rate == SHADING_RATE_1X2 || rate == SHADING_RATE_2X1)
debugcolor = float4(0, 0, 1, debugalpha);
if (i == 0 || i == xShadingRateTileSize - 1 || j == 0 || j == xShadingRateTileSize - 1)
debugcolor = float4(0, 0, 0, debugalpha);
const uint2 pixel = pixel_upperleft + uint2(i, j);
output_debug[pixel] = debugcolor;
}
}
#endif // DEBUG_SHADINGRATECLASSIFICATION
}
@@ -0,0 +1,2 @@
#define DEBUG_SHADINGRATECLASSIFICATION
#include "shadingRateClassificationCS.hlsl"
+1 -1
View File
@@ -7,7 +7,7 @@
using namespace std;
// this should always be only INCREMENTED and only if a new serialization is implemeted somewhere!
uint64_t __archiveVersion = 48;
uint64_t __archiveVersion = 49;
// this is the version number of which below the archive is not compatible with the current version
uint64_t __archiveVersionBarrier = 22;
+3 -8
View File
@@ -526,8 +526,6 @@ void wiEmittedParticle::Draw(const CameraComponent& camera, const MaterialCompon
GraphicsDevice* device = wiRenderer::GetDevice();
device->EventBegin("EmittedParticle", cmd);
device->BindShadingRate(shadingRate, cmd);
if (wiRenderer::IsWireRender())
{
device->BindPipelineState(&PSO_wire, cmd);
@@ -537,6 +535,7 @@ void wiEmittedParticle::Draw(const CameraComponent& camera, const MaterialCompon
const BLENDMODE blendMode = material.GetBlendMode();
device->BindPipelineState(&PSO[blendMode][shaderType], cmd);
device->BindResource(PS, material.GetBaseColorMap(), TEXSLOT_ONDEMAND0, cmd);
device->BindShadingRate(material.shadingRate, cmd);
}
device->BindConstantBuffer(VS, &constantBuffer, CB_GETBINDSLOT(EmittedParticleCB), cmd);
@@ -730,7 +729,8 @@ void wiEmittedParticle::Serialize(wiArchive& archive, wiECS::Entity seed)
if (archive.GetVersion() >= 48)
{
archive >> (uint8_t&)shadingRate;
uint8_t shadingRate;
archive >> shadingRate; // no longer needed
}
}
else
@@ -764,11 +764,6 @@ void wiEmittedParticle::Serialize(wiArchive& archive, wiECS::Entity seed)
archive << frameStart;
archive << frameRate;
}
if (archive.GetVersion() >= 48)
{
archive << (uint8_t)shadingRate;
}
}
}
-1
View File
@@ -76,7 +76,6 @@ public:
uint32_t _flags = EMPTY;
PARTICLESHADERTYPE shaderType = SOFT;
wiGraphics::SHADING_RATE shadingRate = wiGraphics::SHADING_RATE_1X1;
wiECS::Entity meshID = wiECS::INVALID_ENTITY;
+3
View File
@@ -77,6 +77,7 @@ enum CBTYPES
CBTYPE_POSTPROCESS_MSAO_UPSAMPLE,
CBTYPE_LENSFLARE,
CBTYPE_PAINTRADIUS,
CBTYPE_SHADINGRATECLASSIFICATION,
CBTYPE_COUNT
};
@@ -269,6 +270,8 @@ enum CSTYPES
{
CSTYPE_LUMINANCE_PASS1,
CSTYPE_LUMINANCE_PASS2,
CSTYPE_SHADINGRATECLASSIFICATION,
CSTYPE_SHADINGRATECLASSIFICATION_DEBUG,
CSTYPE_TILEFRUSTUMS,
CSTYPE_RESOLVEMSAADEPTHSTENCIL,
CSTYPE_VOXELSCENECOPYCLEAR,
+1
View File
@@ -281,6 +281,7 @@ namespace wiGraphics
IMAGE_LAYOUT_UNORDERED_ACCESS, // shader resource, write enabled
IMAGE_LAYOUT_COPY_SRC, // copy from
IMAGE_LAYOUT_COPY_DST, // copy to
IMAGE_LAYOUT_SHADING_RATE_SOURCE, // shading rate control per tile
};
enum BUFFER_STATE
{
+2
View File
@@ -35,6 +35,8 @@ bool GraphicsDevice::CheckCapability(GRAPHICSDEVICE_CAPABILITY capability) const
return DESCRIPTOR_MANAGEMENT;
case wiGraphics::GraphicsDevice::GRAPHICSDEVICE_CAPABILITY_VARIABLE_RATE_SHADING:
return VARIABLE_RATE_SHADING;
case wiGraphics::GraphicsDevice::GRAPHICSDEVICE_CAPABILITY_VARIABLE_RATE_SHADING_TIER2:
return VARIABLE_RATE_SHADING_TIER2;
}
return false;
}
+6 -1
View File
@@ -30,8 +30,10 @@ namespace wiGraphics
bool RAYTRACING_INLINE = false;
bool DESCRIPTOR_MANAGEMENT = false;
bool VARIABLE_RATE_SHADING = false;
bool VARIABLE_RATE_SHADING_TIER2 = false;
size_t SHADER_IDENTIFIER_SIZE = 0;
size_t TOPLEVEL_ACCELERATION_STRUCTURE_INSTANCE_SIZE = 0;
uint32_t VARIABLE_RATE_SHADING_TILE_SIZE = 0;
public:
virtual bool CreateBuffer(const GPUBufferDesc *pDesc, const SubresourceData* pInitialData, GPUBuffer *pBuffer) = 0;
@@ -52,6 +54,7 @@ namespace wiGraphics
virtual int CreateSubresource(Texture* texture, SUBRESOURCE_TYPE type, uint32_t firstSlice, uint32_t sliceCount, uint32_t firstMip, uint32_t mipCount) = 0;
virtual void WriteShadingRateValue(SHADING_RATE rate, void* dest) {};
virtual void WriteTopLevelAccelerationStructureInstance(const RaytracingAccelerationStructureDesc::TopLevel::Instance* instance, void* dest) {}
virtual void WriteShaderIdentifier(const RaytracingPipelineState* rtpso, uint32_t group_index, void* dest) {}
virtual void WriteDescriptor(const DescriptorTable* table, uint32_t rangeIndex, uint32_t arrayIndex, const GPUResource* resource, int subresource = -1, uint64_t offset = 0) {}
@@ -103,6 +106,7 @@ namespace wiGraphics
GRAPHICSDEVICE_CAPABILITY_RAYTRACING_INLINE,
GRAPHICSDEVICE_CAPABILITY_DESCRIPTOR_MANAGEMENT,
GRAPHICSDEVICE_CAPABILITY_VARIABLE_RATE_SHADING,
GRAPHICSDEVICE_CAPABILITY_VARIABLE_RATE_SHADING_TIER2,
GRAPHICSDEVICE_CAPABILITY_COUNT,
};
bool CheckCapability(GRAPHICSDEVICE_CAPABILITY capability) const;
@@ -123,7 +127,7 @@ namespace wiGraphics
inline size_t GetShaderIdentifierSize() const { return SHADER_IDENTIFIER_SIZE; }
inline size_t GetTopLevelAccelerationStructureInstanceSize() const { return TOPLEVEL_ACCELERATION_STRUCTURE_INSTANCE_SIZE; }
inline uint32_t GetVariableRateShadingTileSize() const { return VARIABLE_RATE_SHADING_TILE_SIZE; }
///////////////Thread-sensitive////////////////////////
@@ -144,6 +148,7 @@ namespace wiGraphics
virtual void BindStencilRef(uint32_t value, CommandList cmd) = 0;
virtual void BindBlendFactor(float r, float g, float b, float a, CommandList cmd) = 0;
virtual void BindShadingRate(SHADING_RATE rate, CommandList cmd) {}
virtual void BindShadingRateImage(const Texture* texture, CommandList cmd) {}
virtual void BindPipelineState(const PipelineState* pso, CommandList cmd) = 0;
virtual void BindComputeShader(const Shader* cs, CommandList cmd) = 0;
virtual void Draw(uint32_t vertexCount, uint32_t startVertexLocation, CommandList cmd) = 0;
+50 -9
View File
@@ -651,6 +651,8 @@ namespace DX12_Internal
return D3D12_RESOURCE_STATE_COPY_SOURCE;
case wiGraphics::IMAGE_LAYOUT_COPY_DST:
return D3D12_RESOURCE_STATE_COPY_DEST;
case wiGraphics::IMAGE_LAYOUT_SHADING_RATE_SOURCE:
return D3D12_RESOURCE_STATE_SHADING_RATE_SOURCE;
}
return D3D12_RESOURCE_STATE_COMMON;
@@ -702,7 +704,7 @@ namespace DX12_Internal
}
return D3D12_SHADER_VISIBILITY_ALL;
}
constexpr D3D12_SHADING_RATE _ConvertShadingRate(SHADING_RATE value, const D3D12_FEATURE_DATA_D3D12_OPTIONS6& features_6)
constexpr D3D12_SHADING_RATE _ConvertShadingRate(SHADING_RATE value)
{
switch (value)
{
@@ -715,11 +717,11 @@ namespace DX12_Internal
case wiGraphics::SHADING_RATE_2X2:
return D3D12_SHADING_RATE_2X2;
case wiGraphics::SHADING_RATE_2X4:
return features_6.AdditionalShadingRatesSupported ? D3D12_SHADING_RATE_2X4 : D3D12_SHADING_RATE_2X2;
return D3D12_SHADING_RATE_2X4;
case wiGraphics::SHADING_RATE_4X2:
return features_6.AdditionalShadingRatesSupported ? D3D12_SHADING_RATE_4X2 : D3D12_SHADING_RATE_2X2;
return D3D12_SHADING_RATE_4X2;
case wiGraphics::SHADING_RATE_4X4:
return features_6.AdditionalShadingRatesSupported ? D3D12_SHADING_RATE_4X4 : D3D12_SHADING_RATE_2X2;
return D3D12_SHADING_RATE_4X4;
default:
return D3D12_SHADING_RATE_1X1;
}
@@ -2165,7 +2167,8 @@ using namespace DX12_Internal;
hr = device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS6, &features_6, sizeof(features_6));
VARIABLE_RATE_SHADING = features_6.VariableShadingRateTier >= D3D12_VARIABLE_SHADING_RATE_TIER_1;
VARIABLE_RATE_SHADING_TIER2 = features_6.VariableShadingRateTier >= D3D12_VARIABLE_SHADING_RATE_TIER_2;
VARIABLE_RATE_SHADING_TILE_SIZE = features_6.ShadingRateImageTileSize;
// Create common indirect command signatures:
@@ -4154,6 +4157,15 @@ using namespace DX12_Internal;
return -1;
}
void GraphicsDevice_DX12::WriteShadingRateValue(SHADING_RATE rate, void* dest)
{
D3D12_SHADING_RATE _rate = _ConvertShadingRate(rate);
if (!features_6.AdditionalShadingRatesSupported)
{
_rate = std::min(_rate, D3D12_SHADING_RATE_2X2);
}
*(uint8_t*)dest = _rate;
}
void GraphicsDevice_DX12::WriteTopLevelAccelerationStructureInstance(const RaytracingAccelerationStructureDesc::TopLevel::Instance* instance, void* dest)
{
D3D12_RAYTRACING_INSTANCE_DESC* desc = (D3D12_RAYTRACING_INSTANCE_DESC*)dest;
@@ -4578,9 +4590,19 @@ using namespace DX12_Internal;
active_rootsig_graphics[cmd] = nullptr;
active_rootsig_compute[cmd] = nullptr;
active_renderpass[cmd] = nullptr;
prev_shadingrate[cmd] = SHADING_RATE_1X1;
prev_shadingrate[cmd] = D3D12_SHADING_RATE_1X1;
dirty_pso[cmd] = false;
if (VARIABLE_RATE_SHADING)
{
D3D12_SHADING_RATE_COMBINER combiners[] =
{
D3D12_SHADING_RATE_COMBINER_MAX,
D3D12_SHADING_RATE_COMBINER_MAX,
};
GetDirectCommandList(cmd)->RSSetShadingRate(D3D12_SHADING_RATE_1X1, combiners);
}
return cmd;
}
void GraphicsDevice_DX12::SubmitCommandLists()
@@ -5033,10 +5055,29 @@ using namespace DX12_Internal;
}
void GraphicsDevice_DX12::BindShadingRate(SHADING_RATE rate, CommandList cmd)
{
if (prev_shadingrate[cmd] != rate)
D3D12_SHADING_RATE _rate = D3D12_SHADING_RATE_1X1;
WriteShadingRateValue(rate, &_rate);
if (VARIABLE_RATE_SHADING && prev_shadingrate[cmd] != _rate)
{
prev_shadingrate[cmd] = rate;
GetDirectCommandList(cmd)->RSSetShadingRate(_ConvertShadingRate(rate, features_6), nullptr);
prev_shadingrate[cmd] = _rate;
// Combiners are set to MAX by default in BeginCommandList
GetDirectCommandList(cmd)->RSSetShadingRate(_rate, nullptr);
}
}
void GraphicsDevice_DX12::BindShadingRateImage(const Texture* texture, CommandList cmd)
{
if (VARIABLE_RATE_SHADING_TIER2)
{
if (texture == nullptr)
{
GetDirectCommandList(cmd)->RSSetShadingRateImage(nullptr);
}
else
{
assert(texture->desc.Format == FORMAT_R8_UINT);
GetDirectCommandList(cmd)->RSSetShadingRateImage(to_internal(texture)->resource.Get());
}
}
}
void GraphicsDevice_DX12::BindPipelineState(const PipelineState* pso, CommandList cmd)
+3 -1
View File
@@ -152,7 +152,7 @@ namespace wiGraphics
const RootSignature* active_rootsig_compute[COMMANDLIST_COUNT] = {};
const RenderPass* active_renderpass[COMMANDLIST_COUNT] = {};
D3D12_RENDER_PASS_ENDING_ACCESS_RESOLVE_SUBRESOURCE_PARAMETERS resolve_subresources[COMMANDLIST_COUNT][D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT] = {};
SHADING_RATE prev_shadingrate[COMMANDLIST_COUNT] = {};
D3D12_SHADING_RATE prev_shadingrate[COMMANDLIST_COUNT] = {};
bool dirty_pso[COMMANDLIST_COUNT] = {};
void pso_validate(CommandList cmd);
@@ -192,6 +192,7 @@ namespace wiGraphics
int CreateSubresource(Texture* texture, SUBRESOURCE_TYPE type, uint32_t firstSlice, uint32_t sliceCount, uint32_t firstMip, uint32_t mipCount) override;
void WriteShadingRateValue(SHADING_RATE rate, void* dest) override;
void WriteTopLevelAccelerationStructureInstance(const RaytracingAccelerationStructureDesc::TopLevel::Instance* instance, void* dest) override;
void WriteShaderIdentifier(const RaytracingPipelineState* rtpso, uint32_t group_index, void* dest) override;
void WriteDescriptor(const DescriptorTable* table, uint32_t rangeIndex, uint32_t arrayIndex, const GPUResource* resource, int subresource = -1, uint64_t offset = 0) override;
@@ -235,6 +236,7 @@ namespace wiGraphics
void BindStencilRef(uint32_t value, CommandList cmd) override;
void BindBlendFactor(float r, float g, float b, float a, CommandList cmd) override;
void BindShadingRate(SHADING_RATE rate, CommandList cmd) override;
void BindShadingRateImage(const Texture* texture, CommandList cmd) override;
void BindPipelineState(const PipelineState* pso, CommandList cmd) override;
void BindComputeShader(const Shader* cs, CommandList cmd) override;
void Draw(uint32_t vertexCount, uint32_t startVertexLocation, CommandList cmd) override;
+3 -8
View File
@@ -212,8 +212,6 @@ void wiHairParticle::Draw(const CameraComponent& camera, const MaterialComponent
GraphicsDevice* device = wiRenderer::GetDevice();
device->EventBegin("HairParticle - Draw", cmd);
device->BindShadingRate(shadingRate, cmd);
device->BindStencilRef(STENCILREF_DEFAULT, cmd);
if (wiRenderer::IsWireRender())
@@ -234,6 +232,7 @@ void wiHairParticle::Draw(const CameraComponent& camera, const MaterialComponent
};
device->BindResources(PS, res, TEXSLOT_ONDEMAND0, arraysize(res), cmd);
device->BindResources(VS, res, TEXSLOT_ONDEMAND0, arraysize(res), cmd);
device->BindShadingRate(material.shadingRate, cmd);
}
device->BindConstantBuffer(VS, &cb, CB_GETBINDSLOT(HairParticleCB), cmd);
@@ -273,7 +272,8 @@ void wiHairParticle::Serialize(wiArchive& archive, wiECS::Entity seed)
if (archive.GetVersion() >= 48)
{
archive >> (uint8_t&)shadingRate;
uint8_t shadingRate;
archive >> shadingRate; // no longer needed
}
}
else
@@ -298,11 +298,6 @@ void wiHairParticle::Serialize(wiArchive& archive, wiECS::Entity seed)
archive << frameCount;
archive << frameStart;
}
if (archive.GetVersion() >= 48)
{
archive << (uint8_t)shadingRate;
}
}
}
-1
View File
@@ -46,7 +46,6 @@ public:
float randomness = 0.2f;
float viewDistance = 200;
std::vector<float> vertex_lengths;
wiGraphics::SHADING_RATE shadingRate = wiGraphics::SHADING_RATE_1X1;
// Sprite sheet properties:
uint32_t framesX = 1;
+75 -1
View File
@@ -102,6 +102,8 @@ bool voxelHelper = false;
bool requestReflectionRendering = false;
bool requestVolumetricLightRendering = false;
bool advancedLightCulling = true;
bool variableRateShadingClassification = false;
bool variableRateShadingClassificationDebug = false;
bool ldsSkinningEnabled = true;
bool scene_bvh_invalid = true;
float renderTime = 0;
@@ -1335,6 +1337,8 @@ void LoadShaders()
wiJobSystem::Execute(ctx, [](wiJobArgs args) { LoadShader(CS, computeShaders[CSTYPE_LUMINANCE_PASS1], "luminancePass1CS.cso"); });
wiJobSystem::Execute(ctx, [](wiJobArgs args) { LoadShader(CS, computeShaders[CSTYPE_LUMINANCE_PASS2], "luminancePass2CS.cso"); });
wiJobSystem::Execute(ctx, [](wiJobArgs args) { LoadShader(CS, computeShaders[CSTYPE_SHADINGRATECLASSIFICATION], "shadingRateClassificationCS.cso"); });
wiJobSystem::Execute(ctx, [](wiJobArgs args) { LoadShader(CS, computeShaders[CSTYPE_SHADINGRATECLASSIFICATION_DEBUG], "shadingRateClassificationCS_DEBUG.cso"); });
wiJobSystem::Execute(ctx, [](wiJobArgs args) { LoadShader(CS, computeShaders[CSTYPE_TILEFRUSTUMS], "tileFrustumsCS.cso"); });
wiJobSystem::Execute(ctx, [](wiJobArgs args) { LoadShader(CS, computeShaders[CSTYPE_RESOLVEMSAADEPTHSTENCIL], "resolveMSAADepthStencilCS.cso"); });
wiJobSystem::Execute(ctx, [](wiJobArgs args) { LoadShader(CS, computeShaders[CSTYPE_VOXELSCENECOPYCLEAR], "voxelSceneCopyClearCS.cso"); });
@@ -2296,6 +2300,10 @@ void LoadBuffers()
device->CreateBuffer(&bd, nullptr, &constantBuffers[CBTYPE_PAINTRADIUS]);
device->SetName(&constantBuffers[CBTYPE_PAINTRADIUS], "PaintRadiusCB");
bd.ByteWidth = sizeof(ShadingRateClassificationCB);
device->CreateBuffer(&bd, nullptr, &constantBuffers[CBTYPE_SHADINGRATECLASSIFICATION]);
device->SetName(&constantBuffers[CBTYPE_SHADINGRATECLASSIFICATION], "ShadingRateClassificationCB");
}
void SetUpStates()
@@ -9403,6 +9411,68 @@ const Texture* ComputeLuminance(const Texture& sourceImage, CommandList cmd)
return nullptr;
}
void ComputeShadingRateClassification(
const Texture& gbuffer1,
const Texture& lineardepth,
const Texture& output,
CommandList cmd
)
{
GraphicsDevice* device = GetDevice();
device->EventBegin("ComputeShadingRateClassification", cmd);
auto range = wiProfiler::BeginRangeGPU("ComputeShadingRateClassification", cmd);
if (GetVariableRateShadingClassificationDebug())
{
device->BindUAV(CS, &textures[TEXTYPE_2D_DEBUGUAV], 1, cmd);
device->BindComputeShader(&computeShaders[CSTYPE_SHADINGRATECLASSIFICATION_DEBUG], cmd);
}
else
{
device->BindComputeShader(&computeShaders[CSTYPE_SHADINGRATECLASSIFICATION], cmd);
}
device->BindResource(CS, &gbuffer1, TEXSLOT_GBUFFER1, cmd);
device->BindResource(CS, &lineardepth, TEXSLOT_LINEARDEPTH, cmd);
const TextureDesc& desc = output.GetDesc();
ShadingRateClassificationCB cb = {}; // zero init the shading rates!
cb.xShadingRateTileSize = device->GetVariableRateShadingTileSize();
device->WriteShadingRateValue(SHADING_RATE_1X1, &cb.SHADING_RATE_1X1);
device->WriteShadingRateValue(SHADING_RATE_1X2, &cb.SHADING_RATE_1X2);
device->WriteShadingRateValue(SHADING_RATE_2X1, &cb.SHADING_RATE_2X1);
device->WriteShadingRateValue(SHADING_RATE_2X2, &cb.SHADING_RATE_2X2);
device->WriteShadingRateValue(SHADING_RATE_2X4, &cb.SHADING_RATE_2X4);
device->WriteShadingRateValue(SHADING_RATE_4X2, &cb.SHADING_RATE_4X2);
device->WriteShadingRateValue(SHADING_RATE_4X4, &cb.SHADING_RATE_4X4);
device->UpdateBuffer(&constantBuffers[CBTYPE_SHADINGRATECLASSIFICATION], &cb, cmd);
device->BindConstantBuffer(CS, &constantBuffers[CBTYPE_SHADINGRATECLASSIFICATION], CB_GETBINDSLOT(PostProcessCB), cmd);
const GPUResource* uavs[] = {
&output,
};
device->BindUAVs(CS, uavs, 0, arraysize(uavs), cmd);
device->Dispatch(
(desc.Width + POSTPROCESS_BLOCKSIZE - 1) / POSTPROCESS_BLOCKSIZE,
(desc.Height + POSTPROCESS_BLOCKSIZE - 1) / POSTPROCESS_BLOCKSIZE,
1,
cmd
);
GPUBarrier barriers[] = {
GPUBarrier::Memory(),
GPUBarrier::Image(&output,IMAGE_LAYOUT_UNORDERED_ACCESS, IMAGE_LAYOUT_SHADING_RATE_SOURCE),
};
device->Barrier(barriers, arraysize(barriers), cmd);
device->UnbindUAVs(0, arraysize(uavs), cmd);
wiProfiler::EndRange(range);
device->EventEnd(cmd);
}
void DeferredComposition(
const Texture& gbuffer0,
@@ -11593,7 +11663,7 @@ void Postprocess_VolumetricClouds(
const Texture& lightshaftoutput,
const Texture& lineardepth,
const Texture& depthbuffer,
wiGraphics::CommandList cmd
CommandList cmd
)
{
GraphicsDevice* device = GetDevice();
@@ -12455,6 +12525,10 @@ void SetDebugLightCulling(bool enabled) { debugLightCulling = enabled; }
bool GetDebugLightCulling() { return debugLightCulling; }
void SetAdvancedLightCulling(bool enabled) { advancedLightCulling = enabled; }
bool GetAdvancedLightCulling() { return advancedLightCulling; }
void SetVariableRateShadingClassification(bool enabled) { variableRateShadingClassification = enabled; }
bool GetVariableRateShadingClassification() { return variableRateShadingClassification; }
void SetVariableRateShadingClassificationDebug(bool enabled) { variableRateShadingClassificationDebug = enabled; }
bool GetVariableRateShadingClassificationDebug() { return variableRateShadingClassificationDebug; }
void SetAlphaCompositionEnabled(bool enabled) { ALPHACOMPOSITIONENABLED = enabled; }
bool GetAlphaCompositionEnabled() { return ALPHACOMPOSITIONENABLED; }
void SetOcclusionCullingEnabled(bool value)
+12 -1
View File
@@ -174,6 +174,12 @@ namespace wiRenderer
// Compute the luminance for the source image and return the texture containing the luminance value in pixel [0,0]
const wiGraphics::Texture* ComputeLuminance(const wiGraphics::Texture& sourceImage, wiGraphics::CommandList cmd);
void ComputeShadingRateClassification(
const wiGraphics::Texture& gbuffer1,
const wiGraphics::Texture& lineardepth,
const wiGraphics::Texture& output,
wiGraphics::CommandList cmd
);
void DeferredComposition(
const wiGraphics::Texture& gbuffer0,
@@ -183,7 +189,8 @@ namespace wiRenderer
const wiGraphics::Texture& lightmap_specular,
const wiGraphics::Texture& ao,
const wiGraphics::Texture& depth,
wiGraphics::CommandList cmd);
wiGraphics::CommandList cmd
);
void Postprocess_Blur_Gaussian(
@@ -471,6 +478,10 @@ namespace wiRenderer
bool GetDebugLightCulling();
void SetAdvancedLightCulling(bool enabled);
bool GetAdvancedLightCulling();
void SetVariableRateShadingClassification(bool enabled);
bool GetVariableRateShadingClassification();
void SetVariableRateShadingClassificationDebug(bool enabled);
bool GetVariableRateShadingClassificationDebug();
void SetAlphaCompositionEnabled(bool enabled);
bool GetAlphaCompositionEnabled();
void SetOcclusionCullingEnabled(bool enabled);
+1 -1
View File
@@ -9,7 +9,7 @@ namespace wiVersion
// minor features, major updates, breaking API changes
const int minor = 47;
// minor bug fixes, alterations, refactors, updates
const int revision = 27;
const int revision = 28;
const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);