From 25fd056fe0ba7e78d14697a275e0a182d34accd7 Mon Sep 17 00:00:00 2001 From: praydog Date: Sun, 26 Jan 2025 12:18:31 -0800 Subject: [PATCH] D3D12: Add "UI Invert Alpha" option remove unused shader --- CMakeLists.txt | 6 + cmake.toml | 6 + src/mods/vr/D3D12Component.cpp | 62 ++++++- src/mods/vr/D3D12Component.hpp | 10 +- src/mods/vr/OverlayComponent.cpp | 2 + src/mods/vr/OverlayComponent.hpp | 6 + ..._luminance_sprite_ps_SpritePixelShader.inc | 131 ++++++++++++++ ...luminance_sprite_ps_SpriteVertexShader.inc | 170 ++++++++++++++++++ .../vr/shaders/alpha_luminance_sprite_ps.fx | 70 ++++++++ src/mods/vr/shaders/compile_shaders.bat | 54 ++++++ 10 files changed, 511 insertions(+), 6 deletions(-) create mode 100644 src/mods/vr/shaders/Compiled/alpha_luminance_sprite_ps_SpritePixelShader.inc create mode 100644 src/mods/vr/shaders/Compiled/alpha_luminance_sprite_ps_SpriteVertexShader.inc create mode 100644 src/mods/vr/shaders/alpha_luminance_sprite_ps.fx create mode 100644 src/mods/vr/shaders/compile_shaders.bat diff --git a/CMakeLists.txt b/CMakeLists.txt index 19197f31..e24066ec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -874,6 +874,12 @@ set_target_properties(uevr PROPERTIES "${CMAKE_BINARY_DIR}/lib/${CMKR_TARGET}" ) +add_custom_command( +TARGET uevr PRE_BUILD + COMMAND ${CMAKE_COMMAND} -E echo "Compiling shaders for UEVR..." + COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_SOURCE_DIR}/src/mods/vr/shaders ${CMAKE_SOURCE_DIR}/src/mods/vr/shaders/compile_shaders.bat +) + add_custom_command( TARGET uevr PRE_BUILD COMMAND ${CMAKE_COMMAND} -E echo "Generating commit hash..." diff --git a/cmake.toml b/cmake.toml index 7a82631c..12563fac 100644 --- a/cmake.toml +++ b/cmake.toml @@ -273,6 +273,12 @@ link-libraries = [ "uesdk" ] cmake-after=""" +add_custom_command( +TARGET uevr PRE_BUILD + COMMAND ${CMAKE_COMMAND} -E echo "Compiling shaders for UEVR..." + COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_SOURCE_DIR}/src/mods/vr/shaders ${CMAKE_SOURCE_DIR}/src/mods/vr/shaders/compile_shaders.bat +) + add_custom_command( TARGET uevr PRE_BUILD COMMAND ${CMAKE_COMMAND} -E echo "Generating commit hash..." diff --git a/src/mods/vr/D3D12Component.cpp b/src/mods/vr/D3D12Component.cpp index 6644a822..545b2e85 100644 --- a/src/mods/vr/D3D12Component.cpp +++ b/src/mods/vr/D3D12Component.cpp @@ -1,3 +1,5 @@ +#include + #include #include #include @@ -9,6 +11,9 @@ #include <../../directxtk12-src/Inc/ResourceUploadBatch.h> #include <../../directxtk12-src/Inc/RenderTargetState.h> +#include "shaders/Compiled/alpha_luminance_sprite_ps_SpritePixelShader.inc" +#include "shaders/Compiled/alpha_luminance_sprite_ps_SpriteVertexShader.inc" + #include "d3d12/DirectXTK.hpp" #include "D3D12Component.hpp" @@ -66,6 +71,8 @@ vr::EVRCompositorError D3D12Component::on_frame(VR* vr) { return vr::VRCompositorError_None; } + const auto ui_should_invert_alpha = vr->get_overlay_component().should_invert_ui_alpha(); + // Update the UI overlay. auto runtime = vr->get_runtime(); @@ -215,6 +222,10 @@ vr::EVRCompositorError D3D12Component::on_frame(VR* vr) { const auto is_2d_screen = vr->is_using_2d_screen(); auto draw_2d_view = [&](d3d12::CommandContext& commands) { + if (ui_should_invert_alpha && m_game_ui_tex.texture.Get() != nullptr && m_game_ui_tex.srv_heap != nullptr) { + d3d12::render_srv_to_rtv(m_ui_batch_alpha_invert.get(), commands.cmd_list.Get(), m_game_ui_tex, m_game_ui_tex, std::nullopt, ENGINE_SRC_COLOR, ENGINE_SRC_COLOR); + } + draw_spectator_view(commands.cmd_list.Get(), is_right_eye_frame); if (is_2d_screen && m_game_tex.texture.Get() != nullptr && m_game_tex.srv_heap != nullptr) { @@ -276,7 +287,8 @@ vr::EVRCompositorError D3D12Component::on_frame(VR* vr) { // Draws the spectator view auto clear_rt = [&](d3d12::CommandContext& commands) { - commands.clear_rtv(m_game_ui_tex, (float*)&clear_color, ENGINE_SRC_COLOR); + const float ui_clear_color[] = { 0.0f, 0.0f, 0.0f, ui_should_invert_alpha ? 1.0f : 0.0f }; + commands.clear_rtv(m_game_ui_tex, (float*)&ui_clear_color, ENGINE_SRC_COLOR); }; if (runtime->is_openvr() && m_openvr.ui_tex.texture.Get() != nullptr) { @@ -629,7 +641,12 @@ vr::EVRCompositorError D3D12Component::on_frame(VR* vr) { return e; } -std::unique_ptr D3D12Component::setup_sprite_batch_pso(DXGI_FORMAT output_format) { +std::unique_ptr D3D12Component::setup_sprite_batch_pso( + DXGI_FORMAT output_format, + std::span ps, + std::span vs, + std::optional pd) +{ spdlog::info("[D3D12] Setting up sprite batch PSO"); auto& hook = g_framework->get_d3d12_hook(); @@ -641,10 +658,19 @@ std::unique_ptr D3D12Component::setup_sprite_batch_p DirectX::ResourceUploadBatch upload{ device }; upload.Begin(); - DirectX::RenderTargetState output_state{output_format, DXGI_FORMAT_UNKNOWN}; - DirectX::SpriteBatchPipelineStateDescription pd{output_state}; + if (!pd) { + pd = DirectX::SpriteBatchPipelineStateDescription{DirectX::RenderTargetState{output_format, DXGI_FORMAT_UNKNOWN}}; + } - auto batch = std::make_unique(device, upload, pd); + if (ps.size() > 0) { + pd->customPixelShader = D3D12_SHADER_BYTECODE{ps.data(), ps.size()}; + } + + if (vs.size() > 0) { + pd->customVertexShader = D3D12_SHADER_BYTECODE{vs.data(), vs.size()}; + } + + auto batch = std::make_unique(device, upload, *pd); auto result = upload.End(command_queue); result.wait(); @@ -928,6 +954,7 @@ void D3D12Component::on_reset(VR* vr) { m_game_tex.reset(); m_backbuffer_batch.reset(); m_game_batch.reset(); + m_ui_batch_alpha_invert.reset(); m_graphics_memory.reset(); if (runtime->is_openxr() && runtime->loaded) { @@ -1144,6 +1171,31 @@ bool D3D12Component::setup() { m_backbuffer_batch = setup_sprite_batch_pso(real_backbuffer_desc.Format); m_game_batch = setup_sprite_batch_pso(backbuffer_desc.Format); + // Custom blend state to flip the alpha in-place of the UI texture without an intermediate render target + { + DirectX::SpriteBatchPipelineStateDescription invert_alpha_in_place_pd{DirectX::RenderTargetState{backbuffer_desc.Format, DXGI_FORMAT_UNKNOWN}}; + + auto& bd = invert_alpha_in_place_pd.blendDesc; + auto& bdrt = bd.RenderTarget[0]; + bdrt.BlendEnable = TRUE; + + bdrt.SrcBlend = D3D12_BLEND_ONE; + bdrt.DestBlend = D3D12_BLEND_ZERO; + bdrt.BlendOp = D3D12_BLEND_OP_ADD; + + bdrt.SrcBlendAlpha = D3D12_BLEND_ONE; + bdrt.DestBlendAlpha = D3D12_BLEND_ZERO; + bdrt.BlendOpAlpha = D3D12_BLEND_OP_ADD; + bdrt.RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL; + + m_ui_batch_alpha_invert = setup_sprite_batch_pso( + backbuffer_desc.Format, + alpha_luminance_sprite_ps_SpritePixelShader, + alpha_luminance_sprite_ps_SpriteVertexShader, + invert_alpha_in_place_pd + ); + } + spdlog::info("[VR] d3d12 textures have been setup"); m_force_reset = false; diff --git a/src/mods/vr/D3D12Component.hpp b/src/mods/vr/D3D12Component.hpp index 2d99c42a..296c379b 100644 --- a/src/mods/vr/D3D12Component.hpp +++ b/src/mods/vr/D3D12Component.hpp @@ -1,5 +1,7 @@ #pragma once +#include + #include #include #include @@ -44,7 +46,12 @@ class D3D12Component { private: bool setup(); - std::unique_ptr setup_sprite_batch_pso(DXGI_FORMAT output_format); + std::unique_ptr setup_sprite_batch_pso( + DXGI_FORMAT output_format, + std::span vs = {}, std::span ps = {}, + std::optional pd = std::nullopt + ); + void draw_spectator_view(ID3D12GraphicsCommandList* command_list, bool is_right_eye_frame); void clear_backbuffer(); @@ -64,6 +71,7 @@ class D3D12Component { std::unique_ptr m_graphics_memory{}; std::unique_ptr m_backbuffer_batch{}; std::unique_ptr m_game_batch{}; + std::unique_ptr m_ui_batch_alpha_invert{}; ID3D12Resource* m_last_checked_native{nullptr}; diff --git a/src/mods/vr/OverlayComponent.cpp b/src/mods/vr/OverlayComponent.cpp index e4e9da80..74b1574a 100644 --- a/src/mods/vr/OverlayComponent.cpp +++ b/src/mods/vr/OverlayComponent.cpp @@ -223,6 +223,8 @@ void OverlayComponent::on_draw_ui() { m_slate_distance->draw("UI Distance"); m_slate_size->draw("UI Size"); m_ui_follows_view->draw("UI Follows View"); + ImGui::SameLine(); + m_ui_invert_alpha->draw("UI Invert Alpha"); m_framework_distance->draw("Framework Distance"); m_framework_size->draw("Framework Size"); diff --git a/src/mods/vr/OverlayComponent.hpp b/src/mods/vr/OverlayComponent.hpp index 47ff2406..1fceacff 100644 --- a/src/mods/vr/OverlayComponent.hpp +++ b/src/mods/vr/OverlayComponent.hpp @@ -42,6 +42,10 @@ class OverlayComponent : public ModComponent { return m_intersect_state; } + bool should_invert_ui_alpha() const { + return m_ui_invert_alpha->value(); + } + private: // Cached data for imgui VR overlay so we know when we need to update it // instead of doing it constantly every frame @@ -102,6 +106,7 @@ class OverlayComponent : public ModComponent { const ModSlider::Ptr m_slate_size{ ModSlider::create("UI_Size", 0.5f, 10.0f, 2.0f) }; const ModSlider::Ptr m_slate_cylinder_angle{ ModSlider::create("UI_Cylinder_Angle", 0.0f, 360.0f, 90.0f) }; const ModToggle::Ptr m_ui_follows_view{ ModToggle::create("UI_FollowView", false) }; + const ModToggle::Ptr m_ui_invert_alpha{ ModToggle::create("UI_InvertAlpha", false) }; const ModSlider::Ptr m_framework_distance{ ModSlider::create("UI_Framework_Distance", 0.5f, 10.0f, 1.75f) }; const ModSlider::Ptr m_framework_size{ ModSlider::create("UI_Framework_Size", 0.5f, 10.0f, 2.0f) }; @@ -121,6 +126,7 @@ class OverlayComponent : public ModComponent { *m_slate_size, *m_slate_cylinder_angle, *m_ui_follows_view, + *m_ui_invert_alpha, *m_framework_distance, *m_framework_size, *m_framework_ui_follows_view, diff --git a/src/mods/vr/shaders/Compiled/alpha_luminance_sprite_ps_SpritePixelShader.inc b/src/mods/vr/shaders/Compiled/alpha_luminance_sprite_ps_SpritePixelShader.inc new file mode 100644 index 00000000..d2a322f5 --- /dev/null +++ b/src/mods/vr/shaders/Compiled/alpha_luminance_sprite_ps_SpritePixelShader.inc @@ -0,0 +1,131 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// COLOR 0 xyzw 0 NONE float xyzw +// TEXCOORD 0 xy 1 NONE float xy +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Target 0 xyzw 0 TARGET float xyzw +// +ps_5_0 +dcl_globalFlags refactoringAllowed +dcl_sampler s0, mode_default +dcl_resource_texture2d (float,float,float,float) t0 +dcl_input_ps linear v0.xyzw +dcl_input_ps linear v1.xy +dcl_output o0.xyzw +dcl_temps 1 +sample_indexable(texture2d)(float,float,float,float) r0.xyzw, v1.xyxx, t0.xyzw, s0 +mad r0.xyzw, r0.xyzw, l(1.000000, 1.000000, 1.000000, -1.000000), l(0.000000, 0.000000, 0.000000, 1.000000) +mul o0.xyzw, r0.xyzw, v0.xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE alpha_luminance_sprite_ps_SpritePixelShader[] = +{ + 68, 88, 66, 67, 132, 97, + 102, 125, 147, 134, 128, 67, + 189, 46, 21, 225, 135, 134, + 209, 134, 1, 0, 0, 0, + 48, 2, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 128, 0, 0, 0, 180, 0, + 0, 0, 152, 1, 0, 0, + 73, 83, 71, 78, 72, 0, + 0, 0, 2, 0, 0, 0, + 8, 0, 0, 0, 56, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 15, 0, 0, 62, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 3, 3, 0, 0, 67, 79, + 76, 79, 82, 0, 84, 69, + 88, 67, 79, 79, 82, 68, + 0, 171, 79, 83, 71, 78, + 44, 0, 0, 0, 1, 0, + 0, 0, 8, 0, 0, 0, + 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 83, 86, 95, 84, 97, 114, + 103, 101, 116, 0, 171, 171, + 83, 72, 69, 88, 220, 0, + 0, 0, 80, 0, 0, 0, + 55, 0, 0, 0, 106, 8, + 0, 1, 90, 0, 0, 3, + 0, 96, 16, 0, 0, 0, + 0, 0, 88, 24, 0, 4, + 0, 112, 16, 0, 0, 0, + 0, 0, 85, 85, 0, 0, + 98, 16, 0, 3, 242, 16, + 16, 0, 0, 0, 0, 0, + 98, 16, 0, 3, 50, 16, + 16, 0, 1, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 0, 0, 0, 0, + 104, 0, 0, 2, 1, 0, + 0, 0, 69, 0, 0, 139, + 194, 0, 0, 128, 67, 85, + 21, 0, 242, 0, 16, 0, + 0, 0, 0, 0, 70, 16, + 16, 0, 1, 0, 0, 0, + 70, 126, 16, 0, 0, 0, + 0, 0, 0, 96, 16, 0, + 0, 0, 0, 0, 50, 0, + 0, 15, 242, 0, 16, 0, + 0, 0, 0, 0, 70, 14, + 16, 0, 0, 0, 0, 0, + 2, 64, 0, 0, 0, 0, + 128, 63, 0, 0, 128, 63, + 0, 0, 128, 63, 0, 0, + 128, 191, 2, 64, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 128, 63, 56, 0, + 0, 7, 242, 32, 16, 0, + 0, 0, 0, 0, 70, 14, + 16, 0, 0, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 62, 0, 0, 1, + 82, 84, 83, 48, 144, 0, + 0, 0, 2, 0, 0, 0, + 2, 0, 0, 0, 24, 0, + 0, 0, 1, 0, 0, 0, + 92, 0, 0, 0, 29, 0, + 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 48, 0, + 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 80, 0, + 0, 0, 1, 0, 0, 0, + 56, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 21, 0, + 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 4, 0, + 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 255, 255, + 127, 127, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, + 0, 0 +}; diff --git a/src/mods/vr/shaders/Compiled/alpha_luminance_sprite_ps_SpriteVertexShader.inc b/src/mods/vr/shaders/Compiled/alpha_luminance_sprite_ps_SpriteVertexShader.inc new file mode 100644 index 00000000..8667cc63 --- /dev/null +++ b/src/mods/vr/shaders/Compiled/alpha_luminance_sprite_ps_SpriteVertexShader.inc @@ -0,0 +1,170 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// COLOR 0 xyzw 0 NONE float xyzw +// TEXCOORD 0 xy 1 NONE float xy +// SV_Position 0 xyzw 2 NONE float xyzw +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// COLOR 0 xyzw 0 NONE float xyzw +// TEXCOORD 0 xy 1 NONE float xy +// SV_Position 0 xyzw 2 POS float xyzw +// +vs_5_0 +dcl_globalFlags refactoringAllowed +dcl_constantbuffer CB0[4], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xy +dcl_input v2.xyzw +dcl_output o0.xyzw +dcl_output o1.xy +dcl_output_siv o2.xyzw, position +dcl_temps 1 +mov o0.xyzw, v0.xyzw +mov o1.xy, v1.xyxx +mul r0.xyzw, v2.yyyy, cb0[1].xyzw +mad r0.xyzw, v2.xxxx, cb0[0].xyzw, r0.xyzw +mad r0.xyzw, v2.zzzz, cb0[2].xyzw, r0.xyzw +mad o2.xyzw, v2.wwww, cb0[3].xyzw, r0.xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE alpha_luminance_sprite_ps_SpriteVertexShader[] = +{ + 68, 88, 66, 67, 34, 119, + 255, 76, 224, 100, 79, 103, + 180, 150, 45, 196, 200, 46, + 219, 113, 1, 0, 0, 0, + 236, 2, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 164, 0, 0, 0, 24, 1, + 0, 0, 84, 2, 0, 0, + 73, 83, 71, 78, 108, 0, + 0, 0, 3, 0, 0, 0, + 8, 0, 0, 0, 80, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 15, 0, 0, 86, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 3, 3, 0, 0, 95, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 15, 15, 0, 0, 67, 79, + 76, 79, 82, 0, 84, 69, + 88, 67, 79, 79, 82, 68, + 0, 83, 86, 95, 80, 111, + 115, 105, 116, 105, 111, 110, + 0, 171, 79, 83, 71, 78, + 108, 0, 0, 0, 3, 0, + 0, 0, 8, 0, 0, 0, + 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 86, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 3, 12, 0, 0, + 95, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 3, 0, 0, 0, 2, 0, + 0, 0, 15, 0, 0, 0, + 67, 79, 76, 79, 82, 0, + 84, 69, 88, 67, 79, 79, + 82, 68, 0, 83, 86, 95, + 80, 111, 115, 105, 116, 105, + 111, 110, 0, 171, 83, 72, + 69, 88, 52, 1, 0, 0, + 80, 0, 1, 0, 77, 0, + 0, 0, 106, 8, 0, 1, + 89, 0, 0, 4, 70, 142, + 32, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 95, 0, + 0, 3, 242, 16, 16, 0, + 0, 0, 0, 0, 95, 0, + 0, 3, 50, 16, 16, 0, + 1, 0, 0, 0, 95, 0, + 0, 3, 242, 16, 16, 0, + 2, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 0, 0, 0, 0, 101, 0, + 0, 3, 50, 32, 16, 0, + 1, 0, 0, 0, 103, 0, + 0, 4, 242, 32, 16, 0, + 2, 0, 0, 0, 1, 0, + 0, 0, 104, 0, 0, 2, + 1, 0, 0, 0, 54, 0, + 0, 5, 242, 32, 16, 0, + 0, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 54, 0, 0, 5, 50, 32, + 16, 0, 1, 0, 0, 0, + 70, 16, 16, 0, 1, 0, + 0, 0, 56, 0, 0, 8, + 242, 0, 16, 0, 0, 0, + 0, 0, 86, 21, 16, 0, + 2, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 50, 0, + 0, 10, 242, 0, 16, 0, + 0, 0, 0, 0, 6, 16, + 16, 0, 2, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 70, 14, 16, 0, 0, 0, + 0, 0, 50, 0, 0, 10, + 242, 0, 16, 0, 0, 0, + 0, 0, 166, 26, 16, 0, + 2, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 70, 14, + 16, 0, 0, 0, 0, 0, + 50, 0, 0, 10, 242, 32, + 16, 0, 2, 0, 0, 0, + 246, 31, 16, 0, 2, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 70, 14, 16, 0, + 0, 0, 0, 0, 62, 0, + 0, 1, 82, 84, 83, 48, + 144, 0, 0, 0, 2, 0, + 0, 0, 2, 0, 0, 0, + 24, 0, 0, 0, 1, 0, + 0, 0, 92, 0, 0, 0, + 29, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, + 48, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, 0, + 80, 0, 0, 0, 1, 0, + 0, 0, 56, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 21, 0, 0, 0, 3, 0, + 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 16, 0, 0, 0, + 4, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, 0, + 255, 255, 127, 127, 0, 0, + 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0 +}; diff --git a/src/mods/vr/shaders/alpha_luminance_sprite_ps.fx b/src/mods/vr/shaders/alpha_luminance_sprite_ps.fx new file mode 100644 index 00000000..94c52275 --- /dev/null +++ b/src/mods/vr/shaders/alpha_luminance_sprite_ps.fx @@ -0,0 +1,70 @@ +#define SpriteStaticRS \ +"RootFlags ( ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT |" \ +" DENY_DOMAIN_SHADER_ROOT_ACCESS |" \ +" DENY_GEOMETRY_SHADER_ROOT_ACCESS |" \ +" DENY_HULL_SHADER_ROOT_ACCESS )," \ +"DescriptorTable ( SRV(t0), visibility = SHADER_VISIBILITY_PIXEL ),"\ +"CBV(b0), "\ +"StaticSampler(s0,"\ +" filter = FILTER_MIN_MAG_MIP_LINEAR,"\ +" addressU = TEXTURE_ADDRESS_CLAMP,"\ +" addressV = TEXTURE_ADDRESS_CLAMP,"\ +" addressW = TEXTURE_ADDRESS_CLAMP,"\ +" visibility = SHADER_VISIBILITY_PIXEL )" + +#define SpriteHeapRS \ +"RootFlags ( ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT |" \ +" DENY_DOMAIN_SHADER_ROOT_ACCESS |" \ +" DENY_GEOMETRY_SHADER_ROOT_ACCESS |" \ +" DENY_HULL_SHADER_ROOT_ACCESS )," \ +"DescriptorTable ( SRV(t0), visibility = SHADER_VISIBILITY_PIXEL ),"\ +"CBV(b0), " \ +"DescriptorTable ( Sampler(s0), visibility = SHADER_VISIBILITY_PIXEL )" + +Texture2D Texture : register(t0); +sampler TextureSampler : register(s0); + + +cbuffer Parameters : register(b0) +{ + row_major float4x4 MatrixTransform; +}; + +[RootSignature(SpriteStaticRS)] +void SpriteVertexShader(inout float4 color : COLOR0, + inout float2 texCoord : TEXCOORD0, + inout float4 position : SV_Position) +{ + position = mul(position, MatrixTransform); +} + +float4 SpritePixelShaderUnified(float4 color : COLOR0, + float2 texCoord : TEXCOORD0) +{ + float4 tex = Texture.Sample(TextureSampler, texCoord); + float finalAlpha = (1.0 - tex.a); + + return float4(tex.rgb, finalAlpha) * color; +} + +[RootSignature(SpriteStaticRS)] +float4 SpritePixelShader(float4 color : COLOR0, + float2 texCoord : TEXCOORD0) : SV_Target0 +{ + return SpritePixelShaderUnified(color, texCoord); +} + +[RootSignature(SpriteHeapRS)] +void SpriteVertexShaderHeap(inout float4 color : COLOR0, + inout float2 texCoord : TEXCOORD0, + inout float4 position : SV_Position) +{ + position = mul(position, MatrixTransform); +} + +[RootSignature(SpriteHeapRS)] +float4 SpritePixelShaderHeap(float4 color : COLOR0, + float2 texCoord : TEXCOORD0) : SV_Target0 +{ + return SpritePixelShaderUnified(color, texCoord); +} diff --git a/src/mods/vr/shaders/compile_shaders.bat b/src/mods/vr/shaders/compile_shaders.bat new file mode 100644 index 00000000..fe6b5245 --- /dev/null +++ b/src/mods/vr/shaders/compile_shaders.bat @@ -0,0 +1,54 @@ +@echo off +rem Some code is from DirectXTK's CompileShaders.cmd + +setlocal +set error=0 + +if %PROCESSOR_ARCHITECTURE%.==ARM64. (set FXCARCH=arm64) else (if %PROCESSOR_ARCHITECTURE%.==AMD64. (set FXCARCH=x64) else (set FXCARCH=x86)) + +set FXCOPTS=/nologo /WX /Ges /Zi /Zpc /Qstrip_reflect /Qstrip_debug + +set PCFXC="%WindowsSdkVerBinPath%%FXCARCH%\fxc.exe" +if exist %PCFXC% goto continue +set PCFXC="%WindowsSdkBinPath%%WindowsSDKVersion%\%FXCARCH%\fxc.exe" +if exist %PCFXC% goto continue +set PCFXC="%WindowsSdkDir%bin\%WindowsSDKVersion%\%FXCARCH%\fxc.exe" +if exist %PCFXC% goto continue + +set PCFXC=fxc.exe + +:continue + +if not defined CompileShadersOutput set CompileShadersOutput=Compiled +set StrTrim=%CompileShadersOutput%## +set StrTrim=%StrTrim: ##=% +set CompileShadersOutput=%StrTrim:##=% +@if not exist "%CompileShadersOutput%" mkdir "%CompileShadersOutput%" + +rem The compiling part. +call :CompileShader alpha_luminance_sprite_ps ps SpritePixelShader +call :CompileShader alpha_luminance_sprite_ps vs SpriteVertexShader + +if %error% == 0 ( + echo Shaders compiled ok +) else ( + echo There were shader compilation errors! + exit /b 1 +) + +endlocal +exit /b 0 + +:CompileShader +set fxc=%PCFXC% "%1.fx" %FXCOPTS% /T%2_5_0 /E%3 "/Fh%CompileShadersOutput%\%1_%3.inc" "/Fd%CompileShadersOutput%\%1_%3.pdb" /Vn%1_%3 +echo. +echo %fxc% +%fxc% || set error=1 +exit /b +4 +:CompileShaderHLSL +set fxc=%PCFXC% "%1.hlsl" %FXCOPTS% /T%2_5_0 /E%3 "/Fh%CompileShadersOutput%\%1_%3.inc" "/Fd%CompileShadersOutput%\%1_%3.pdb" /Vn%1_%3 +echo. +echo %fxc% +%fxc% || set error=1 +exit /b \ No newline at end of file