From 71e2ea9aa374b4cd7e47dfe891de450258abcad9 Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Sun, 14 Mar 2021 13:22:17 +0100 Subject: [PATCH] Added extra rendertarget for environment probes --- neo/renderer/Framebuffer.h | 1 + neo/renderer/Image.h | 2 ++ neo/renderer/Image_intrinsic.cpp | 13 +++++++++++++ neo/renderer/OpenGL/Framebuffer_GL.cpp | 13 +++++++++++++ neo/renderer/RenderWorld.h | 9 +++++++++ neo/renderer/RenderWorld_envprobes.cpp | 20 +++++--------------- 6 files changed, 43 insertions(+), 15 deletions(-) diff --git a/neo/renderer/Framebuffer.h b/neo/renderer/Framebuffer.h index 2fdf59fd..8deeb3bf 100644 --- a/neo/renderer/Framebuffer.h +++ b/neo/renderer/Framebuffer.h @@ -132,6 +132,7 @@ struct globalFramebuffers_t #endif // Framebuffer* hdrQuarterFBO; Framebuffer* hdr64FBO; + Framebuffer* envprobeFBO; Framebuffer* bloomRenderFBO[MAX_BLOOM_BUFFERS]; Framebuffer* ambientOcclusionFBO[MAX_SSAO_BUFFERS]; Framebuffer* csDepthFBO[MAX_HIERARCHICAL_ZBUFFERS]; diff --git a/neo/renderer/Image.h b/neo/renderer/Image.h index 3d860d7b..72c5aa28 100644 --- a/neo/renderer/Image.h +++ b/neo/renderer/Image.h @@ -573,6 +573,8 @@ public: idImage* currentRenderHDRImageQuarter; idImage* currentRenderHDRImage64; idImage* bloomRenderImage[2]; + idImage* envprobeHDRImage; + idImage* envprobeDepthImage; idImage* heatmap5Image; idImage* heatmap7Image; idImage* smaaInputImage; diff --git a/neo/renderer/Image_intrinsic.cpp b/neo/renderer/Image_intrinsic.cpp index ab0eac3c..ae16b0fd 100644 --- a/neo/renderer/Image_intrinsic.cpp +++ b/neo/renderer/Image_intrinsic.cpp @@ -262,6 +262,16 @@ static void R_HDR_RGBA16FImage_Res64( idImage* image ) image->GenerateImage( NULL, 64, 64, TF_NEAREST, TR_CLAMP, TD_RGBA16F ); } +static void R_EnvprobeImage_HDR( idImage* image ) +{ + image->GenerateImage( NULL, RADIANCE_CUBEMAP_SIZE, RADIANCE_CUBEMAP_SIZE, TF_NEAREST, TR_CLAMP, TD_RGBA16F ); +} + +static void R_EnvprobeImage_Depth( idImage* image ) +{ + image->GenerateImage( NULL, RADIANCE_CUBEMAP_SIZE, RADIANCE_CUBEMAP_SIZE, TF_NEAREST, TR_CLAMP, TD_DEPTH ); +} + static void R_SMAAImage_ResNative( idImage* image ) { image->GenerateImage( NULL, renderSystem->GetWidth(), renderSystem->GetHeight(), TF_LINEAR, TR_CLAMP, TD_LOOKUP_TABLE_RGBA ); @@ -997,6 +1007,9 @@ void idImageManager::CreateIntrinsicImages() currentRenderHDRImageQuarter = globalImages->ImageFromFunction( "_currentRenderHDRQuarter", R_HDR_RGBA16FImage_ResQuarter ); currentRenderHDRImage64 = globalImages->ImageFromFunction( "_currentRenderHDR64", R_HDR_RGBA16FImage_Res64 ); + envprobeHDRImage = globalImages->ImageFromFunction( "_envprobeHDR", R_EnvprobeImage_HDR ); + envprobeDepthImage = ImageFromFunction( "_envprobeDepth", R_EnvprobeImage_Depth ); + bloomRenderImage[0] = globalImages->ImageFromFunction( "_bloomRender0", R_HDR_RGBA16FImage_ResQuarter_Linear ); bloomRenderImage[1] = globalImages->ImageFromFunction( "_bloomRender1", R_HDR_RGBA16FImage_ResQuarter_Linear ); diff --git a/neo/renderer/OpenGL/Framebuffer_GL.cpp b/neo/renderer/OpenGL/Framebuffer_GL.cpp index db7a584b..d580554b 100644 --- a/neo/renderer/OpenGL/Framebuffer_GL.cpp +++ b/neo/renderer/OpenGL/Framebuffer_GL.cpp @@ -133,6 +133,19 @@ void Framebuffer::Init() globalFramebuffers.hdrNonMSAAFBO->Check(); #endif + // HDR CUBEMAP CAPTURE + + globalFramebuffers.envprobeFBO = new Framebuffer( "_envprobeRender", RADIANCE_CUBEMAP_SIZE, RADIANCE_CUBEMAP_SIZE ); + globalFramebuffers.envprobeFBO->Bind(); + + globalFramebuffers.envprobeFBO->AddColorBuffer( GL_RGBA16F, 0 ); + globalFramebuffers.envprobeFBO->AddDepthBuffer( GL_DEPTH24_STENCIL8 ); + + globalFramebuffers.envprobeFBO->AttachImage2D( GL_TEXTURE_2D, globalImages->envprobeHDRImage, 0 ); + globalFramebuffers.envprobeFBO->AttachImageDepth( GL_TEXTURE_2D, globalImages->envprobeDepthImage ); + + globalFramebuffers.envprobeFBO->Check(); + // HDR DOWNSCALE globalFramebuffers.hdr64FBO = new Framebuffer( "_hdr64", 64, 64 ); diff --git a/neo/renderer/RenderWorld.h b/neo/renderer/RenderWorld.h index 072e817a..0ac0f18e 100644 --- a/neo/renderer/RenderWorld.h +++ b/neo/renderer/RenderWorld.h @@ -235,6 +235,13 @@ typedef struct } renderEnvironmentProbe_t; // RB end + +// RB: added back refdef flags from Quake 3 +const int RDF_NOSHADOWS = BIT( 0 ); // force renderer to use faster lighting only path +const int RDF_NOAMBIENT = BIT( 1 ); // don't render indirect lighting +const int RDF_IRRADIANCE = BIT( 2 ); // render into 256^2 HDR render target for irradiance/radiance GGX calculation +const int RDF_UNDERWATER = BIT( 3 ); // TODO enable automatic underwater caustics and fog + typedef struct renderView_s { // player views will set this to a non-zero integer for model suppress / allow @@ -258,6 +265,8 @@ typedef struct renderView_s // the viewEyeBuffer may be of a different polarity than stereoScreenSeparation if the eyes have been swapped int viewEyeBuffer; // -1 = left eye, 1 = right eye, 0 = monoscopic view or GUI float stereoScreenSeparation; // projection matrix horizontal offset, positive or negative based on camera eye + + int rdflags; // RB: RDF_NOSHADOWS, etc } renderView_t; diff --git a/neo/renderer/RenderWorld_envprobes.cpp b/neo/renderer/RenderWorld_envprobes.cpp index b7845390..ed03c0f6 100644 --- a/neo/renderer/RenderWorld_envprobes.cpp +++ b/neo/renderer/RenderWorld_envprobes.cpp @@ -879,17 +879,13 @@ CONSOLE_COMMAND( generateEnvironmentProbes, "Generate environment probes", NULL idMat3 axis[6], oldAxis; idVec3 oldPosition; renderView_t ref; - viewDef_t primary; int blends; const char* extension; int size; - int res_w, res_h, old_fov_x, old_fov_y; + int old_fov_x, old_fov_y; static const char* envDirection[6] = { "_px", "_nx", "_py", "_ny", "_pz", "_nz" }; - res_w = renderSystem->GetWidth(); - res_h = renderSystem->GetHeight(); - baseName = tr.primaryWorld->mapName; baseName.StripFileExtension(); @@ -902,7 +898,7 @@ CONSOLE_COMMAND( generateEnvironmentProbes, "Generate environment probes", NULL return; } - primary = *tr.primaryView; + const viewDef_t primary = *tr.primaryView; memset( &axis, 0, sizeof( axis ) ); @@ -940,14 +936,6 @@ CONSOLE_COMMAND( generateEnvironmentProbes, "Generate environment probes", NULL // CAPTURE SCENE LIGHTING TO CUBEMAPS //-------------------------------------------- - // let's get the game window to a "size" resolution - if( ( res_w != size ) || ( res_h != size ) ) - { - cvarSystem->SetCVarInteger( "r_windowWidth", size ); - cvarSystem->SetCVarInteger( "r_windowHeight", size ); - R_SetNewMode( false ); // the same as "vid_restart" - } // FIXME that's a hack!! - // so we return to that axis and fov after the fact. oldPosition = primary.renderView.vieworg; oldAxis = primary.renderView.viewaxis; @@ -980,7 +968,8 @@ CONSOLE_COMMAND( generateEnvironmentProbes, "Generate environment probes", NULL } } - // restore the original resolution, axis and fov + // restore the original axis and fov + /* ref.vieworg = oldPosition; ref.viewaxis = oldAxis; ref.fov_x = old_fov_x; @@ -988,6 +977,7 @@ CONSOLE_COMMAND( generateEnvironmentProbes, "Generate environment probes", NULL cvarSystem->SetCVarInteger( "r_windowWidth", res_w ); cvarSystem->SetCVarInteger( "r_windowHeight", res_h ); R_SetNewMode( false ); // the same as "vid_restart" + */ common->Printf( "Wrote a env set with the name %s\n", baseName.c_str() );