Merge branch '649-donut-ssao'

This commit is contained in:
Robert Beckebans 2023-02-08 09:24:39 +01:00
commit 2ca5a759c9
22 changed files with 292 additions and 424 deletions

View file

@ -348,6 +348,7 @@ else (JPEG_FOUND)
set(JPEG_LIBRARY "" )
endif (JPEG_FOUND)
include_directories("libs/imgui")
macro(SET_OPTION option value)
set(${option} ${value} CACHE "" INTERNAL FORCE)
@ -1816,13 +1817,24 @@ else()
set(remove_command "rm")
endif()
# make sure precompiled header is deleted after executable is compiled
add_custom_command(TARGET RBDoom3BFG POST_BUILD
COMMAND ${remove_command} "idlib/precompiled.h.gch"
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMENT "remove idlib/precompiled.h.gch"
)
endif()
# delete precompiled header file after executable is compiled: command line build case
if(CMAKE_GENERATOR MATCHES "Makefiles" OR CMAKE_GENERATOR MATCHES "Ninja")
add_custom_target(rm_precomp_header ALL
COMMAND ${remove_command} "idlib/precompiled.h.gch"
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMENT "remove idlib/precompiled.h.gch"
)
add_dependencies(rm_precomp_header RBDoom3BFG)
# delete precompiled header file after executable is compiled: IDE build case (e.g. Xcode)
else()
add_custom_command(TARGET RBDoom3BFG POST_BUILD
COMMAND ${remove_command} "idlib/precompiled.h.gch"
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMENT "remove idlib/precompiled.h.gch"
)
endif()
endif()
if(NOT WIN32)
if(NOT APPLE)

View file

@ -2,7 +2,7 @@
#ifndef NEO_IMGUI_BFGIMGUI_H_
#define NEO_IMGUI_BFGIMGUI_H_
#include "libs/imgui/imgui.h"
#include "imgui.h"
#include "../idlib/math/Vector.h"

View file

