diff --git a/code/client/cl_imgui.cpp b/code/client/cl_imgui.cpp index ef08858..6e68cbd 100644 --- a/code/client/cl_imgui.cpp +++ b/code/client/cl_imgui.cpp @@ -471,6 +471,19 @@ static void ImGUI_ApplyTheme() colors[ImGuiCol_SeparatorHovered] = hover; colors[ImGuiCol_SeparatorActive] = hover; + const float brightness = 2.0f; + const float gamma = 1.3f; + for(int i = 0; i < ImGuiCol_COUNT; i++) + { + colors[i].x = min(powf(colors[i].x * brightness, gamma), 1.0f); + colors[i].y = min(powf(colors[i].y * brightness, gamma), 1.0f); + colors[i].z = min(powf(colors[i].z * brightness, gamma), 1.0f); + Q_assert(colors[i].x >= 0.0f && colors[i].x <= 1.0f); + Q_assert(colors[i].y >= 0.0f && colors[i].y <= 1.0f); + Q_assert(colors[i].z >= 0.0f && colors[i].z <= 1.0f); + Q_assert(colors[i].w >= 0.0f && colors[i].w <= 1.0f); + } + ImGuiStyle& style = ImGui::GetStyle(); style.WindowPadding = ImVec2(8.00f, 8.00f); style.FramePadding = ImVec2(5.00f, 2.00f); diff --git a/code/renderer/crp_main.cpp b/code/renderer/crp_main.cpp index 14edbc3..f164cbb 100644 --- a/code/renderer/crp_main.cpp +++ b/code/renderer/crp_main.cpp @@ -687,8 +687,8 @@ void CRP::EndFrame() volumetricLight.DrawGUI(); vdbManager.DrawGUI(); im3d.DrawGUI(); - imgui.Draw(renderTarget); toneMap.DrawToneMap(); + imgui.Draw(renderTarget); magnifier.Draw(); BlitRenderTarget(GetSwapChainTexture(), "Blit to Swap Chain"); BlitRenderTarget(readbackRenderTarget, "Blit to Readback Texture"); diff --git a/code/renderer/grp_blit.cpp b/code/renderer/grp_blit.cpp new file mode 100644 index 0000000..06184b7 --- /dev/null +++ b/code/renderer/grp_blit.cpp @@ -0,0 +1,147 @@ +/* +=========================================================================== +Copyright (C) 2024 Gian 'myT' Schellenbaum + +This file is part of Challenge Quake 3 (CNQ3). + +Challenge Quake 3 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 2 of the License, +or (at your option) any later version. + +Challenge Quake 3 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 Challenge Quake 3. If not, see . +=========================================================================== +*/ +// Gameplay Rendering Pipeline - blitting + + +#include "grp_local.h" +#include "compshaders/grp/blit.h" + + +#pragma pack(push, 4) + +struct BlitVertexRC +{ + float scaleX; + float scaleY; +}; + +#pragma pack(pop) + + +void Blitter::Init() +{ + if(!srp.firstInit) + { + return; + } + + { + RootSignatureDesc desc("blitter"); + desc.usingVertexBuffers = false; + desc.constants[ShaderStage::Vertex].byteCount = sizeof(BlitVertexRC); + desc.samplerCount = 1; + desc.samplerVisibility = ShaderStages::PixelBit; + desc.AddRange(DescriptorType::Texture, 0, 1); + desc.genericVisibility = ShaderStages::PixelBit; + rootSignature = CreateRootSignature(desc); + } + { + DescriptorTableDesc desc("blitter", rootSignature); + descriptorTable = CreateDescriptorTable(desc); + + DescriptorTableUpdate update; + update.SetSamplers(1, &grp.samplers[GetSamplerIndex(TW_CLAMP_TO_EDGE, TextureFilter::Linear)]); + UpdateDescriptorTable(descriptorTable, update); + } + { + GraphicsPipelineDesc desc("blitter", rootSignature); + desc.vertexShader = ShaderByteCode(g_blit_vs); + desc.pixelShader = ShaderByteCode(g_blit_ps); + desc.depthStencil.DisableDepth(); + desc.rasterizer.cullMode = CT_TWO_SIDED; + desc.AddRenderTarget(0, TextureFormat::R8G8B8A8_UNorm); + pipeline = CreateGraphicsPipeline(desc); + } +} + +void Blitter::Blit(HTexture renderTarget) +{ + SCOPED_RENDER_PASS("Blit to Swap Chain", 0.125f, 0.125f, 0.5f); + + CmdBeginBarrier(); + CmdTextureBarrier(grp.renderTarget, ResourceStates::PixelShaderAccessBit); + CmdTextureBarrier(renderTarget, ResourceStates::RenderTargetBit); + CmdEndBarrier(); + + float vsX = 1.0f; // vertex shader scale factors + float vsY = 1.0f; + float srX = 1.0f; // scissor rectangle scale factors + float srY = 1.0f; + if(r_fullscreen->integer == 1 && r_mode->integer == VIDEOMODE_UPSCALE) + { + if(r_blitMode->integer == BLITMODE_CENTERED) + { + vsX = (float)glConfig.vidWidth / (float)glInfo.winWidth; + vsY = (float)glConfig.vidHeight / (float)glInfo.winHeight; + } + else if(r_blitMode->integer == BLITMODE_ASPECT) + { + const float ars = (float)glConfig.vidWidth / (float)glConfig.vidHeight; + const float ard = (float)glInfo.winWidth / (float)glInfo.winHeight; + if(ard > ars) + { + vsX = ars / ard; + vsY = 1.0f; + srX = (float)glInfo.winHeight / (float)glConfig.vidHeight; + srY = srX; + } + else + { + vsX = 1.0f; + vsY = ard / ars; + srX = (float)glInfo.winWidth / (float)glConfig.vidWidth; + srY = srX; + } + } + } + + if(vsX != 1.0f || vsY != 1.0f) + { + CmdClearColorTarget(renderTarget, colorBlack); + + const int x = (glInfo.winWidth - glInfo.winWidth * vsX) / 2.0f; + const int y = (glInfo.winHeight - glInfo.winHeight * vsY) / 2.0f; + CmdSetViewport(0, 0, glInfo.winWidth, glInfo.winHeight); + CmdSetScissor(x, y, glConfig.vidWidth * srX, glConfig.vidHeight * srY); + } + else + { + CmdSetViewportAndScissor(0, 0, glInfo.winWidth, glInfo.winHeight); + } + + BlitVertexRC vertexRC = {}; + vertexRC.scaleX = vsX; + vertexRC.scaleY = vsY; + + CmdBindRenderTargets(1, &renderTarget, NULL); + CmdBindPipeline(pipeline); + CmdBindRootSignature(rootSignature); + CmdBindDescriptorTable(rootSignature, descriptorTable); + CmdSetRootConstants(rootSignature, ShaderStage::Vertex, &vertexRC); + CmdDraw(3, 0); +} + +void Blitter::SetInputTexture(HTexture source) +{ + DescriptorTableUpdate update; + update.SetTextures(1, &source); + UpdateDescriptorTable(descriptorTable, update); +} diff --git a/code/renderer/grp_local.h b/code/renderer/grp_local.h index 7d3e6f0..2fccd0f 100644 --- a/code/renderer/grp_local.h +++ b/code/renderer/grp_local.h @@ -256,6 +256,18 @@ private: HDescriptorTable inverseToneMapDescriptorTable; }; +struct Blitter +{ + void Init(); + void SetInputTexture(HTexture source); + void Blit(HTexture renderTarget); + +private: + HPipeline pipeline; + HRootSignature rootSignature; + HDescriptorTable descriptorTable; +}; + struct SMAA { void Init(); @@ -333,8 +345,6 @@ struct GRP : IRenderPipeline uint32_t CreatePSO(CachedPSO& cache, const char* name); - void UpdateReadbackTexture(); - UI ui; World world; MipMapGenerator mipMapGen; @@ -343,8 +353,8 @@ struct GRP : IRenderPipeline PostProcess post; SMAA smaa; Nuklear nuklear; + Blitter blitter; float frameSeed; - bool updateReadbackTexture; HTexture renderTarget; TextureFormat::Id renderTargetFormat; diff --git a/code/renderer/grp_main.cpp b/code/renderer/grp_main.cpp index 4c86cb6..67bb510 100644 --- a/code/renderer/grp_main.cpp +++ b/code/renderer/grp_main.cpp @@ -216,7 +216,7 @@ void GRP::Init() ui.Init(false, ShaderByteCode(g_ui_vs), ShaderByteCode(g_ui_ps), renderTargetFormat, descriptorTable, &rootSignatureDesc); world.Init(); mipMapGen.Init(false, ShaderByteCode(g_mip_1_cs), ShaderByteCode(g_mip_2_cs), ShaderByteCode(g_mip_3_cs)); - const HTexture fontAtlas = imgui.Init(false, ShaderByteCode(g_imgui_vs), ShaderByteCode(g_imgui_ps), renderTargetFormat, descriptorTable, &rootSignatureDesc); + const HTexture fontAtlas = imgui.Init(false, ShaderByteCode(g_imgui_vs), ShaderByteCode(g_imgui_ps), TextureFormat::R8G8B8A8_UNorm, descriptorTable, &rootSignatureDesc); const uint32_t fontAtlasSRV = RegisterTexture(fontAtlas); imgui.RegisterFontAtlas(fontAtlasSRV); im3d.Init(false, im3dShaders, renderTargetFormat); @@ -224,6 +224,8 @@ void GRP::Init() post.Init(); post.SetToneMapInput(renderTarget); smaa.Init(); // must be after post + blitter.Init(); + blitter.SetInputTexture(readbackRenderTarget); srp.firstInit = false; } @@ -266,25 +268,19 @@ void GRP::BeginFrame() void GRP::EndFrame() { + // issue ImGUI calls srp.DrawGUI(); im3d.DrawGUI(); - imgui.Draw(renderTarget); - post.Draw("Post-process", GetSwapChainTexture()); + + // now using a R8G8B8A8 UNorm render target + post.Draw("Post-process", readbackRenderTarget); + imgui.Draw(readbackRenderTarget); + blitter.Blit(GetSwapChainTexture()); + world.EndFrame(); - UpdateReadbackTexture(); srp.EndFrame(); } -void GRP::UpdateReadbackTexture() -{ - if(!updateReadbackTexture) - { - return; - } - - post.Draw("Readback post-process", readbackRenderTarget); -} - void GRP::CreateTexture(image_t* image, int mipCount, int width, int height) { TextureDesc desc(image->name, width, height, mipCount); @@ -603,10 +599,8 @@ uint32_t GRP::CreatePSO(CachedPSO& cache, const char* name) return index; } -void GRP::ExecuteRenderCommands(const byte* data, bool readbackRequested) +void GRP::ExecuteRenderCommands(const byte* data, bool /*readbackRequested*/) { - updateReadbackTexture = readbackRequested; - for(;;) { const int commandId = ((const renderCommandBase_t*)data)->commandId; diff --git a/code/renderer/grp_post.cpp b/code/renderer/grp_post.cpp index 1dc9030..33a40cd 100644 --- a/code/renderer/grp_post.cpp +++ b/code/renderer/grp_post.cpp @@ -28,12 +28,6 @@ along with Challenge Quake 3. If not, see . #pragma pack(push, 4) -struct GammaVertexRC -{ - float scaleX; - float scaleY; -}; - struct GammaPixelRC { float invGamma; @@ -69,7 +63,6 @@ void PostProcess::Init() { RootSignatureDesc desc("tone map"); desc.usingVertexBuffers = false; - desc.constants[ShaderStage::Vertex].byteCount = sizeof(GammaVertexRC); desc.constants[ShaderStage::Pixel].byteCount = sizeof(GammaPixelRC); desc.samplerCount = 1; desc.samplerVisibility = ShaderStages::PixelBit; @@ -135,76 +128,22 @@ void PostProcess::Draw(const char* renderPassName, HTexture renderTarget) CmdTextureBarrier(renderTarget, ResourceStates::RenderTargetBit); CmdEndBarrier(); - float vsX = 1.0f; // vertex shader scale factors - float vsY = 1.0f; - float srX = 1.0f; // scissor rectangle scale factors - float srY = 1.0f; - if(r_fullscreen->integer == 1 && r_mode->integer == VIDEOMODE_UPSCALE) - { - if(r_blitMode->integer == BLITMODE_CENTERED) - { - vsX = (float)glConfig.vidWidth / (float)glInfo.winWidth; - vsY = (float)glConfig.vidHeight / (float)glInfo.winHeight; - } - else if(r_blitMode->integer == BLITMODE_ASPECT) - { - const float ars = (float)glConfig.vidWidth / (float)glConfig.vidHeight; - const float ard = (float)glInfo.winWidth / (float)glInfo.winHeight; - if(ard > ars) - { - vsX = ars / ard; - vsY = 1.0f; - srX = (float)glInfo.winHeight / (float)glConfig.vidHeight; - srY = srX; - } - else - { - vsX = 1.0f; - vsY = ard / ars; - srX = (float)glInfo.winWidth / (float)glConfig.vidWidth; - srY = srX; - } - } - } - - if(vsX != 1.0f || vsY != 1.0f) - { - CmdClearColorTarget(renderTarget, colorBlack); - - const int x = (glInfo.winWidth - glInfo.winWidth * vsX) / 2.0f; - const int y = (glInfo.winHeight - glInfo.winHeight * vsY) / 2.0f; - CmdSetViewport(0, 0, glInfo.winWidth, glInfo.winHeight); - CmdSetScissor(x, y, glConfig.vidWidth * srX, glConfig.vidHeight * srY); - } - else - { - CmdSetViewportAndScissor(0, 0, glInfo.winWidth, glInfo.winHeight); - } - - GammaVertexRC vertexRC = {}; - vertexRC.scaleX = vsX; - vertexRC.scaleY = vsY; - GammaPixelRC pixelRC = {}; pixelRC.invGamma = 1.0f / r_gamma->value; pixelRC.brightness = r_brightness->value; pixelRC.greyscale = r_greyscale->value; + CmdSetViewportAndScissor(0, 0, glConfig.vidWidth, glConfig.vidHeight); CmdBindRenderTargets(1, &renderTarget, NULL); CmdBindPipeline(toneMapPipeline); CmdBindRootSignature(toneMapRootSignature); CmdBindDescriptorTable(toneMapRootSignature, toneMapDescriptorTable); - CmdSetRootConstants(toneMapRootSignature, ShaderStage::Vertex, &vertexRC); CmdSetRootConstants(toneMapRootSignature, ShaderStage::Pixel, &pixelRC); CmdDraw(3, 0); } void PostProcess::ToneMap() { - GammaVertexRC vertexRC = {}; - vertexRC.scaleX = 1.0f; - vertexRC.scaleY = 1.0f; - GammaPixelRC pixelRC = {}; pixelRC.invGamma = 1.0f / r_gamma->value; pixelRC.brightness = r_brightness->value; @@ -213,7 +152,6 @@ void PostProcess::ToneMap() CmdBindPipeline(toneMapPipeline); CmdBindRootSignature(toneMapRootSignature); CmdBindDescriptorTable(toneMapRootSignature, toneMapDescriptorTable); - CmdSetRootConstants(toneMapRootSignature, ShaderStage::Vertex, &vertexRC); CmdSetRootConstants(toneMapRootSignature, ShaderStage::Pixel, &pixelRC); CmdDraw(3, 0); } diff --git a/code/renderer/shaders/crp/imgui.hlsl b/code/renderer/shaders/crp/imgui.hlsl index f5f8f33..e2391eb 100644 --- a/code/renderer/shaders/crp/imgui.hlsl +++ b/code/renderer/shaders/crp/imgui.hlsl @@ -27,7 +27,6 @@ cbuffer RootConstants : register(b0) uint textureIndex; uint samplerIndex; float mipIndex; - float colorScale; }; struct VIn @@ -58,8 +57,7 @@ float4 ps(VOut input) : SV_Target { Texture2D texture0 = ResourceDescriptorHeap[textureIndex]; SamplerState sampler0 = SamplerDescriptorHeap[samplerIndex]; - float4 color = float4(colorScale.xxx, 1); - float4 result = input.col * color * texture0.SampleLevel(sampler0, input.uv, mipIndex); + float4 result = input.col * texture0.SampleLevel(sampler0, input.uv, mipIndex); return result; } diff --git a/code/renderer/shaders/grp/blit.hlsl b/code/renderer/shaders/grp/blit.hlsl new file mode 100644 index 0000000..89e1eb7 --- /dev/null +++ b/code/renderer/shaders/grp/blit.hlsl @@ -0,0 +1,71 @@ +/* +=========================================================================== +Copyright (C) 2024 Gian 'myT' Schellenbaum + +This file is part of Challenge Quake 3 (CNQ3). + +Challenge Quake 3 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 2 of the License, +or (at your option) any later version. + +Challenge Quake 3 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 Challenge Quake 3. If not, see . +=========================================================================== +*/ +// blit shader - unlike texture copies, it doesn't care about the specific formats used + + +#include "shared.hlsli" + + +struct VOut +{ + float4 position : SV_Position; + float2 texCoords : TEXCOORD0; +}; + + +#if VERTEX_SHADER + +cbuffer RootConstants +{ + float scaleX; + float scaleY; +}; + +VOut vs(uint id : SV_VertexID) +{ + VOut output; + output.position.x = scaleX * ((float)(id / 2) * 4.0 - 1.0); + output.position.y = scaleY * ((float)(id % 2) * 4.0 - 1.0); + output.position.z = 0.0; + output.position.w = 1.0; + output.texCoords.x = (float)(id / 2) * 2.0; + output.texCoords.y = 1.0 - (float)(id % 2) * 2.0; + + return output; +} + +#endif + + +#if PIXEL_SHADER + +Texture2D texture0 : register(t0); +SamplerState sampler0 : register(s0); + +float4 ps(VOut input) : SV_Target +{ + float3 color = texture0.Sample(sampler0, input.texCoords).rgb; + float4 result = float4(color, 1.0); + + return result; +} + +#endif diff --git a/code/renderer/shaders/grp/post_gamma.hlsl b/code/renderer/shaders/grp/post_gamma.hlsl index 4bab28f..11fc499 100644 --- a/code/renderer/shaders/grp/post_gamma.hlsl +++ b/code/renderer/shaders/grp/post_gamma.hlsl @@ -1,6 +1,6 @@ /* =========================================================================== -Copyright (C) 2023 Gian 'myT' Schellenbaum +Copyright (C) 2023-2024 Gian 'myT' Schellenbaum This file is part of Challenge Quake 3 (CNQ3). @@ -34,17 +34,11 @@ struct VOut #if VERTEX_SHADER -cbuffer RootConstants -{ - float scaleX; - float scaleY; -}; - VOut vs(uint id : SV_VertexID) { VOut output; - output.position.x = scaleX * ((float)(id / 2) * 4.0 - 1.0); - output.position.y = scaleY * ((float)(id % 2) * 4.0 - 1.0); + output.position.x = (float)(id / 2) * 4.0 - 1.0; + output.position.y = (float)(id % 2) * 4.0 - 1.0; output.position.z = 0.0; output.position.w = 1.0; output.texCoords.x = (float)(id / 2) * 2.0; diff --git a/code/renderer/srp_imgui.cpp b/code/renderer/srp_imgui.cpp index 06028bd..6f38379 100644 --- a/code/renderer/srp_imgui.cpp +++ b/code/renderer/srp_imgui.cpp @@ -41,7 +41,6 @@ struct ImGUIPixelRC uint32_t texture; uint32_t sampler; float mip; - float colorScale; }; #pragma pack(pop) @@ -59,7 +58,7 @@ HTexture ImGUI::Init(bool ddhi_, const ShaderByteCode& vs, const ShaderByteCode& if(srp.firstInit) { io.BackendRendererUserData = this; - io.BackendRendererName = "CNQ3 Direct3D 12"; + io.BackendRendererName = "CNQ3"; io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes. for(int i = 0; i < FrameCount; i++) @@ -213,6 +212,10 @@ void ImGUI::Draw(HTexture renderTarget) const uint32_t vertexStride = sizeof(ImDrawVert); static_assert(sizeof(ImDrawIdx) == 4, "uint32 indices expected!"); + CmdBeginBarrier(); + CmdTextureBarrier(renderTarget, ResourceStates::RenderTargetBit); + CmdEndBarrier(); + CmdBindRenderTargets(1, &renderTarget, NULL); if(!ddhi) { @@ -259,7 +262,6 @@ void ImGUI::Draw(HTexture renderTarget) pixelRC.texture = (uint32_t)cmd->TextureId & 0xFFFF; pixelRC.sampler = GetSamplerIndex(TW_CLAMP_TO_EDGE, TextureFilter::Linear); pixelRC.mip = (float)(((uint32_t)cmd->TextureId >> 16) & 0xFFFF); - pixelRC.colorScale = tr.identityLight; if(ddhi) { CmdSetGraphicsRootConstants(sizeof(vertexRC), sizeof(pixelRC), &pixelRC); diff --git a/code/renderer/tr_gui.cpp b/code/renderer/tr_gui.cpp index bd970ce..079b57e 100644 --- a/code/renderer/tr_gui.cpp +++ b/code/renderer/tr_gui.cpp @@ -231,11 +231,6 @@ static ImVec4 GetColorFromCPMACode(char colorCode) return color; } -static float InverseToneMap(float x) -{ - return powf(x / r_brightness->value, r_gamma->value); -} - static bool CPMAColorCodeButton(const char* title, const char* id, char& currentColor) { const char* const popupId = va("##color_popup_%s", id); @@ -278,10 +273,7 @@ static bool CPMAColorCodeButton(const char* title, const char* id, char& current const char colorCode = row[x]; const ImGuiColorEditFlags buttonFlags = ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_NoAlpha; - ImVec4 color = GetColorFromCPMACode(colorCode); - color.x = InverseToneMap(color.x); - color.y = InverseToneMap(color.y); - color.z = InverseToneMap(color.z); + const ImVec4 color = GetColorFromCPMACode(colorCode); if(ImGui::ColorButton(va("%c", colorCode), color, buttonFlags)) { currentColor = colorCode; diff --git a/code/shadercomp/shadercomp.cpp b/code/shadercomp/shadercomp.cpp index 15d3911..b3b31bb 100644 --- a/code/shadercomp/shadercomp.cpp +++ b/code/shadercomp/shadercomp.cpp @@ -384,6 +384,7 @@ void ProcessGRP() CompileGraphics("ui.h", "ui.hlsl", "ui"); CompileGraphics("depth_pre_pass.h", "depth_pre_pass.hlsl", "zpp"); CompileGraphics("dynamic_light.h", "dynamic_light.hlsl", "dl"); + CompileGraphics("blit.h", "blit.hlsl", "blit"); CompileVertexShader("fog.h", "fog_inside.hlsl", "fog"); CompilePixelShader("fog_inside.h", "fog_inside.hlsl", "fog_inside"); CompilePixelShader("fog_outside.h", "fog_outside.hlsl", "fog_outside"); diff --git a/makefiles/windows_vs2019/renderer.vcxproj b/makefiles/windows_vs2019/renderer.vcxproj index 78b9ebb..5478a74 100644 --- a/makefiles/windows_vs2019/renderer.vcxproj +++ b/makefiles/windows_vs2019/renderer.vcxproj @@ -147,6 +147,7 @@ + @@ -394,6 +395,9 @@ true + + true + true diff --git a/makefiles/windows_vs2019/renderer.vcxproj.filters b/makefiles/windows_vs2019/renderer.vcxproj.filters index 7b58b38..064a429 100644 --- a/makefiles/windows_vs2019/renderer.vcxproj.filters +++ b/makefiles/windows_vs2019/renderer.vcxproj.filters @@ -53,6 +53,7 @@ + @@ -300,6 +301,9 @@ shaders\crp + + shaders\grp + shaders\grp diff --git a/makefiles/windows_vs2022/renderer.vcxproj b/makefiles/windows_vs2022/renderer.vcxproj index 46598e1..01c0d63 100644 --- a/makefiles/windows_vs2022/renderer.vcxproj +++ b/makefiles/windows_vs2022/renderer.vcxproj @@ -149,6 +149,7 @@ + @@ -396,6 +397,9 @@ true + + true + true diff --git a/makefiles/windows_vs2022/renderer.vcxproj.filters b/makefiles/windows_vs2022/renderer.vcxproj.filters index 7b58b38..064a429 100644 --- a/makefiles/windows_vs2022/renderer.vcxproj.filters +++ b/makefiles/windows_vs2022/renderer.vcxproj.filters @@ -53,6 +53,7 @@ + @@ -300,6 +301,9 @@ shaders\crp + + shaders\grp + shaders\grp