@ -4,6 +4,7 @@
Doom 3 BFG Edition GPL Source Code
Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company.
Copyright (C) 2014 Robert Beckebans
Copyright (C) 2022 Stephen Pridham
This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code").
@ -494,6 +495,19 @@ void R_SetupProjectionMatrix( viewDef_t* viewDef, bool doJitter )
//
const float zNear = ( viewDef->renderView.cramZNear ) ? ( r_znear.GetFloat() * 0.25f ) : r_znear.GetFloat();
const int viewWidth = viewDef->viewport.x2 - viewDef->viewport.x1 + 1;
const int viewHeight = viewDef->viewport.y2 - viewDef->viewport.y1 + 1;
// TODO integrate jitterx += viewDef->renderView.stereoScreenSeparation;
// this mimics the logic in the Donut Feature Demo
const float xoffset = -2.0f * jitterx / ( 1.0f * viewWidth );
const float yoffset = -2.0f * jittery / ( 1.0f * viewHeight );
float* projectionMatrix = doJitter ? viewDef->projectionMatrix : viewDef->unjitteredProjectionMatrix;
#if 0
float ymax = zNear * tan( viewDef->renderView.fov_y * idMath::PI / 360.0f );
float ymin = -ymax;
@ -503,47 +517,13 @@ void R_SetupProjectionMatrix( viewDef_t* viewDef, bool doJitter )
const float width = xmax - xmin;
const float height = ymax - ymin;
const int viewWidth = viewDef->viewport.x2 - viewDef->viewport.x1 + 1;
const int viewHeight = viewDef->viewport.y2 - viewDef->viewport.y1 + 1;
#if 0
jitterx = jitterx * width / viewWidth;
jitterx += r_centerX.GetFloat();
jitterx += viewDef->renderView.stereoScreenSeparation;
xmin += jitterx * width;
xmax += jitterx * width;
const float xoffset = ( xmax + xmin ) / width; // 0 without jitter
jittery = jittery * height / viewHeight;
jittery += r_centerY.GetFloat();
ymin += jittery * height;
ymax += jittery * height;
const float yoffset = ( ymax + ymin ) / height;
#else
// this mimics the logic in the Donut / Feature Demo
const float xoffset = -2.0f * jitterx / ( 1.0f * viewWidth );
const float yoffset = -2.0f * jittery / ( 1.0f * viewHeight );
#endif
// RB: IMPORTANT - the projectionMatrix has a few changes to make it work with Vulkan
// for a detailed explanation see https://matthewwellings.com/blog/the-new-vulkan-coordinate-system/
float* projectionMatrix = doJitter ? viewDef->projectionMatrix : viewDef->unjitteredProjectionMatrix;
projectionMatrix[0 * 4 + 0] = 2.0f * zNear / width;
projectionMatrix[1 * 4 + 0] = 0.0f;
projectionMatrix[2 * 4 + 0] = xoffset;
projectionMatrix[3 * 4 + 0] = 0.0f;
projectionMatrix[0 * 4 + 1] = 0.0f;
// RB: Y axis now points down the screen
#if defined(USE_VULKAN)
projectionMatrix[1 * 4 + 1] = -2.0f * zNear / height;
#else
projectionMatrix[1 * 4 + 1] = 2.0f * zNear / height;
#endif
projectionMatrix[2 * 4 + 1] = yoffset;
projectionMatrix[3 * 4 + 1] = 0.0f;
@ -563,6 +543,43 @@ void R_SetupProjectionMatrix( viewDef_t* viewDef, bool doJitter )
projectionMatrix[2 * 4 + 3] = -1.0f;
projectionMatrix[3 * 4 + 3] = 0.0f;
#else
// alternative Z for better precision in the distance
float aspect = viewDef->renderView.fov_x / viewDef->renderView.fov_y;
float yScale = 1.0f / ( tanf( 0.5f * DEG2RAD( viewDef->renderView.fov_y ) ) );
float xScale = yScale / aspect;
const float epsilon = 1.9073486328125e-6F; // 2^-19;
const float zFar = 160000;
//float k = zFar / ( zFar - zNear );
float k = 1.0f - epsilon;
projectionMatrix[0 * 4 + 0] = xScale;
projectionMatrix[1 * 4 + 0] = 0.0f;
projectionMatrix[2 * 4 + 0] = xoffset;
projectionMatrix[3 * 4 + 0] = 0.0f;
projectionMatrix[0 * 4 + 1] = 0.0f;
projectionMatrix[1 * 4 + 1] = yScale;
projectionMatrix[2 * 4 + 1] = yoffset;
projectionMatrix[3 * 4 + 1] = 0.0f;
projectionMatrix[0 * 4 + 2] = 0.0f;
projectionMatrix[1 * 4 + 2] = 0.0f;
projectionMatrix[2 * 4 + 2] = -k;
projectionMatrix[3 * 4 + 2] = -k * zNear;
projectionMatrix[0 * 4 + 3] = 0.0f;
projectionMatrix[1 * 4 + 3] = 0.0f;
projectionMatrix[2 * 4 + 3] = -1.0f;
projectionMatrix[3 * 4 + 3] = 0.0f;
#endif
if( viewDef->renderView.flipProjection )
{
projectionMatrix[1 * 4 + 1] = -projectionMatrix[1 * 4 + 1];

View file

@ -32,7 +32,7 @@ If you have questions concerning this license or the applicable additional terms
#pragma hdrstop
#include "RenderCommon.h"
#include "libs/imgui/imgui.h"
#include "imgui.h"
const float idGuiModel::STEREO_DEPTH_NEAR = 0.0f;
const float idGuiModel::STEREO_DEPTH_MID = 0.5f;

View file

@ -31,7 +31,7 @@ If you have questions concerning this license or the applicable additional terms
#include "precompiled.h"
#pragma hdrstop
#include "libs/imgui/imgui.h"
#include "imgui.h"
#include "RenderCommon.h"
#include "SMAA/AreaTex.h"
@ -1101,8 +1101,8 @@ void idImageManager::CreateIntrinsicImages()
gbufferNormalsRoughnessImage = ImageFromFunction( "_currentNormals", R_GeometryBufferImage_ResNative );
ambientOcclusionImage[0] = ImageFromFunction( "_ao0", R_SMAAImage_ResNative );
ambientOcclusionImage[1] = ImageFromFunction( "_ao1", R_SMAAImage_ResNative );
ambientOcclusionImage[0] = ImageFromFunction( "_ao0", R_AmbientOcclusionImage_ResNative );
ambientOcclusionImage[1] = ImageFromFunction( "_ao1", R_AmbientOcclusionImage_ResNative );
hierarchicalZbufferImage = ImageFromFunction( "_cszBuffer", R_HierarchicalZBufferImage_ResNative );

View file

@ -35,7 +35,7 @@ If you have questions concerning this license or the applicable additional terms
#include "../RenderCommon.h"
#include "../RenderBackend.h"
#include "../../framework/Common_local.h"
#include "../../imgui/imgui.h"
#include "imgui.h"
#include "../ImmediateMode.h"
#include "nvrhi/utils.h"
@ -249,12 +249,6 @@ void idRenderBackend::Init()
currentJointOffset = 0;
prevBindingLayoutType = -1;
// RB: FIXME but for now disable it to avoid validation errors
if( deviceManager->GetGraphicsAPI() == nvrhi::GraphicsAPI::VULKAN )
{
r_useSSAO.SetBool( false );
}
deviceManager->GetDevice()->waitForIdle();
deviceManager->GetDevice()->runGarbageCollection();
}
@ -1755,10 +1749,6 @@ void idRenderBackend::GL_Clear( bool color, bool depth, bool stencil, byte stenc
if( depth || stencil )
{
nvrhi::utils::ClearDepthStencilAttachment( commandList, framebuffer, 1.0f, stencilValue );
//nvrhi::ITexture* depthTexture = ( nvrhi::ITexture* )( globalImages->currentDepthImage->GetTextureID() );
//const nvrhi::FormatInfo& depthFormatInfo = nvrhi::getFormatInfo( depthTexture->getDesc().format );
//commandList->clearDepthStencilTexture( depthTexture, nvrhi::AllSubresources, depth, 1.f, depthFormatInfo.hasStencil, stencilValue );
}
}
@ -1858,12 +1848,6 @@ void idRenderBackend::CheckCVars()
r_antiAliasing.ClearModified();
}
#endif
// RB: FIXME but for now disable it to avoid validation errors
if( deviceManager->GetGraphicsAPI() == nvrhi::GraphicsAPI::VULKAN )
{
r_useSSAO.SetBool( false );
}
}
/*

View file

@ -1,29 +1,23 @@
/*
===========================================================================
Doom 3 BFG Edition GPL Source Code
Copyright (C) 2022 Stephen Pridham
This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code").
Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Doom 3 BFG Edition Source Code. If not, see <http://www.gnu.org/licenses/>.
In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below.
If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
===========================================================================
* Copyright (c) 2014-2021, NVIDIA CORPORATION. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#include <precompiled.h>
#pragma hdrstop
@ -32,8 +26,23 @@ If you have questions concerning this license or the applicable additional terms
#include "SsaoPass.h"
static idCVar r_ssaoBackgroundViewDepth( "r_ssaoBackgroundViewDepth", "100", CVAR_RENDERER | CVAR_FLOAT, "" );
static idCVar r_ssaoRadiusWorld( "r_ssaoRadiusWorld", "0.5", CVAR_RENDERER | CVAR_FLOAT, "" );
static idCVar r_ssaoSurfaceBias( "r_ssaoSurfaceBias", "0.1", CVAR_RENDERER | CVAR_FLOAT, "" );
static idCVar r_ssaoPowerExponent( "r_ssaoPowerExponent", "2", CVAR_RENDERER | CVAR_FLOAT, "" );
static idCVar r_ssaoBlurSharpness( "r_ssaoBlurSharpness", "16", CVAR_RENDERER | CVAR_FLOAT, "" );
static idCVar r_ssaoAmount( "r_ssaoAmount", "2", CVAR_RENDERER | CVAR_FLOAT, "" );
struct SsaoConstants
{
idVec2 viewportOrigin;
idVec2 viewportSize;
idRenderMatrix matClipToView;
idRenderMatrix matWorldToView;
idRenderMatrix matViewToWorld;
idVec2 clipToView;
idVec2 invQuantizedGbufferSize;
@ -223,58 +232,72 @@ void SsaoPass::CreateBindingSet(
void SsaoPass::Render(
nvrhi::ICommandList* commandList,
const SsaoParameters& params,
viewDef_t* viewDef,
const viewDef_t* viewDef,
int bindingSetIndex )
{
assert( m_Deinterleave.BindingSets[bindingSetIndex] );
assert( m_Compute.BindingSets[bindingSetIndex] );
assert( m_Blur.BindingSets[bindingSetIndex] );
commandList->beginMarker( "SSAO" );
{
nvrhi::Rect viewExtent( viewDef->viewport.x1, viewDef->viewport.x2, viewDef->viewport.y1, viewDef->viewport.y2 );
nvrhi::Rect quarterResExtent = viewExtent;
quarterResExtent.minX /= 4;
quarterResExtent.minY /= 4;
quarterResExtent.maxX = ( quarterResExtent.maxX + 3 ) / 4;
quarterResExtent.maxY = ( quarterResExtent.maxY + 3 ) / 4;
nvrhi::Rect viewExtent( viewDef->viewport.x1, viewDef->viewport.x2, viewDef->viewport.y1, viewDef->viewport.y2 );
nvrhi::Rect quarterResExtent = viewExtent;
quarterResExtent.minX /= 4;
quarterResExtent.minY /= 4;
quarterResExtent.maxX = ( quarterResExtent.maxX + 3 ) / 4;
quarterResExtent.maxY = ( quarterResExtent.maxY + 3 ) / 4;
SsaoConstants ssaoConstants = {};
ssaoConstants.viewportOrigin = idVec2( viewDef->viewport.x1, viewDef->viewport.y1 );
ssaoConstants.viewportSize = idVec2( viewDef->viewport.GetWidth(), viewDef->viewport.GetHeight() );
SsaoConstants ssaoConstants = {};
ssaoConstants.clipToView = idVec2(
viewDef->projectionMatrix[2 * 4 + 3] / viewDef->projectionMatrix[0 * 4 + 0],
viewDef->projectionMatrix[2 * 4 + 3] / viewDef->projectionMatrix[0 * 4 + 1] );
ssaoConstants.invQuantizedGbufferSize = 1.f / m_QuantizedGbufferTextureSize;
ssaoConstants.quantizedViewportOrigin = idVec2i( quarterResExtent.minX, quarterResExtent.minY ) * 4;
ssaoConstants.amount = params.amount;
ssaoConstants.invBackgroundViewDepth = ( params.backgroundViewDepth > 0.f ) ? 1.f / params.backgroundViewDepth : 0.f;
ssaoConstants.radiusWorld = params.radiusWorld;
ssaoConstants.surfaceBias = params.surfaceBias;
ssaoConstants.powerExponent = params.powerExponent;
ssaoConstants.radiusToScreen = 0.5f * viewDef->viewport.GetHeight() * abs( viewDef->projectionMatrix[1 * 4 + 1] );
commandList->writeBuffer( m_ConstantBuffer, &ssaoConstants, sizeof( ssaoConstants ) );
ssaoConstants.matClipToView = viewDef->unprojectionToCameraRenderMatrix;
uint32_t dispatchWidth = ( quarterResExtent.width() + 7 ) / 8;
uint32_t dispatchHeight = ( quarterResExtent.height() + 7 ) / 8;
// SRS - FIXME: These transformations need to be verified
nvrhi::ComputeState state;
state.pipeline = m_Deinterleave.Pipeline;
state.bindings = { m_Deinterleave.BindingSets[bindingSetIndex] };
commandList->setComputeState( state );
commandList->dispatch( dispatchWidth, dispatchHeight, 1 );
// RB: TODO: only need for DIRECTIONAL_OCCLUSION
//ssaoConstants.matViewToWorld = viewDef->worldSpace;
//idRenderMatrix::Inverse( ssaoConstants.matViewToWorld, ssaoConstants.matWorldToView );
// SRS end
state.pipeline = m_Compute.Pipeline;
state.bindings = { m_Compute.BindingSets[bindingSetIndex] };
commandList->setComputeState( state );
commandList->dispatch( dispatchWidth, dispatchHeight, 16 );
float projectionMatrix[16];
dispatchWidth = ( viewExtent.width() + 15 ) / 16;
dispatchHeight = ( viewExtent.height() + 15 ) / 16;
//R_MatrixTranspose( viewDef->projectionMatrix, projectionMatrix );
memcpy( projectionMatrix, viewDef->projectionMatrix, 16 * 4 );
state.pipeline = m_Blur.Pipeline;
state.bindings = { m_Blur.BindingSets[bindingSetIndex] };
commandList->setComputeState( state );
commandList->dispatch( dispatchWidth, dispatchHeight, 1 );
ssaoConstants.clipToView = idVec2(
projectionMatrix[2 * 4 + 3] / projectionMatrix[0 * 4 + 0],
projectionMatrix[2 * 4 + 3] / projectionMatrix[1 * 4 + 1] );
ssaoConstants.invQuantizedGbufferSize = 1.f / m_QuantizedGbufferTextureSize;
ssaoConstants.quantizedViewportOrigin = idVec2i( quarterResExtent.minX, quarterResExtent.minY ) * 4;
ssaoConstants.amount = r_ssaoAmount.GetFloat();
ssaoConstants.invBackgroundViewDepth = ( r_ssaoBackgroundViewDepth.GetFloat() > 0.f ) ? 1.f / r_ssaoBackgroundViewDepth.GetFloat() : 0.f;
ssaoConstants.radiusWorld = r_ssaoRadiusWorld.GetFloat();
ssaoConstants.surfaceBias = r_ssaoSurfaceBias.GetFloat();
ssaoConstants.powerExponent = r_ssaoPowerExponent.GetFloat();
ssaoConstants.radiusToScreen = 0.5f * viewDef->viewport.GetHeight() * abs( projectionMatrix[1 * 4 + 1] );
commandList->writeBuffer( m_ConstantBuffer, &ssaoConstants, sizeof( ssaoConstants ) );
commandList->endMarker();
}
uint32_t dispatchWidth = ( quarterResExtent.width() + 7 ) / 8;
uint32_t dispatchHeight = ( quarterResExtent.height() + 7 ) / 8;
nvrhi::ComputeState state;
state.pipeline = m_Deinterleave.Pipeline;
state.bindings = { m_Deinterleave.BindingSets[bindingSetIndex] };
commandList->setComputeState( state );
commandList->dispatch( dispatchWidth, dispatchHeight, 1 );
state.pipeline = m_Compute.Pipeline;
state.bindings = { m_Compute.BindingSets[bindingSetIndex] };
commandList->setComputeState( state );
commandList->dispatch( dispatchWidth, dispatchHeight, 16 );
dispatchWidth = ( viewExtent.width() + 15 ) / 16;
dispatchHeight = ( viewExtent.height() + 15 ) / 16;
state.pipeline = m_Blur.Pipeline;
state.bindings = { m_Blur.BindingSets[bindingSetIndex] };
commandList->setComputeState( state );
commandList->dispatch( dispatchWidth, dispatchHeight, 1 );
}
}

View file

@ -1,33 +1,28 @@
/*
===========================================================================
Doom 3 BFG Edition GPL Source Code
Copyright (C) 2022 Stephen Pridham
This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code").
Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Doom 3 BFG Edition Source Code. If not, see <http://www.gnu.org/licenses/>.
In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below.
If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
===========================================================================
* Copyright (c) 2014-2021, NVIDIA CORPORATION. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef RENDERER_PASSES_SSAOPASS_H_
#define RENDERER_PASSES_SSAOPASS_H_
/*
struct SsaoParameters
{
float amount = 2.f;
@ -38,6 +33,7 @@ struct SsaoParameters
bool enableBlur = true;
float blurSharpness = 16.f;
};
*/
class SsaoPass
{
@ -92,9 +88,8 @@ public:
void Render(
nvrhi::ICommandList* commandList,
const SsaoParameters& params,
viewDef_t* viewDef,
const viewDef_t* viewDef,
int bindingSetIndex = 0 );
};
#endif
#endif

View file

@ -58,6 +58,8 @@ idCVar r_useLightStencilSelect( "r_useLightStencilSelect", "0", CVAR_RENDERER |
extern idCVar stereoRender_swapEyes;
// SRS - flag indicating whether we are drawing a 3d view vs. a 2d-only view (e.g. menu or pda)
bool drawView3D;
/*
================
@ -5868,9 +5870,8 @@ void idRenderBackend::Bloom( const viewDef_t* _viewDef )
}
void idRenderBackend::DrawScreenSpaceAmbientOcclusion( const viewDef_t* _viewDef, bool downModulateScreen )
void idRenderBackend::DrawScreenSpaceAmbientOcclusion( const viewDef_t* _viewDef )
{
#if !defined(USE_VULKAN)
if( !_viewDef->viewEntitys || _viewDef->is2Dgui )
{
// 3D views only
@ -5878,7 +5879,7 @@ void idRenderBackend::DrawScreenSpaceAmbientOcclusion( const viewDef_t* _viewDef
}
// FIXME: the hierarchical depth buffer does not work with the MSAA depth texture source
if( r_useSSAO.GetInteger() <= 0 || r_useSSAO.GetInteger() > 1 || R_GetMSAASamples() > 1 )
if( !r_useSSAO.GetBool() || R_GetMSAASamples() > 1 )
{
return;
}
@ -5908,13 +5909,11 @@ void idRenderBackend::DrawScreenSpaceAmbientOcclusion( const viewDef_t* _viewDef
#if defined( USE_NVRHI )
commandList->clearTextureFloat( globalImages->hierarchicalZbufferImage->GetTextureHandle(), nvrhi::AllSubresources, nvrhi::Color( 1.f ) );
commandList->clearTextureFloat( globalImages->ambientOcclusionImage[0]->GetTextureHandle(), nvrhi::AllSubresources, nvrhi::Color( 1.f ) );
commandList->clearTextureFloat( globalImages->ambientOcclusionImage[1]->GetTextureHandle(), nvrhi::AllSubresources, nvrhi::Color( 1.f ) );
#endif
// build hierarchical depth buffer
if( r_useHierarchicalDepthBuffer.GetBool() )
{
#if defined( USE_NVRHI )
renderLog.OpenBlock( "Render_HiZ" );
//if( R_GetMSAASamples() > 1 )
@ -5933,63 +5932,6 @@ void idRenderBackend::DrawScreenSpaceAmbientOcclusion( const viewDef_t* _viewDef
hiZGenPass->Dispatch( commandList, MAX_HIERARCHICAL_ZBUFFERS );
renderLog.CloseBlock();
#else
renderLog.OpenBlock( "Render_HiZ", colorDkGrey );
renderProgManager.BindShader_AmbientOcclusionMinify();
GL_Color( 0, 0, 0, 1 );
GL_SelectTexture( 0 );
//globalImages->currentDepthImage->Bind();
for( int i = 0; i < MAX_HIERARCHICAL_ZBUFFERS; i++ )
{
int width = globalFramebuffers.csDepthFBO[i]->GetWidth();
int height = globalFramebuffers.csDepthFBO[i]->GetHeight();
globalFramebuffers.csDepthFBO[i]->Bind();
GL_Viewport( 0, 0, width, height );
GL_Scissor( 0, 0, width, height );
GL_State( GLS_SRCBLEND_ONE | GLS_DSTBLEND_ZERO | GLS_DEPTHMASK | GLS_DEPTHFUNC_ALWAYS | GLS_CULL_TWOSIDED );
glClear( GL_COLOR_BUFFER_BIT );
if( i == 0 )
{
renderProgManager.BindShader_AmbientOcclusionReconstructCSZ();
globalImages->currentDepthImage->Bind();
}
else
{
renderProgManager.BindShader_AmbientOcclusionMinify();
GL_SelectTexture( 0 );
globalImages->hierarchicalZbufferImage->Bind();
}
float jitterTexScale[4];
jitterTexScale[0] = i - 1;
jitterTexScale[1] = 0;
jitterTexScale[2] = 0;
jitterTexScale[3] = 0;
SetFragmentParm( RENDERPARM_JITTERTEXSCALE, jitterTexScale ); // rpJitterTexScale
float screenCorrectionParm[4];
screenCorrectionParm[0] = 1.0f / width;
screenCorrectionParm[1] = 1.0f / height;
screenCorrectionParm[2] = width;
screenCorrectionParm[3] = height;
SetFragmentParm( RENDERPARM_SCREENCORRECTIONFACTOR, screenCorrectionParm ); // rpScreenCorrectionFactor
DrawElementsWithCounters( &unitSquareSurface );
}
renderLog.CloseBlock();
#endif
}
if( previousFramebuffer != NULL )
@ -6008,41 +5950,6 @@ void idRenderBackend::DrawScreenSpaceAmbientOcclusion( const viewDef_t* _viewDef
GL_Viewport( 0, 0, aoScreenWidth, aoScreenHeight );
GL_Scissor( 0, 0, aoScreenWidth, aoScreenHeight );
if( downModulateScreen )
{
if( r_ssaoFiltering.GetBool() )
{
globalFramebuffers.ambientOcclusionFBO[0]->Bind();
#if defined( USE_NVRHI )
GL_Clear( true, false, false, 0, 0, 0, 0, 0, false );
#else
glClearColor( 0, 0, 0, 0 );
glClear( GL_COLOR_BUFFER_BIT );
#endif
renderProgManager.BindShader_AmbientOcclusion();
}
else
{
if( r_ssaoDebug.GetInteger() <= 0 )
{
GL_State( GLS_SRCBLEND_DST_COLOR | GLS_DSTBLEND_ZERO | GLS_ALPHAMASK | GLS_DEPTHMASK | GLS_DEPTHFUNC_ALWAYS );
}
if( previousFramebuffer != NULL )
{
previousFramebuffer->Bind();
}
else
{
Framebuffer::Unbind();
}
renderProgManager.BindShader_AmbientOcclusionAndOutput();
}
}
else
{
globalFramebuffers.ambientOcclusionFBO[0]->Bind();
@ -6085,19 +5992,6 @@ void idRenderBackend::DrawScreenSpaceAmbientOcclusion( const viewDef_t* _viewDef
windowCoordParm[3] = aoScreenHeight;
SetFragmentParm( RENDERPARM_WINDOWCOORD, windowCoordParm ); // rpWindowCoord
#if 0
// RB: set unprojection matrices so we can convert zbuffer values back to camera and world spaces
idRenderMatrix modelViewMatrix;
idRenderMatrix::Transpose( *( idRenderMatrix* )backEnd.viewDef->worldSpace.modelViewMatrix, modelViewMatrix );
idRenderMatrix cameraToWorldMatrix;
if( !idRenderMatrix::Inverse( modelViewMatrix, cameraToWorldMatrix ) )
{
idLib::Warning( "cameraToWorldMatrix invert failed" );
}
SetVertexParms( RENDERPARM_MODELMATRIX_X, cameraToWorldMatrix[0], 4 );
//SetVertexParms( RENDERPARM_MODELMATRIX_X, viewDef->unprojectionToWorldRenderMatrix[0], 4 );
#endif
SetVertexParms( RENDERPARM_MODELMATRIX_X, viewDef->unprojectionToCameraRenderMatrix[0], 4 );
const float jitterSampleScale = 1.0f;
@ -6148,6 +6042,10 @@ void idRenderBackend::DrawScreenSpaceAmbientOcclusion( const viewDef_t* _viewDef
{
float jitterTexScale[4];
#if defined( USE_NVRHI )
commandList->clearTextureFloat( globalImages->ambientOcclusionImage[1]->GetTextureHandle(), nvrhi::AllSubresources, nvrhi::Color( 1.f ) );
#endif
// AO blur X
globalFramebuffers.ambientOcclusionFBO[1]->Bind();
@ -6166,26 +6064,7 @@ void idRenderBackend::DrawScreenSpaceAmbientOcclusion( const viewDef_t* _viewDef
DrawElementsWithCounters( &unitSquareSurface );
// AO blur Y
if( downModulateScreen )
{
if( previousFramebuffer != NULL )
{
previousFramebuffer->Bind();
}
else
{
Framebuffer::Unbind();
}
if( r_ssaoDebug.GetInteger() <= 0 )
{
GL_State( GLS_SRCBLEND_DST_COLOR | GLS_DSTBLEND_ZERO | GLS_DEPTHMASK | GLS_DEPTHFUNC_ALWAYS );
}
}
else
{
globalFramebuffers.ambientOcclusionFBO[0]->Bind();
}
globalFramebuffers.ambientOcclusionFBO[0]->Bind();
renderProgManager.BindShader_AmbientOcclusionBlurAndOutput();
@ -6202,7 +6081,6 @@ void idRenderBackend::DrawScreenSpaceAmbientOcclusion( const viewDef_t* _viewDef
DrawElementsWithCounters( &unitSquareSurface );
}
if( !downModulateScreen )
{
// go back to main scene render target
if( previousFramebuffer != NULL )
@ -6233,16 +6111,16 @@ void idRenderBackend::DrawScreenSpaceAmbientOcclusion( const viewDef_t* _viewDef
/*
NVRHI SSAO using compute shaders.
*/
void idRenderBackend::DrawScreenSpaceAmbientOcclusion2( const viewDef_t* _viewDef, bool downModulateScreen )
void idRenderBackend::DrawScreenSpaceAmbientOcclusion2( const viewDef_t* _viewDef )
{
if( !_viewDef->viewEntitys || _viewDef->is2Dgui )
if( !r_useSSAO.GetBool() )
{
// 3D views only
return;
}
if( r_useSSAO.GetInteger() <= 0 || r_useSSAO.GetInteger() < 2 )
if( !_viewDef->viewEntitys || _viewDef->is2Dgui )
{
// 3D views only
return;
}
@ -6257,8 +6135,15 @@ void idRenderBackend::DrawScreenSpaceAmbientOcclusion2( const viewDef_t* _viewDe
return;
}
//GL_CheckErrors();
#endif
renderLog.OpenMainBlock( MRB_SSAO_PASS );
renderLog.OpenBlock( "Render_SSAO2", colorBlue );
commandList->clearTextureFloat( globalImages->ambientOcclusionImage[0]->GetTextureHandle(), nvrhi::AllSubresources, nvrhi::Color( 1.f ) );
ssaoPass->Render( commandList, _viewDef, 0 );
renderLog.CloseBlock();
renderLog.CloseMainBlock();
}
void idRenderBackend::DrawScreenSpaceGlobalIllumination( const viewDef_t* _viewDef )
@ -6600,14 +6485,7 @@ void idRenderBackend::ExecuteBackEndCommands( const emptyCommand_t* cmds )
delete hiZGenPass;
}
if( deviceManager->GetGraphicsAPI() == nvrhi::GraphicsAPI::VULKAN )
{
hiZGenPass = NULL;
}
else
{
hiZGenPass = new MipMapGenPass( deviceManager->GetDevice(), globalImages->hierarchicalZbufferImage->GetTextureHandle() );
}
hiZGenPass = new MipMapGenPass( deviceManager->GetDevice(), globalImages->hierarchicalZbufferImage->GetTextureHandle() );
}
@ -6641,7 +6519,7 @@ void idRenderBackend::ExecuteBackEndCommands( const emptyCommand_t* cmds )
// SRS - Save glConfig.timerQueryAvailable state so it can be disabled for RC_DRAW_VIEW_GUI then restored after it is finished
const bool timerQueryAvailable = glConfig.timerQueryAvailable;
bool drawView3D_timestamps = false;
drawView3D = false;
for( ; cmds != NULL; cmds = ( const emptyCommand_t* )cmds->next )
{
@ -6651,7 +6529,7 @@ void idRenderBackend::ExecuteBackEndCommands( const emptyCommand_t* cmds )
break;
case RC_DRAW_VIEW_GUI:
if( drawView3D_timestamps )
if( drawView3D )
{
// SRS - Capture separate timestamps for overlay GUI rendering when RC_DRAW_VIEW_3D timestamps are active
renderLog.OpenMainBlock( MRB_DRAW_GUI );
@ -6674,7 +6552,7 @@ void idRenderBackend::ExecuteBackEndCommands( const emptyCommand_t* cmds )
break;
case RC_DRAW_VIEW_3D:
drawView3D_timestamps = true;
drawView3D = true;
DrawView( cmds, 0 );
c_draw3d++;
break;
@ -6854,7 +6732,16 @@ void idRenderBackend::DrawViewInternal( const viewDef_t* _viewDef, const int ste
//-------------------------------------------------
// build hierarchical depth buffer and SSAO render target
//-------------------------------------------------
DrawScreenSpaceAmbientOcclusion( _viewDef, false );
#if defined( USE_NVRHI )
if( r_useNewSsaoPass.GetBool() )
{
DrawScreenSpaceAmbientOcclusion2( _viewDef );
}
else
#endif
{
DrawScreenSpaceAmbientOcclusion( _viewDef );
}
//-------------------------------------------------
// render static lighting and consider SSAO results

View file

@ -353,8 +353,8 @@ private:
void Tonemap( const viewDef_t* viewDef );
void Bloom( const viewDef_t* viewDef );
void DrawScreenSpaceAmbientOcclusion( const viewDef_t* _viewDef, bool downModulateScreen );
void DrawScreenSpaceAmbientOcclusion2( const viewDef_t* _viewDef, bool downModulateScreen );
void DrawScreenSpaceAmbientOcclusion( const viewDef_t* _viewDef );
void DrawScreenSpaceAmbientOcclusion2( const viewDef_t* _viewDef );
void DrawScreenSpaceGlobalIllumination( const viewDef_t* _viewDef );
// Experimental feature

View file

@ -32,7 +32,7 @@ If you have questions concerning this license or the applicable additional terms
#include "precompiled.h"
#pragma hdrstop
#include "libs/imgui/imgui.h"
#include "imgui.h"
#include "RenderCommon.h"

View file

@ -57,8 +57,7 @@
#define MIN_MIP_LEVEL 0
static const float DOOM_TO_METERS = 0.0254; // doom to meters
static const float METERS_TO_DOOM = ( 1.0 / DOOM_TO_METERS ); // meters to doom
/** Used for preventing AO computation on the sky (at infinite depth) and defining the CS Z to bilateral depth key scaling.
This need not match the real far plane but should not be much more than it.*/
@ -93,11 +92,11 @@ static const float projScale = 500.0;
#define VALUE_TYPE float
Texture2D t_NormalRoughness : register( t0 VK_DESCRIPTOR_SET( 1 ) );
Texture2D<VALUE_TYPE> t_ViewDepth : register( t1 VK_DESCRIPTOR_SET( 1 ) );
Texture2D t_BlueNoise : register( t2 VK_DESCRIPTOR_SET( 1 ) );
Texture2D t_NormalRoughness : register( t0 VK_DESCRIPTOR_SET( 0 ) );
Texture2D<VALUE_TYPE> t_ViewDepth : register( t1 VK_DESCRIPTOR_SET( 0 ) );
Texture2D t_BlueNoise : register( t2 VK_DESCRIPTOR_SET( 0 ) );
SamplerState blueNoiseSampler : register( s0 VK_DESCRIPTOR_SET( 2 ) );
SamplerState blueNoiseSampler : register( s0 VK_DESCRIPTOR_SET( 1 ) );
#define CS_Z_buffer t_ViewDepth

View file

@ -22,9 +22,9 @@
// *INDENT-OFF*
#define VALUE_TYPE float
Texture2D t_NormalRoughness : register( t0 VK_DESCRIPTOR_SET( 1 ) );
Texture2D<VALUE_TYPE> t_ViewDepth : register( t1 VK_DESCRIPTOR_SET( 1 ) );
Texture2D t_Ao : register( t2 VK_DESCRIPTOR_SET( 1 ) );
Texture2D t_NormalRoughness : register( t0 VK_DESCRIPTOR_SET( 0 ) );
Texture2D<VALUE_TYPE> t_ViewDepth : register( t1 VK_DESCRIPTOR_SET( 0 ) );
Texture2D t_Ao : register( t2 VK_DESCRIPTOR_SET( 0 ) );
#define normal_buffer t_NormalRoughness
#define cszBuffer t_ViewDepth
@ -103,7 +103,7 @@ float3 sampleNormal( Texture2D normalBuffer, int2 ssC, int mipLevel )
/** Used for preventing AO computation on the sky (at infinite depth) and defining the CS Z to bilateral depth key scaling.
This need not match the real far plane but should not be much more than it.*/
const float FAR_PLANE_Z = -16000.0;
static const float FAR_PLANE_Z = -16000.0;
float CSZToKey( float z )
{

View file

@ -26,6 +26,13 @@
struct SsaoConstants
{
float2 viewportOrigin;
float2 viewportSize;
float4x4 matClipToView;
float4x4 matWorldToView;
float4x4 matViewToWorld;
float2 clipToView;
float2 invQuantizedGbufferSize;
@ -170,8 +177,8 @@ void main( uint2 groupId : SV_GroupID, uint2 threadId : SV_GroupThreadID, uint2
int2 storePos = int2( globalId.xy ) + g_Ssao.quantizedViewportOrigin;
float2 storePosF = float2( storePos );
//if (all(storePosF >= g_Ssao.view.viewportOrigin.xy) && all(storePosF < g_Ssao.view.viewportOrigin.xy + g_Ssao.view.viewportSize.xy))
//{
// u_RenderTarget[storePos] = totalOcclusion;
//}
if( all( storePosF >= g_Ssao.viewportOrigin.xy ) && all( storePosF < g_Ssao.viewportOrigin.xy + g_Ssao.viewportSize.xy ) )
{
u_RenderTarget[storePos] = totalOcclusion;
}
}

View file

@ -26,6 +26,13 @@
struct SsaoConstants
{
float2 viewportOrigin;
float2 viewportSize;
float4x4 matClipToView;
float4x4 matWorldToView;
float4x4 matViewToWorld;
float2 clipToView;
float2 invQuantizedGbufferSize;
@ -169,12 +176,13 @@ float ComputeAO( float3 V, float3 N, float InvR2 )
float2 WindowToClip( float2 windowPos )
{
float2 clipToWindowScale = float2( 0.5f * rpWindowCoord.z, -0.5f * rpWindowCoord.w );
float2 clipToWindowBias = rpViewOrigin.xy + rpWindowCoord.zw * 0.5f;
float2 clipToWindowScale = float2( 0.5f * g_Ssao.viewportSize.x, -0.5f * g_Ssao.viewportSize.y );
float2 clipToWindowBias = g_Ssao.viewportOrigin.xy + g_Ssao.viewportSize.xy * 0.5f;
float2 windowToClipScale = 1.f / clipToWindowScale;
float2 windowToClipBias = -clipToWindowBias * windowToClipScale;
// TODO add pixelOffset for TAA
return windowPos.xy * windowToClipScale + windowToClipBias;
}
@ -199,13 +207,8 @@ void main( uint3 globalId : SV_DispatchThreadID )
float3 pixelNormal = t_Normals[pixelPos].xyz;
#endif
// View to clip space.
float3 pN;
pN.x = dot4( float4( pixelNormal, 0 ), rpModelMatrixX );
pN.y = dot4( float4( pixelNormal, 0 ), rpModelMatrixY );
pN.z = dot4( float4( pixelNormal, 0 ), rpModelMatrixZ );
pixelNormal = normalize( pN );
// RB: pixelNormal is already in view space
//pixelNormal = normalize( mul( float4( pixelNormal, 0 ), g_Ssao.matWorldToView ).xyz );
float2 pixelClipPos = WindowToClip( pixelPos );
float3 pixelViewPos = ViewDepthToViewPos( pixelClipPos.xy, pixelViewDepth );
@ -268,12 +271,7 @@ void main( uint3 globalId : SV_DispatchThreadID )
float directionalLength = length( result.xyz );
if( directionalLength > 0 )
{
float3 worldSpaceResult;
worldSpaceResult.x = dot4( float4( normalize( result.xyz ), 0 ), rpModelMatrixX );
worldSpaceResult.y = dot4( float4( normalize( result.xyz ), 0 ), rpModelMatrixY );
worldSpaceResult.z = dot4( float4( normalize( result.xyz ), 0 ), rpModelMatrixZ );
result.xyz = worldSpaceResult.xyz * directionalLength;
result.xyz = mul( float4( normalize( result.xyz ), 0 ), g_Ssao.matViewToWorld ).xyz * directionalLength;
}
#endif

View file

@ -26,6 +26,13 @@
struct SsaoConstants
{
float2 viewportOrigin;
float2 viewportSize;
float4x4 matClipToView;
float4x4 matWorldToView;
float4x4 matViewToWorld;
float2 clipToView;
float2 invQuantizedGbufferSize;
@ -67,14 +74,22 @@ void main( uint3 globalId : SV_DispatchThreadID )
#if LINEAR_DEPTH
float linearDepth = depth;
#else
float4 clipPos = float4( 0, 0, depth, 1 );
float4 viewPos;
viewPos.x = dot4( clipPos, rpModelMatrixX );
viewPos.y = dot4( clipPos, rpModelMatrixY );
viewPos.z = dot4( clipPos, rpModelMatrixZ );
viewPos.w = dot4( clipPos, rpModelMatrixW );
//float4 clipPos = float4( 0, 0, depth, 1 );
//float4 clipPos = float4( 0, 0, depth * 2.0 - 1.0, 1 );
// adjust depth
depth = ( depth * 2.0 - 1.0 );
float4 clipPos = float4( 0, 0, depth, 1 );
float4 viewPos = mul( clipPos, g_Ssao.matClipToView );
float linearDepth = viewPos.z / viewPos.w;
// HACK: adjust linear depth to fit into [0 .. 16000] range
//linearDepth += 0.35;
//linearDepth = saturate( linearDepth );
//linearDepth = 1.0 - linearDepth; // reverse depth
//linearDepth *= 4000; // zFar
//linearDepth *= DOOM_TO_METERS;
#endif
depths[y * 4 + x] = linearDepth;

View file

@ -43,9 +43,6 @@
#define MIN_MIP_LEVEL 0
static const float DOOM_TO_METERS = 0.0254; // doom to meters
static const float METERS_TO_DOOM = ( 1.0 / DOOM_TO_METERS ); // meters to doom
/** Used for preventing AO computation on the sky (at infinite depth) and defining the CS Z to bilateral depth key scaling.
This need not match the real far plane but should not be much more than it.*/
static const float FAR_PLANE_Z = -4000.0;

View file

@ -66,7 +66,7 @@ void main( PS_IN fragment, out PS_OUT result )
localNormal.z = sqrt( 1.0f - dot3( localNormal, localNormal ) );
float3 globalNormal;
#if 1
#if 0
globalNormal.x = dot3( localNormal, fragment.texcoord2 );
globalNormal.y = dot3( localNormal, fragment.texcoord3 );
globalNormal.z = dot3( localNormal, fragment.texcoord4 );

View file

@ -83,7 +83,11 @@ cbuffer c_MipMapgen : register( b0 )
MipmmapGenConstants g_MipMapGen;
};
#ifdef __spirv__ // use unbounded array size for proper SPIR-V descriptor binding
RWTexture2D<VALUE_TYPE> u_output[] : register( u0 );
#else // use bounded array for DXIL -flegacy-resource-reservation flag
RWTexture2D<VALUE_TYPE> u_output[NUM_LODS] : register( u0 );
#endif
Texture2D<VALUE_TYPE> t_input : register( t0 );
// *INDENT-ON*
@ -138,4 +142,4 @@ groupshared VALUE_TYPE s_ReductionData[GROUP_SIZE][GROUP_SIZE];
GroupMemoryBarrierWithGroupSync();
}
}
}

View file

@ -165,6 +165,9 @@ static float dot4( float2 a, float4 b )
// RB: the golden ratio is useful to animate Blue noise
#define c_goldenRatioConjugate 0.61803398875
static const float DOOM_TO_METERS = 0.0254; // doom to meters
static const float METERS_TO_DOOM = ( 1.0 / DOOM_TO_METERS ); // meters to doom
// ----------------------
// sRGB <-> Linear RGB Color Conversion
// ----------------------
@ -495,77 +498,4 @@ float3 Hash33( float3 p3 )
return frac( ( p3.xxy + p3.yxx ) * p3.zyx );
}
/*
static float3 DitherRGB( float3 color, float2 uvSeed, float quantSteps )
{
// uniform noise
//float3 noise = Hash33( float3( uvSeed, rpJitterTexOffset.w ) );
//float3 noise = float3( InterleavedGradientNoise( uvSeed ) );
float3 noise = _float3( InterleavedGradientNoiseAnim( uvSeed, rpJitterTexOffset.w ) );
// triangular noise [-0.5;1.5[
#if 1
noise.x = RemapNoiseTriErp( noise.x );
noise = noise * 2.0 - 0.5;
#endif
noise = _float3( noise.x );
// quantize/truncate color and dither the result
//float scale = exp2( float( TARGET_BITS ) ) - 1.0;
// lets assume 2^3 bits = 8
//float scale = 7.0;
//const float quantSteps = 8.0;
float scale = quantSteps - 1.0;
// apply dither
color += noise / ( quantSteps );
color = floor( color * scale ) / scale;
//float3 color = c + whiteNoise / 255.0;
return color;
}
*/
/*
static float3 DitherChromaticBlueNoise( float3 color, float2 n, SamplerState blueTex )
{
// uniform noise
//float3 noise = Hash33( float3( n, rpJitterTexOffset.w ) );
//float3 noise = float3( InterleavedGradientNoise( n ) );
//float3 noise = float3( InterleavedGradientNoiseAnim( n, rpJitterTexOffset.w ) );
// uv is screen position / sizeof blue noise image
float2 uv = n.xy * rpJitterTexOffset.xy;
float3 noise = tex2D( blueTex, uv ).rgb;
// rpJitterTexOffset.w is frameTime % 64
noise = frac( noise + c_goldenRatioConjugate * rpJitterTexOffset.w );
// triangular noise [-0.5;1.5[
noise.x = RemapNoiseTriErp( noise.x );
noise = noise * 2.0 - 0.5;
//noise = float3( noise.x );
// quantize/truncate color and dither the result
//float scale = exp2( float( TARGET_BITS ) ) - 1.0;
// lets assume 2^3 bits = 8
float quantSteps = 255.0;
//float3 color = floor( c * scale + noise ) / scale;
color = floor( 0.5 + color * quantSteps - 0.5 + noise ) * ( 1.0 / ( quantSteps - 1.0 ) );
return color;
}
*/
#define SMAA_RT_METRICS float4(1.0 / 1280.0, 1.0 / 720.0, 1280.0, 720.0)

View file

@ -30,7 +30,7 @@ If you have questions concerning this license or the applicable additional terms
#include "precompiled.h"
#pragma hdrstop
#include "../imgui/imgui.h"
#include "imgui.h"
#include "Imgui_IdWidgets.h"

View file

@ -31,7 +31,7 @@ If you have questions concerning this license or the applicable additional terms
#include "DeviceContext.h"
#include "libs/imgui/imgui.h"
#include "imgui.h"
#include "../renderer/RenderCommon.h"
extern idCVar in_useJoystick;