Fixed postprocessing order and precompile shaders to speed-up loading

This commit is contained in:
Lwmte 2024-12-22 20:42:06 +01:00
parent b75d14184f
commit 7249533290
17 changed files with 443 additions and 446 deletions

View file

@ -9,6 +9,7 @@ TombEngine releases are located in this repository (alongside with Tomb Editor):
* Significantly improved renderer performance. * Significantly improved renderer performance.
* Improved engine performance around bridges. * Improved engine performance around bridges.
* Improved engine performance if weather or bubble effects are active. * Improved engine performance if weather or bubble effects are active.
* Improved engine start-up time.
* Fixed silent crashes if loaded level is corrupted or in incorrect format. * Fixed silent crashes if loaded level is corrupted or in incorrect format.
* Fixed occasional crashes if there are static meshes placed within room border walls. * Fixed occasional crashes if there are static meshes placed within room border walls.
* Fixed climbable pushables clipping Lara under the bridges when pulled. * Fixed climbable pushables clipping Lara under the bridges when pulled.

View file

@ -65,6 +65,7 @@
#include "Renderer/Structures/RendererRoomAmbientMap.h" #include "Renderer/Structures/RendererRoomAmbientMap.h"
#include "Renderer/Structures/RendererObject.h" #include "Renderer/Structures/RendererObject.h"
#include "Renderer/Structures/RendererStar.h" #include "Renderer/Structures/RendererStar.h"
#include "Structures/RendererShader.h"
enum GAME_OBJECT_ID : short; enum GAME_OBJECT_ID : short;
enum class SphereSpaceType; enum class SphereSpaceType;
@ -124,43 +125,31 @@ namespace TEN::Renderer
// Shaders // Shaders
ComPtr<ID3D11VertexShader> _vsRooms; RendererShader _sRooms;
ComPtr<ID3D11VertexShader> _vsRoomsAnimatedTextures; RendererShader _sRoomsAnimated;
ComPtr<ID3D11PixelShader> _psRooms; RendererShader _sRoomsTransparent;
ComPtr<ID3D11PixelShader> _psRoomsTransparent; RendererShader _sRoomAmbient;
ComPtr<ID3D11VertexShader> _vsItems; RendererShader _sRoomAmbientSky;
ComPtr<ID3D11PixelShader> _psItems; RendererShader _sItems;
ComPtr<ID3D11VertexShader> _vsStatics; RendererShader _sStatics;
ComPtr<ID3D11PixelShader> _psStatics; RendererShader _sInstancedStatics;
ComPtr<ID3D11VertexShader> _vsSky; RendererShader _sSprites;
ComPtr<ID3D11PixelShader> _psSky; RendererShader _sInstancedSprites;
ComPtr<ID3D11VertexShader> _vsSprites; RendererShader _sSky;
ComPtr<ID3D11PixelShader> _psSprites; RendererShader _sSolid;
ComPtr<ID3D11VertexShader> _vsInstancedSprites; RendererShader _sInventory;
ComPtr<ID3D11PixelShader> _psInstancedSprites; RendererShader _sFullScreenQuad;
ComPtr<ID3D11VertexShader> _vsInstancedStaticMeshes; RendererShader _sShadowMap;
ComPtr<ID3D11PixelShader> _psInstancedStaticMeshes; RendererShader _sHUD;
ComPtr<ID3D11VertexShader> _vsSolid; RendererShader _sHUDColor;
ComPtr<ID3D11PixelShader> _psSolid; RendererShader _sHUDTexture;
ComPtr<ID3D11VertexShader> _vsInventory; RendererShader _sHUDBarColor;
ComPtr<ID3D11PixelShader> _psInventory; RendererShader _sGBuffer;
ComPtr<ID3D11VertexShader> _vsFullScreenQuad; RendererShader _sGBufferRooms;
ComPtr<ID3D11PixelShader> _psFullScreenQuad; RendererShader _sGBufferRoomsAnimated;
ComPtr<ID3D11VertexShader> _vsShadowMap; RendererShader _sGBufferItems;
ComPtr<ID3D11PixelShader> _psShadowMap; RendererShader _sGBufferStatics;
ComPtr<ID3D11VertexShader> _vsHUD; RendererShader _sGBufferInstancedStatics;
ComPtr<ID3D11PixelShader> _psHUDColor;
ComPtr<ID3D11PixelShader> _psHUDTexture;
ComPtr<ID3D11PixelShader> _psHUDBarColor;
ComPtr<ID3D11VertexShader> _vsGBufferRooms;
ComPtr<ID3D11VertexShader> _vsGBufferRoomsAnimated;
ComPtr<ID3D11VertexShader> _vsGBufferItems;
ComPtr<ID3D11VertexShader> _vsGBufferStatics;
ComPtr<ID3D11VertexShader> _vsGBufferInstancedStatics;
ComPtr<ID3D11PixelShader> _psGBuffer;
ComPtr<ID3D11VertexShader> _vsRoomAmbient;
ComPtr<ID3D11VertexShader> _vsRoomAmbientSky;
ComPtr<ID3D11PixelShader> _psRoomAmbient;
// Constant buffers // Constant buffers
@ -352,17 +341,13 @@ namespace TEN::Renderer
RenderTarget2D _SMAAEdgesRenderTarget; RenderTarget2D _SMAAEdgesRenderTarget;
RenderTarget2D _SMAABlendRenderTarget; RenderTarget2D _SMAABlendRenderTarget;
ComPtr<ID3D11VertexShader> _SMAAEdgeDetectionVS; RendererShader _sSMAAEdgeDetection;
ComPtr<ID3D11PixelShader> _SMAALumaEdgeDetectionPS; RendererShader _sSMAALumaEdgeDetection;
ComPtr<ID3D11PixelShader> _SMAAColorEdgeDetectionPS; RendererShader _sSMAAColorEdgeDetection;
ComPtr<ID3D11PixelShader> _SMAADepthEdgeDetectionPS; RendererShader _sSMAADepthEdgeDetection;
ComPtr<ID3D11VertexShader> _SMAABlendingWeightCalculationVS; RendererShader _sSMAABlendingWeightCalculation;
ComPtr<ID3D11PixelShader> _SMAABlendingWeightCalculationPS; RendererShader _sSMAANeighborhoodBlending;
ComPtr<ID3D11VertexShader> _SMAANeighborhoodBlendingVS; RendererShader _sFXAA;
ComPtr<ID3D11PixelShader> _SMAANeighborhoodBlendingPS;
ComPtr<ID3D11VertexShader> _vsFXAA;
ComPtr<ID3D11PixelShader> _psFXAA;
// Post-process // Post-process
@ -372,27 +357,27 @@ namespace TEN::Renderer
VertexBuffer<PostProcessVertex> _fullscreenTriangleVertexBuffer; VertexBuffer<PostProcessVertex> _fullscreenTriangleVertexBuffer;
ComPtr<ID3D11InputLayout> _fullscreenTriangleInputLayout = nullptr; ComPtr<ID3D11InputLayout> _fullscreenTriangleInputLayout = nullptr;
ComPtr<ID3D11VertexShader> _vsPostProcess; RendererShader _sPostProcess;
ComPtr<ID3D11PixelShader> _psPostProcessCopy; RendererShader _sPostProcessMonochrome;
ComPtr<ID3D11PixelShader> _psPostProcessMonochrome; RendererShader _sPostProcessNegative;
ComPtr<ID3D11PixelShader> _psPostProcessNegative; RendererShader _sPostProcessExclusion;
ComPtr<ID3D11PixelShader> _psPostProcessExclusion; RendererShader _sPostProcessFinalPass;
ComPtr<ID3D11PixelShader> _psPostProcessFinalPass; RendererShader _sPostProcessLensFlare;
ComPtr<ID3D11PixelShader> _psPostProcessLensFlare;
bool _doingFullscreenPass = false; bool _doingFullscreenPass = false;
// SSAO // SSAO
ComPtr<ID3D11VertexShader> _vsSSAO;
ComPtr<ID3D11PixelShader> _psSSAO;
ComPtr<ID3D11PixelShader> _psSSAOBlur;
Texture2D _SSAONoiseTexture; Texture2D _SSAONoiseTexture;
RenderTarget2D _SSAORenderTarget; RenderTarget2D _SSAORenderTarget;
RenderTarget2D _SSAOBlurredRenderTarget; RenderTarget2D _SSAOBlurredRenderTarget;
std::vector<Vector4> _SSAOKernel; std::vector<Vector4> _SSAOKernel;
RendererShader _sSSAO;
RendererShader _sSSAOBlur;
// New ambient light techinque // New ambient light techinque
RenderTarget2D _roomAmbientMapFront; RenderTarget2D _roomAmbientMapFront;
RenderTarget2D _roomAmbientMapBack; RenderTarget2D _roomAmbientMapBack;
@ -411,11 +396,13 @@ namespace TEN::Renderer
// High framerate. // High framerate.
float _interpolationFactor = 0.0f; float _interpolationFactor = 0.0f;
bool _graphicsSettingsChanged = false; bool _graphicsSettingsChanged = false;
// Private functions // Private functions
RendererShader CompileOrLoadShader(const std::string& fileName, const std::string& funcName, ShaderType type, const D3D_SHADER_MACRO* defines = nullptr);
void BindShader(const RendererShader& shader);
void ApplySMAA(RenderTarget2D* renderTarget, RenderView& view); void ApplySMAA(RenderTarget2D* renderTarget, RenderView& view);
void ApplyFXAA(RenderTarget2D* renderTarget, RenderView& view); void ApplyFXAA(RenderTarget2D* renderTarget, RenderView& view);
void BindTexture(TextureRegister registerType, TextureBase* texture, SamplerStateRegister samplerType); void BindTexture(TextureRegister registerType, TextureBase* texture, SamplerStateRegister samplerType);

View file

@ -14,7 +14,7 @@ namespace TEN::Renderer
ResetScissor(); ResetScissor();
// Common vertex shader to all fullscreen effects // Common vertex shader to all fullscreen effects
_context->VSSetShader(_vsPostProcess.Get(), nullptr, 0); BindShader(_sPostProcess);
// We draw a fullscreen triangle // We draw a fullscreen triangle
_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); _context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
@ -30,7 +30,6 @@ namespace TEN::Renderer
_context->ClearRenderTargetView(_SMAASceneRenderTarget.RenderTargetView.Get(), clearColor); _context->ClearRenderTargetView(_SMAASceneRenderTarget.RenderTargetView.Get(), clearColor);
_context->OMSetRenderTargets(1, _SMAASceneRenderTarget.RenderTargetView.GetAddressOf(), nullptr); _context->OMSetRenderTargets(1, _SMAASceneRenderTarget.RenderTargetView.GetAddressOf(), nullptr);
_context->PSSetShader(_psPostProcessCopy.Get(), nullptr, 0);
BindRenderTargetAsTexture(TextureRegister::ColorMap, renderTarget, SamplerStateRegister::PointWrap); BindRenderTargetAsTexture(TextureRegister::ColorMap, renderTarget, SamplerStateRegister::PointWrap);
DrawTriangles(3, 0); DrawTriangles(3, 0);
@ -41,8 +40,8 @@ namespace TEN::Renderer
SetCullMode(CullMode::CounterClockwise); SetCullMode(CullMode::CounterClockwise);
_context->OMSetRenderTargets(1, _SMAAEdgesRenderTarget.RenderTargetView.GetAddressOf(), nullptr); _context->OMSetRenderTargets(1, _SMAAEdgesRenderTarget.RenderTargetView.GetAddressOf(), nullptr);
_context->VSSetShader(_SMAAEdgeDetectionVS.Get(), nullptr, 0); BindShader(_sSMAAEdgeDetection);
_context->PSSetShader(_SMAAColorEdgeDetectionPS.Get(), nullptr, 0); BindShader(_sSMAAColorEdgeDetection);
_stSMAABuffer.BlendFactor = 1.0f; _stSMAABuffer.BlendFactor = 1.0f;
_cbSMAABuffer.UpdateData(_stSMAABuffer, _context.Get()); _cbSMAABuffer.UpdateData(_stSMAABuffer, _context.Get());
@ -60,8 +59,7 @@ namespace TEN::Renderer
// 2) Blend weights calculation. // 2) Blend weights calculation.
_context->OMSetRenderTargets(1, _SMAABlendRenderTarget.RenderTargetView.GetAddressOf(), nullptr); _context->OMSetRenderTargets(1, _SMAABlendRenderTarget.RenderTargetView.GetAddressOf(), nullptr);
_context->VSSetShader(_SMAABlendingWeightCalculationVS.Get(), nullptr, 0); BindShader(_sSMAABlendingWeightCalculation);
_context->PSSetShader(_SMAABlendingWeightCalculationPS.Get(), nullptr, 0);
_stSMAABuffer.SubsampleIndices = Vector4::Zero; _stSMAABuffer.SubsampleIndices = Vector4::Zero;
_cbSMAABuffer.UpdateData(_stSMAABuffer, _context.Get()); _cbSMAABuffer.UpdateData(_stSMAABuffer, _context.Get());
@ -78,8 +76,7 @@ namespace TEN::Renderer
// 3) Neighborhood blending. // 3) Neighborhood blending.
_context->OMSetRenderTargets(1, renderTarget->RenderTargetView.GetAddressOf(), nullptr); _context->OMSetRenderTargets(1, renderTarget->RenderTargetView.GetAddressOf(), nullptr);
_context->VSSetShader(_SMAANeighborhoodBlendingVS.Get(), nullptr, 0); BindShader(_sSMAANeighborhoodBlending);
_context->PSSetShader(_SMAANeighborhoodBlendingPS.Get(), nullptr, 0);
BindRenderTargetAsTexture(static_cast<TextureRegister>(0), &_SMAASceneRenderTarget, SamplerStateRegister::LinearClamp); BindRenderTargetAsTexture(static_cast<TextureRegister>(0), &_SMAASceneRenderTarget, SamplerStateRegister::LinearClamp);
BindRenderTargetAsTexture(static_cast<TextureRegister>(1), &_SMAASceneSRGBRenderTarget, SamplerStateRegister::LinearClamp); BindRenderTargetAsTexture(static_cast<TextureRegister>(1), &_SMAASceneSRGBRenderTarget, SamplerStateRegister::LinearClamp);
@ -103,7 +100,7 @@ namespace TEN::Renderer
ResetScissor(); ResetScissor();
// Common vertex shader to all fullscreen effects // Common vertex shader to all fullscreen effects
_context->VSSetShader(_vsPostProcess.Get(), nullptr, 0); BindShader(_sPostProcess);
// We draw a fullscreen triangle // We draw a fullscreen triangle
_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); _context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
@ -119,7 +116,6 @@ namespace TEN::Renderer
_context->ClearRenderTargetView(_tempRenderTarget.RenderTargetView.Get(), clearColor); _context->ClearRenderTargetView(_tempRenderTarget.RenderTargetView.Get(), clearColor);
_context->OMSetRenderTargets(1, _tempRenderTarget.RenderTargetView.GetAddressOf(), nullptr); _context->OMSetRenderTargets(1, _tempRenderTarget.RenderTargetView.GetAddressOf(), nullptr);
_context->PSSetShader(_psPostProcessCopy.Get(), nullptr, 0);
BindRenderTargetAsTexture(TextureRegister::ColorMap, renderTarget, SamplerStateRegister::PointWrap); BindRenderTargetAsTexture(TextureRegister::ColorMap, renderTarget, SamplerStateRegister::PointWrap);
DrawTriangles(3, 0); DrawTriangles(3, 0);
@ -127,7 +123,7 @@ namespace TEN::Renderer
_context->ClearRenderTargetView(renderTarget->RenderTargetView.Get(), Colors::Black); _context->ClearRenderTargetView(renderTarget->RenderTargetView.Get(), Colors::Black);
_context->OMSetRenderTargets(1, renderTarget->RenderTargetView.GetAddressOf(), nullptr); _context->OMSetRenderTargets(1, renderTarget->RenderTargetView.GetAddressOf(), nullptr);
_context->PSSetShader(_psFXAA.Get(), nullptr, 0); BindShader(_sFXAA);
_stPostProcessBuffer.ViewportWidth = _screenWidth; _stPostProcessBuffer.ViewportWidth = _screenWidth;
_stPostProcessBuffer.ViewportHeight = _screenHeight; _stPostProcessBuffer.ViewportHeight = _screenHeight;

View file

@ -167,8 +167,7 @@ namespace TEN::Renderer
UINT offset = 0; UINT offset = 0;
// Set shaders // Set shaders
_context->VSSetShader(_vsShadowMap.Get(), nullptr, 0); BindShader(_sShadowMap);
_context->PSSetShader(_psShadowMap.Get(), nullptr, 0);
_context->IASetVertexBuffers(0, 1, _moveablesVertexBuffer.Buffer.GetAddressOf(), &stride, &offset); _context->IASetVertexBuffers(0, 1, _moveablesVertexBuffer.Buffer.GetAddressOf(), &stride, &offset);
_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); _context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
@ -285,8 +284,7 @@ namespace TEN::Renderer
{ {
auto& moveableObject = *_moveableObjects[objectID]; auto& moveableObject = *_moveableObjects[objectID];
_context->VSSetShader(_vsInstancedStaticMeshes.Get(), nullptr, 0); BindShader(_sInstancedStatics);
_context->PSSetShader(_psInstancedStaticMeshes.Get(), nullptr, 0);
unsigned int stride = sizeof(Vertex); unsigned int stride = sizeof(Vertex);
unsigned int offset = 0; unsigned int offset = 0;
@ -363,8 +361,7 @@ namespace TEN::Renderer
SetDepthState(DepthState::Read); SetDepthState(DepthState::Read);
SetCullMode(CullMode::None); SetCullMode(CullMode::None);
_context->VSSetShader(_vsSolid.Get(), nullptr, 0); BindShader(_sSolid);
_context->PSSetShader(_psSolid.Get(), nullptr, 0);
auto worldMatrix = Matrix::CreateOrthographicOffCenter(0, _screenWidth, _screenHeight, 0, _viewport.MinDepth, _viewport.MaxDepth); auto worldMatrix = Matrix::CreateOrthographicOffCenter(0, _screenWidth, _screenHeight, 0, _viewport.MinDepth, _viewport.MaxDepth);
_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINELIST); _context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINELIST);
@ -534,13 +531,12 @@ namespace TEN::Renderer
{ {
if (rendererPass == RendererPass::GBuffer) if (rendererPass == RendererPass::GBuffer)
{ {
_context->VSSetShader(_vsGBufferStatics.Get(), nullptr, 0); BindShader(_sGBuffer);
_context->PSSetShader(_psGBuffer.Get(), nullptr, 0); BindShader(_sGBufferStatics);
} }
else else
{ {
_context->VSSetShader(_vsStatics.Get(), nullptr, 0); BindShader(_sStatics);
_context->PSSetShader(_psStatics.Get(), nullptr, 0);
} }
UINT stride = sizeof(Vertex); UINT stride = sizeof(Vertex);
@ -660,13 +656,12 @@ namespace TEN::Renderer
{ {
if (rendererPass == RendererPass::GBuffer) if (rendererPass == RendererPass::GBuffer)
{ {
_context->VSSetShader(_vsGBufferStatics.Get(), nullptr, 0); BindShader(_sGBuffer);
_context->PSSetShader(_psGBuffer.Get(), nullptr, 0); BindShader(_sGBufferStatics);
} }
else else
{ {
_context->VSSetShader(_vsStatics.Get(), nullptr, 0); BindShader(_sStatics);
_context->PSSetShader(_psStatics.Get(), nullptr, 0);
} }
unsigned int stride = sizeof(Vertex); unsigned int stride = sizeof(Vertex);
@ -797,13 +792,12 @@ namespace TEN::Renderer
{ {
if (rendererPass == RendererPass::GBuffer) if (rendererPass == RendererPass::GBuffer)
{ {
_context->VSSetShader(_vsGBufferInstancedStatics.Get(), nullptr, 0); BindShader(_sGBuffer);
_context->PSSetShader(_psGBuffer.Get(), nullptr, 0); BindShader(_sGBufferInstancedStatics);
} }
else else
{ {
_context->VSSetShader(_vsInstancedStaticMeshes.Get(), nullptr, 0); BindShader(_sInstancedStatics);
_context->PSSetShader(_psInstancedStaticMeshes.Get(), nullptr, 0);
} }
unsigned int stride = sizeof(Vertex); unsigned int stride = sizeof(Vertex);
@ -925,13 +919,12 @@ namespace TEN::Renderer
{ {
if (rendererPass == RendererPass::GBuffer) if (rendererPass == RendererPass::GBuffer)
{ {
_context->VSSetShader(_vsGBufferInstancedStatics.Get(), nullptr, 0); BindShader(_sGBuffer);
_context->PSSetShader(_psGBuffer.Get(), nullptr, 0); BindShader(_sGBufferInstancedStatics);
} }
else else
{ {
_context->VSSetShader(_vsInstancedStaticMeshes.Get(), nullptr, 0); BindShader(_sInstancedStatics);
_context->PSSetShader(_psInstancedStaticMeshes.Get(), nullptr, 0);
} }
unsigned int stride = sizeof(Vertex); unsigned int stride = sizeof(Vertex);
@ -1033,13 +1026,12 @@ namespace TEN::Renderer
{ {
if (rendererPass == RendererPass::GBuffer) if (rendererPass == RendererPass::GBuffer)
{ {
_context->VSSetShader(_vsGBufferStatics.Get(), nullptr, 0); BindShader(_sGBuffer);
_context->PSSetShader(_psGBuffer.Get(), nullptr, 0); BindShader(_sGBufferStatics);
} }
else else
{ {
_context->VSSetShader(_vsStatics.Get(), nullptr, 0); BindShader(_sStatics);
_context->PSSetShader(_psStatics.Get(), nullptr, 0);
} }
unsigned int stride = sizeof(Vertex); unsigned int stride = sizeof(Vertex);
@ -1097,8 +1089,7 @@ namespace TEN::Renderer
SetBlendMode(BlendMode::Additive); SetBlendMode(BlendMode::Additive);
SetCullMode(CullMode::None); SetCullMode(CullMode::None);
_context->VSSetShader(_vsSolid.Get(), nullptr, 0); BindShader(_sSolid);
_context->PSSetShader(_psSolid.Get(), nullptr, 0);
_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINELIST); _context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINELIST);
@ -1131,8 +1122,7 @@ namespace TEN::Renderer
SetBlendMode(BlendMode::Additive); SetBlendMode(BlendMode::Additive);
SetCullMode(CullMode::None); SetCullMode(CullMode::None);
_context->VSSetShader(_vsSolid.Get(), nullptr, 0); BindShader(_sSolid);
_context->PSSetShader(_psSolid.Get(), nullptr, 0);
_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); _context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
_context->IASetInputLayout(_inputLayout.Get()); _context->IASetInputLayout(_inputLayout.Get());
@ -1936,7 +1926,7 @@ namespace TEN::Renderer
SetBlendMode(BlendMode::Opaque); SetBlendMode(BlendMode::Opaque);
SetCullMode(CullMode::CounterClockwise); SetCullMode(CullMode::CounterClockwise);
_context->PSSetShader(_psRoomAmbient.Get(), nullptr, 0); BindShader(_sRoomAmbient);
// Bind and clear render target // Bind and clear render target
_context->ClearRenderTargetView(renderTarget->RenderTargetView.Get(), Colors::Black); _context->ClearRenderTargetView(renderTarget->RenderTargetView.Get(), Colors::Black);
@ -1986,7 +1976,7 @@ namespace TEN::Renderer
if (levelPtr->Horizon) if (levelPtr->Horizon)
{ {
_context->VSSetShader(_vsRoomAmbientSky.Get(), nullptr, 0); BindShader(_sRoomAmbientSky);
if (Lara.Control.Look.OpticRange != 0) if (Lara.Control.Look.OpticRange != 0)
AlterFOV(ANGLE(DEFAULT_FOV) - Lara.Control.Look.OpticRange, false); AlterFOV(ANGLE(DEFAULT_FOV) - Lara.Control.Look.OpticRange, false);
@ -2068,7 +2058,7 @@ namespace TEN::Renderer
_context->ClearDepthStencilView(renderTarget->DepthStencilView.Get(), D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0); _context->ClearDepthStencilView(renderTarget->DepthStencilView.Get(), D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);
} }
_context->VSSetShader(_vsRoomAmbient.Get(), nullptr, 0); BindShader(_sRoomAmbient);
// Draw rooms // Draw rooms
UINT stride = sizeof(Vertex); UINT stride = sizeof(Vertex);
@ -2274,13 +2264,12 @@ namespace TEN::Renderer
// Set shaders. // Set shaders.
if (rendererPass == RendererPass::GBuffer) if (rendererPass == RendererPass::GBuffer)
{ {
_context->VSSetShader(_vsGBufferItems.Get(), nullptr, 0); BindShader(_sGBuffer);
_context->PSSetShader(_psGBuffer.Get(), nullptr, 0); BindShader(_sGBufferItems);
} }
else else
{ {
_context->VSSetShader(_vsItems.Get(), nullptr, 0); BindShader(_sItems);
_context->PSSetShader(_psItems.Get(), nullptr, 0);
} }
BindRenderTargetAsTexture(TextureRegister::SSAO, &_SSAOBlurredRenderTarget, SamplerStateRegister::PointWrap); BindRenderTargetAsTexture(TextureRegister::SSAO, &_SSAOBlurredRenderTarget, SamplerStateRegister::PointWrap);
@ -2417,13 +2406,12 @@ namespace TEN::Renderer
#ifdef DISABLE_INSTANCING #ifdef DISABLE_INSTANCING
if (rendererPass == RendererPass::GBuffer) if (rendererPass == RendererPass::GBuffer)
{ {
_context->VSSetShader(_vsGBufferStatics.Get(), NULL, 0); BindShader(_sGBuffer);
_context->PSSetShader(_psGBuffer.Get(), NULL, 0); BindShader(_sGBufferStatics);
} }
else else
{ {
_context->VSSetShader(_vsStatics.Get(), NULL, 0); BindShader(_sStatics);
_context->PSSetShader(_psStatics.Get(), NULL, 0);
} }
// Bind vertex and index buffer // Bind vertex and index buffer
@ -2499,13 +2487,12 @@ namespace TEN::Renderer
#else #else
if (rendererPass == RendererPass::GBuffer) if (rendererPass == RendererPass::GBuffer)
{ {
_context->VSSetShader(_vsGBufferInstancedStatics.Get(), NULL, 0); BindShader(_sGBuffer);
_context->PSSetShader(_psGBuffer.Get(), NULL, 0); BindShader(_sGBufferInstancedStatics);
} }
else else
{ {
_context->VSSetShader(_vsInstancedStaticMeshes.Get(), NULL, 0); BindShader(_sInstancedStatics);
_context->PSSetShader(_psInstancedStaticMeshes.Get(), NULL, 0);
} }
// Bind vertex and index buffer // Bind vertex and index buffer
@ -2695,11 +2682,11 @@ namespace TEN::Renderer
{ {
if (rendererPass == RendererPass::GBuffer) if (rendererPass == RendererPass::GBuffer)
{ {
_context->PSSetShader(_psGBuffer.Get(), nullptr, 0); BindShader(_sGBuffer);
} }
else else
{ {
_context->PSSetShader(_psRooms.Get(), nullptr, 0); BindShader(_sRooms);
} }
UINT stride = sizeof(Vertex); UINT stride = sizeof(Vertex);
@ -2763,11 +2750,11 @@ namespace TEN::Renderer
{ {
if (rendererPass != RendererPass::GBuffer) if (rendererPass != RendererPass::GBuffer)
{ {
_context->VSSetShader((animated == 0) ? _vsRooms.Get() : _vsRoomsAnimatedTextures.Get(), nullptr, 0); if (animated == 0) BindShader(_sRooms); else BindShader(_sRoomsAnimated);
} }
else else
{ {
_context->VSSetShader((animated == 0) ? _vsGBufferRooms.Get() : _vsGBufferRoomsAnimated.Get(), nullptr, 0); if (animated == 0) BindShader(_sGBufferRooms); else BindShader(_sGBufferRoomsAnimated);
} }
for (const auto& bucket : room.Buckets) for (const auto& bucket : room.Buckets)
@ -2866,9 +2853,7 @@ namespace TEN::Renderer
// Draw sky. // Draw sky.
auto rotation = Matrix::CreateRotationX(PI); auto rotation = Matrix::CreateRotationX(PI);
_context->VSSetShader(_vsSky.Get(), nullptr, 0); BindShader(_sSky);
_context->PSSetShader(_psSky.Get(), nullptr, 0);
BindTexture(TextureRegister::ColorMap, &_skyTexture, SamplerStateRegister::AnisotropicClamp); BindTexture(TextureRegister::ColorMap, &_skyTexture, SamplerStateRegister::AnisotropicClamp);
_context->IASetVertexBuffers(0, 1, _skyVertexBuffer.Buffer.GetAddressOf(), &stride, &offset); _context->IASetVertexBuffers(0, 1, _skyVertexBuffer.Buffer.GetAddressOf(), &stride, &offset);
@ -2909,8 +2894,7 @@ namespace TEN::Renderer
_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); _context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
_context->VSSetShader(_vsInstancedSprites.Get(), nullptr, 0); BindShader(_sInstancedSprites);
_context->PSSetShader(_psInstancedSprites.Get(), nullptr, 0);
// Set up vertex buffer and parameters. // Set up vertex buffer and parameters.
UINT stride = sizeof(Vertex); UINT stride = sizeof(Vertex);
@ -3049,8 +3033,7 @@ namespace TEN::Renderer
_context->IASetVertexBuffers(0, 1, _moveablesVertexBuffer.Buffer.GetAddressOf(), &stride, &offset); _context->IASetVertexBuffers(0, 1, _moveablesVertexBuffer.Buffer.GetAddressOf(), &stride, &offset);
_context->IASetIndexBuffer(_moveablesIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); _context->IASetIndexBuffer(_moveablesIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0);
_context->VSSetShader(_vsSky.Get(), nullptr, 0); BindShader(_sSky);
_context->PSSetShader(_psSky.Get(), nullptr, 0);
auto& moveableObj = *_moveableObjects[ID_HORIZON]; auto& moveableObj = *_moveableObjects[ID_HORIZON];
@ -3094,8 +3077,7 @@ namespace TEN::Renderer
_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); _context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
_context->VSSetShader(_vsInstancedSprites.Get(), nullptr, 0); BindShader(_sInstancedSprites);
_context->PSSetShader(_psInstancedSprites.Get(), nullptr, 0);
// Set up vertex buffer and parameters. // Set up vertex buffer and parameters.
unsigned int stride = sizeof(Vertex); unsigned int stride = sizeof(Vertex);
@ -3522,7 +3504,7 @@ namespace TEN::Renderer
ROOM_INFO* nativeRoom = &g_Level.Rooms[objectInfo->Room->RoomNumber]; ROOM_INFO* nativeRoom = &g_Level.Rooms[objectInfo->Room->RoomNumber];
_context->PSSetShader(_psRooms.Get(), nullptr, 0); BindShader(_sRooms);
UINT stride = sizeof(Vertex); UINT stride = sizeof(Vertex);
UINT offset = 0; UINT offset = 0;
@ -3538,14 +3520,8 @@ namespace TEN::Renderer
SetScissor(objectInfo->Room->ClipBounds); SetScissor(objectInfo->Room->ClipBounds);
if (objectInfo->Bucket->Animated == 0) if (objectInfo->Bucket->Animated != 0)
{ BindShader(_sRoomsAnimated);
_context->VSSetShader(_vsRooms.Get(), nullptr, 0);
}
else
{
_context->VSSetShader(_vsRoomsAnimatedTextures.Get(), nullptr, 0);
}
SetBlendMode(objectInfo->Bucket->BlendMode); SetBlendMode(objectInfo->Bucket->BlendMode);
SetAlphaTest(AlphaTestMode::None, ALPHA_TEST_THRESHOLD); SetAlphaTest(AlphaTestMode::None, ALPHA_TEST_THRESHOLD);
@ -3611,8 +3587,7 @@ namespace TEN::Renderer
SetBlendMode(objectInfo->Bucket->BlendMode); SetBlendMode(objectInfo->Bucket->BlendMode);
SetAlphaTest(AlphaTestMode::None, ALPHA_TEST_THRESHOLD); SetAlphaTest(AlphaTestMode::None, ALPHA_TEST_THRESHOLD);
_context->VSSetShader(_vsItems.Get(), nullptr, 0); BindShader(_sItems);
_context->PSSetShader(_psItems.Get(), nullptr, 0);
// Bind main item properties. // Bind main item properties.
Matrix world = objectInfo->Item->InterpolatedWorld; Matrix world = objectInfo->Item->InterpolatedWorld;
@ -3652,8 +3627,7 @@ namespace TEN::Renderer
_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); _context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
_context->IASetInputLayout(_inputLayout.Get()); _context->IASetInputLayout(_inputLayout.Get());
_context->VSSetShader(_vsStatics.Get(), nullptr, 0); BindShader(_sStatics);
_context->PSSetShader(_psStatics.Get(), nullptr, 0);
Matrix world = objectInfo->Static->World; Matrix world = objectInfo->Static->World;
_stStatic.World = world; _stStatic.World = world;
@ -3691,8 +3665,7 @@ namespace TEN::Renderer
_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); _context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
_context->IASetInputLayout(_inputLayout.Get()); _context->IASetInputLayout(_inputLayout.Get());
_context->VSSetShader(_vsStatics.Get(), nullptr, 0); BindShader(_sStatics);
_context->PSSetShader(_psStatics.Get(), nullptr, 0);
Matrix world = objectInfo->World; Matrix world = objectInfo->World;
_stStatic.World = world; _stStatic.World = world;
@ -3731,10 +3704,10 @@ namespace TEN::Renderer
SetDepthState(DepthState::Write); SetDepthState(DepthState::Write);
// Common vertex shader to all full screen effects // Common vertex shader to all full screen effects
_context->VSSetShader(_vsPostProcess.Get(), nullptr, 0); BindShader(_sPostProcess);
// SSAO pixel shader // SSAO pixel shader
_context->PSSetShader(_psSSAO.Get(), nullptr, 0); BindShader(_sSSAO);
_context->ClearRenderTargetView(_SSAORenderTarget.RenderTargetView.Get(), Colors::White); _context->ClearRenderTargetView(_SSAORenderTarget.RenderTargetView.Get(), Colors::White);
_context->OMSetRenderTargets(1, _SSAORenderTarget.RenderTargetView.GetAddressOf(), nullptr); _context->OMSetRenderTargets(1, _SSAORenderTarget.RenderTargetView.GetAddressOf(), nullptr);
@ -3778,7 +3751,7 @@ namespace TEN::Renderer
DrawTriangles(3, 0); DrawTriangles(3, 0);
// Blur step // Blur step
_context->PSSetShader(_psSSAOBlur.Get(), nullptr, 0); BindShader(_sSSAOBlur);
_context->ClearRenderTargetView(_SSAOBlurredRenderTarget.RenderTargetView.Get(), Colors::Black); _context->ClearRenderTargetView(_SSAOBlurredRenderTarget.RenderTargetView.Get(), Colors::Black);
_context->OMSetRenderTargets(1, _SSAOBlurredRenderTarget.RenderTargetView.GetAddressOf(), nullptr); _context->OMSetRenderTargets(1, _SSAOBlurredRenderTarget.RenderTargetView.GetAddressOf(), nullptr);

View file

@ -132,8 +132,8 @@ namespace TEN::Renderer
_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); _context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
_context->IASetIndexBuffer(bar.IndexBufferBorder.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); _context->IASetIndexBuffer(bar.IndexBufferBorder.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0);
_context->VSSetShader(_vsHUD.Get(), nullptr, 0); BindShader(_sHUD);
_context->PSSetShader(_psHUDTexture.Get(), nullptr, 0); BindShader(_sHUDTexture);
SetBlendMode(BlendMode::Opaque); SetBlendMode(BlendMode::Opaque);
SetDepthState(DepthState::None); SetDepthState(DepthState::None);
@ -161,8 +161,8 @@ namespace TEN::Renderer
_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); _context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
_context->IASetIndexBuffer(bar.InnerIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); _context->IASetIndexBuffer(bar.InnerIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0);
_context->VSSetShader(_vsHUD.Get(), nullptr, 0); BindShader(_sHUD);
_context->PSSetShader(_psHUDBarColor.Get(), nullptr, 0); BindShader(_sHUDBarColor);
_stHUDBar.Percent = percent; _stHUDBar.Percent = percent;
_stHUDBar.Poisoned = isPoisoned; _stHUDBar.Poisoned = isPoisoned;
@ -195,8 +195,8 @@ namespace TEN::Renderer
_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); _context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
_context->IASetIndexBuffer(g_LoadingBar->IndexBufferBorder.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); _context->IASetIndexBuffer(g_LoadingBar->IndexBufferBorder.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0);
_context->VSSetShader(_vsHUD.Get(), NULL, 0); BindShader(_sHUD);
_context->PSSetShader(_psHUDTexture.Get(), NULL, 0); BindShader(_sHUDTexture);
SetBlendMode(BlendMode::Opaque); SetBlendMode(BlendMode::Opaque);
SetDepthState(DepthState::None); SetDepthState(DepthState::None);
@ -220,8 +220,8 @@ namespace TEN::Renderer
_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); _context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
_context->IASetIndexBuffer(g_LoadingBar->InnerIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); _context->IASetIndexBuffer(g_LoadingBar->InnerIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0);
_context->VSSetShader(_vsHUD.Get(), nullptr, 0); BindShader(_sHUD);
_context->PSSetShader(_psHUDBarColor.Get(), nullptr, 0); BindShader(_sHUDBarColor);
_stHUDBar.Percent = percentage / 100.0f; _stHUDBar.Percent = percentage / 100.0f;
_stHUDBar.Poisoned = false; _stHUDBar.Poisoned = false;
@ -305,8 +305,7 @@ namespace TEN::Renderer
vertices[3].UV.y = 1.0f; vertices[3].UV.y = 1.0f;
vertices[3].Color = Vector4(1.0f, 0.0f, 0.0f, 1.0f); vertices[3].Color = Vector4(1.0f, 0.0f, 0.0f, 1.0f);
_context->VSSetShader(_vsFullScreenQuad.Get(), nullptr, 0); BindShader(_sFullScreenQuad);
_context->PSSetShader(_psFullScreenQuad.Get(), nullptr, 0);
_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); _context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
_context->IASetInputLayout(_inputLayout.Get()); _context->IASetInputLayout(_inputLayout.Get());
@ -342,8 +341,7 @@ namespace TEN::Renderer
if (renderView.DisplaySpritesToDraw.empty()) if (renderView.DisplaySpritesToDraw.empty())
return; return;
_context->VSSetShader(_vsFullScreenQuad.Get(), nullptr, 0); BindShader(_sFullScreenQuad);
_context->PSSetShader(_psFullScreenQuad.Get(), nullptr, 0);
_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); _context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
_context->IASetInputLayout(_inputLayout.Get()); _context->IASetInputLayout(_inputLayout.Get());
@ -465,8 +463,7 @@ namespace TEN::Renderer
vertices[3].UV.y = uvEnd.y; vertices[3].UV.y = uvEnd.y;
vertices[3].Color = colorVec4; vertices[3].Color = colorVec4;
_context->VSSetShader(_vsFullScreenQuad.Get(), nullptr, 0); BindShader(_sFullScreenQuad);
_context->PSSetShader(_psFullScreenQuad.Get(), nullptr, 0);
_context->PSSetShaderResources(0, 1, &texture); _context->PSSetShaderResources(0, 1, &texture);
@ -543,8 +540,7 @@ namespace TEN::Renderer
vertices[3].UV.y = uvEnd.y; vertices[3].UV.y = uvEnd.y;
vertices[3].Color = Vector4(color.x, color.y, color.z, 1.0f); vertices[3].Color = Vector4(color.x, color.y, color.z, 1.0f);
_context->VSSetShader(_vsFullScreenQuad.Get(), nullptr, 0); BindShader(_sFullScreenQuad);
_context->PSSetShader(_psFullScreenQuad.Get(), nullptr, 0);
_context->PSSetShaderResources(0, 1, &texture); _context->PSSetShaderResources(0, 1, &texture);
auto* sampler = _renderStates->AnisotropicClamp(); auto* sampler = _renderStates->AnisotropicClamp();

View file

@ -1022,8 +1022,7 @@ namespace TEN::Renderer
if (!settings.MuzzleFlash) if (!settings.MuzzleFlash)
return false; return false;
_context->VSSetShader(_vsStatics.Get(), nullptr, 0); BindShader(_sStatics);
_context->PSSetShader(_psStatics.Get(), nullptr, 0);
unsigned int stride = sizeof(Vertex); unsigned int stride = sizeof(Vertex);
unsigned int offset = 0; unsigned int offset = 0;
@ -1144,8 +1143,7 @@ namespace TEN::Renderer
void Renderer::DrawBaddyGunflashes(RenderView& view) void Renderer::DrawBaddyGunflashes(RenderView& view)
{ {
_context->VSSetShader(_vsStatics.Get(), nullptr, 0); BindShader(_sStatics);
_context->PSSetShader(_psStatics.Get(), nullptr, 0);
unsigned int stride = sizeof(Vertex); unsigned int stride = sizeof(Vertex);
unsigned int offset = 0; unsigned int offset = 0;
@ -1371,8 +1369,7 @@ namespace TEN::Renderer
void Renderer::DrawEffects(RenderView& view, RendererPass rendererPass) void Renderer::DrawEffects(RenderView& view, RendererPass rendererPass)
{ {
_context->VSSetShader(_vsStatics.Get(), nullptr, 0); BindShader(_sStatics);
_context->PSSetShader(_psStatics.Get(), nullptr, 0);
unsigned int stride = sizeof(Vertex); unsigned int stride = sizeof(Vertex);
unsigned int offset = 0; unsigned int offset = 0;
@ -1413,8 +1410,7 @@ namespace TEN::Renderer
if (activeDebrisExist) if (activeDebrisExist)
{ {
_context->VSSetShader(_vsStatics.Get(), nullptr, 0); BindShader(_sStatics);
_context->PSSetShader(_psStatics.Get(), nullptr, 0);
SetCullMode(CullMode::None); SetCullMode(CullMode::None);

View file

@ -816,8 +816,7 @@ namespace TEN::Renderer
_context->IASetIndexBuffer(_moveablesIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); _context->IASetIndexBuffer(_moveablesIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0);
// Set shaders. // Set shaders.
_context->VSSetShader(_vsInventory.Get(), nullptr, 0); BindShader(_sInventory);
_context->PSSetShader(_psInventory.Get(), nullptr, 0);
// Set matrices. // Set matrices.
CCameraMatrixBuffer hudCamera; CCameraMatrixBuffer hudCamera;
@ -889,7 +888,7 @@ namespace TEN::Renderer
if (!texture.Texture) if (!texture.Texture)
return; return;
int timeout = 20; int timeout = 10;
float currentFade = FADE_FACTOR; float currentFade = FADE_FACTOR;
while (timeout || currentFade > 0.0f) while (timeout || currentFade > 0.0f)
@ -1010,8 +1009,7 @@ namespace TEN::Renderer
_context->IASetIndexBuffer(_moveablesIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); _context->IASetIndexBuffer(_moveablesIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0);
// Set shaders // Set shaders
_context->VSSetShader(_vsInventory.Get(), nullptr, 0); BindShader(_sInventory);
_context->PSSetShader(_psInventory.Get(), nullptr, 0);
if (CurrentLevel == 0) if (CurrentLevel == 0)
{ {

View file

@ -2,18 +2,23 @@
#include <string> #include <string>
#include <memory> #include <memory>
#include <filesystem> #include <filesystem>
#include <random>
#include <d3dcompiler.h>
#include "Renderer/Renderer.h" #include "Renderer/Renderer.h"
#include "Renderer/RendererUtils.h"
#include "Renderer/SMAA/AreaTex.h"
#include "Renderer/SMAA/SearchTex.h"
#include "Scripting/Include/Flow/ScriptInterfaceFlowHandler.h" #include "Scripting/Include/Flow/ScriptInterfaceFlowHandler.h"
#include "Specific/configuration.h" #include "Specific/configuration.h"
#include "Specific/memory/Vector.h" #include "Specific/memory/Vector.h"
#include "Specific/trutils.h" #include "Specific/trutils.h"
#include "Specific/winmain.h" #include "Specific/winmain.h"
#include "Renderer/SMAA/AreaTex.h"
#include "Renderer/SMAA/SearchTex.h"
#include <random>
extern GameConfiguration g_Configuration; extern GameConfiguration g_Configuration;
using namespace TEN::Renderer::Utils;
static std::wstring GetAssetPath(const wchar_t* fileName) static std::wstring GetAssetPath(const wchar_t* fileName)
{ {
return TEN::Utils::ToWString(g_GameFlow->GetGameDir()) + fileName; return TEN::Utils::ToWString(g_GameFlow->GetGameDir()) + fileName;
@ -35,12 +40,9 @@ namespace TEN::Renderer
_renderStates = std::make_unique<CommonStates>(_device.Get()); _renderStates = std::make_unique<CommonStates>(_device.Get());
// Load shaders // Load shaders
ComPtr<ID3D10Blob> blob;
const D3D_SHADER_MACRO roomDefinesAnimated[] = { "ANIMATED", "", nullptr, nullptr }; const D3D_SHADER_MACRO roomDefinesAnimated[] = { "ANIMATED", "", nullptr, nullptr };
const D3D_SHADER_MACRO roomDefinesShadowMap[] = { "SHADOW_MAP", "", nullptr, nullptr }; const D3D_SHADER_MACRO roomDefinesShadowMap[] = { "SHADOW_MAP", "", nullptr, nullptr };
_vsRooms = Utils::compileVertexShader(_device.Get(), GetAssetPath(L"Shaders\\Rooms.fx"), "VS", "vs_5_0", nullptr, blob);
// Initialize input layout using first vertex shader. // Initialize input layout using first vertex shader.
D3D11_INPUT_ELEMENT_DESC inputLayoutItems[] = D3D11_INPUT_ELEMENT_DESC inputLayoutItems[] =
{ {
@ -57,50 +59,41 @@ namespace TEN::Renderer
{ "DRAWINDEX", 0, DXGI_FORMAT_R32_UINT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "DRAWINDEX", 0, DXGI_FORMAT_R32_UINT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "HASH", 0, DXGI_FORMAT_R32_SINT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 } { "HASH", 0, DXGI_FORMAT_R32_SINT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }
}; };
Utils::throwIfFailed(_device->CreateInputLayout(inputLayoutItems, 12, blob->GetBufferPointer(), blob->GetBufferSize(), &_inputLayout));
_vsRoomsAnimatedTextures = Utils::compileVertexShader(_device.Get(), GetAssetPath(L"Shaders\\Rooms.fx"), "VS", "vs_5_0", &roomDefinesAnimated[0], blob); _sRooms = CompileOrLoadShader("Rooms", "", ShaderType::PixelAndVertex);
_psRooms = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\Rooms.fx"), "PS", "ps_5_0", nullptr, blob); Utils::throwIfFailed(_device->CreateInputLayout(inputLayoutItems, 12, _sRooms.Vertex.Blob->GetBufferPointer(), _sRooms.Vertex.Blob->GetBufferSize(), &_inputLayout));
_vsItems = Utils::compileVertexShader(_device.Get(), GetAssetPath(L"Shaders\\Items.fx"), "VS", "vs_5_0", nullptr, blob);
_psItems = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\Items.fx"), "PS", "ps_5_0", nullptr, blob); _sRoomsAnimated = CompileOrLoadShader("Rooms", "", ShaderType::Vertex, &roomDefinesAnimated[0]);
_vsStatics = Utils::compileVertexShader(_device.Get(), GetAssetPath(L"Shaders\\Statics.fx"), "VS", "vs_5_0", nullptr, blob); _sItems = CompileOrLoadShader("Items", "", ShaderType::PixelAndVertex);
_psStatics = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\Statics.fx"), "PS", "ps_5_0", nullptr, blob); _sStatics = CompileOrLoadShader("Statics", "", ShaderType::PixelAndVertex);
_vsSky = Utils::compileVertexShader(_device.Get(), GetAssetPath(L"Shaders\\Sky.fx"), "VS", "vs_5_0", nullptr, blob); _sSky = CompileOrLoadShader("Sky", "", ShaderType::PixelAndVertex);
_psSky = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\Sky.fx"), "PS", "ps_5_0", nullptr, blob); _sSprites = CompileOrLoadShader("Sprites", "", ShaderType::PixelAndVertex);
_vsSprites = Utils::compileVertexShader(_device.Get(), GetAssetPath(L"Shaders\\Sprites.fx"), "VS", "vs_5_0", nullptr, blob); _sSolid = CompileOrLoadShader("Solid", "", ShaderType::PixelAndVertex);
_psSprites = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\Sprites.fx"), "PS", "ps_5_0", nullptr, blob); _sInventory = CompileOrLoadShader("Inventory", "", ShaderType::PixelAndVertex);
_vsSolid = Utils::compileVertexShader(_device.Get(), GetAssetPath(L"Shaders\\Solid.fx"), "VS", "vs_5_0", nullptr, blob); _sFullScreenQuad = CompileOrLoadShader("FullScreenQuad", "", ShaderType::PixelAndVertex);
_psSolid = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\Solid.fx"), "PS", "ps_5_0", nullptr, blob); _sShadowMap = CompileOrLoadShader("ShadowMap", "", ShaderType::PixelAndVertex, &roomDefinesShadowMap[0]);
_vsInventory = Utils::compileVertexShader(_device.Get(), GetAssetPath(L"Shaders\\Inventory.fx"), "VS", "vs_5_0", nullptr, blob); _sHUD = CompileOrLoadShader("HUD", "", ShaderType::Vertex);
_psInventory = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\Inventory.fx"), "PS", "ps_5_0", nullptr, blob); _sHUDColor = CompileOrLoadShader("HUD", "ColoredHUD", ShaderType::Pixel);
_vsFullScreenQuad = Utils::compileVertexShader(_device.Get(), GetAssetPath(L"Shaders\\FullScreenQuad.fx"), "VS", "vs_5_0", nullptr, blob); _sHUDTexture = CompileOrLoadShader("HUD", "TexturedHUD", ShaderType::Pixel);
_psFullScreenQuad = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\FullScreenQuad.fx"), "PS", "ps_5_0", nullptr, blob); _sHUDBarColor = CompileOrLoadShader("HUD", "TexturedHUDBar", ShaderType::Pixel);
_vsShadowMap = Utils::compileVertexShader(_device.Get(), GetAssetPath(L"Shaders\\ShadowMap.fx"), "VS", "vs_5_0", nullptr, blob); _sInstancedStatics = CompileOrLoadShader("InstancedStatics", "", ShaderType::PixelAndVertex);
_psShadowMap = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\ShadowMap.fx"), "PS", "ps_5_0", nullptr, blob); _sInstancedSprites = CompileOrLoadShader("InstancedSprites", "", ShaderType::PixelAndVertex);
_vsHUD = Utils::compileVertexShader(_device.Get(), GetAssetPath(L"Shaders\\HUD.hlsl"), "VS", "vs_5_0", nullptr, blob);
_psHUDColor = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\HUD.hlsl"), "PSColoredHUD", "ps_5_0", nullptr, blob); _sGBuffer = CompileOrLoadShader("GBuffer", "", ShaderType::Pixel);
_psHUDTexture = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\HUD.hlsl"), "PSTexturedHUD", "ps_5_0", nullptr, blob); _sGBufferRooms = CompileOrLoadShader("GBuffer", "Rooms", ShaderType::Vertex);
_psHUDBarColor = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\HUD.hlsl"), "PSTexturedHUDBar", "ps_5_0", nullptr, blob); _sGBufferRoomsAnimated = CompileOrLoadShader("GBuffer", "Rooms", ShaderType::Vertex, &roomDefinesAnimated[0]);
_vsInstancedStaticMeshes = Utils::compileVertexShader(_device.Get(), GetAssetPath(L"Shaders\\InstancedStatics.fx"), "VS", "vs_5_0", nullptr, blob); _sGBufferItems = CompileOrLoadShader("GBuffer", "Items", ShaderType::Vertex);
_psInstancedStaticMeshes = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\InstancedStatics.fx"), "PS", "ps_5_0", nullptr, blob); _sGBufferStatics = CompileOrLoadShader("GBuffer", "Statics", ShaderType::Vertex);
_vsInstancedSprites = Utils::compileVertexShader(_device.Get(), GetAssetPath(L"Shaders\\InstancedSprites.fx"), "VS", "vs_5_0", nullptr, blob); _sGBufferInstancedStatics = CompileOrLoadShader("GBuffer", "InstancedStatics", ShaderType::Vertex);
_psInstancedSprites = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\InstancedSprites.fx"), "PS", "ps_5_0", nullptr, blob);
_vsGBufferRooms = Utils::compileVertexShader(_device.Get(), GetAssetPath(L"Shaders\\GBuffer.fx"), "VSRooms", "vs_5_0", nullptr, blob); _sRoomAmbient = CompileOrLoadShader("RoomAmbient", "", ShaderType::PixelAndVertex);
_vsGBufferRoomsAnimated = Utils::compileVertexShader(_device.Get(), GetAssetPath(L"Shaders\\GBuffer.fx"), "VSRooms", "vs_5_0", &roomDefinesAnimated[0], blob); _sRoomAmbientSky = CompileOrLoadShader("RoomAmbient", "Sky", ShaderType::Vertex);
_vsGBufferItems = Utils::compileVertexShader(_device.Get(), GetAssetPath(L"Shaders\\GBuffer.fx"), "VSItems", "vs_5_0", nullptr, blob); _sFXAA = CompileOrLoadShader("FXAA", "", ShaderType::Pixel);
_vsGBufferStatics = Utils::compileVertexShader(_device.Get(), GetAssetPath(L"Shaders\\GBuffer.fx"), "VSStatics", "vs_5_0", nullptr, blob); _sSSAO = CompileOrLoadShader("SSAO", "", ShaderType::Pixel);
_vsGBufferInstancedStatics = Utils::compileVertexShader(_device.Get(), GetAssetPath(L"Shaders\\GBuffer.fx"), "VSInstancedStatics", "vs_5_0", nullptr, blob); _sSSAOBlur = CompileOrLoadShader("SSAO", "Blur", ShaderType::Pixel);
_psGBuffer = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\GBuffer.fx"), "PS", "ps_5_0", nullptr, blob);
_vsRoomAmbient = Utils::compileVertexShader(_device.Get(), GetAssetPath(L"Shaders\\RoomAmbient.fx"), "VS", "vs_5_0", nullptr, blob);
_vsRoomAmbientSky = Utils::compileVertexShader(_device.Get(), GetAssetPath(L"Shaders\\RoomAmbient.fx"), "VSSky", "vs_5_0", nullptr, blob);
_psRoomAmbient = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\RoomAmbient.fx"), "PS", "ps_5_0", nullptr, blob);
_vsFXAA = Utils::compileVertexShader(_device.Get(), GetAssetPath(L"Shaders\\FXAA.fx"), "VS", "vs_5_0", nullptr, blob);
_psFXAA = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\FXAA.fx"), "PS", "ps_5_0", nullptr, blob);
_psSSAO = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\SSAO.fx"), "PS", "ps_5_0", nullptr, blob);
_psSSAOBlur = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\SSAO.fx"), "PSBlur", "ps_5_0", nullptr, blob);
const D3D_SHADER_MACRO transparentDefines[] = { "TRANSPARENT", "", nullptr, nullptr }; const D3D_SHADER_MACRO transparentDefines[] = { "TRANSPARENT", "", nullptr, nullptr };
_psRoomsTransparent = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\Rooms.fx"), "PS", "ps_5_0", &transparentDefines[0], blob); _sRoomsTransparent = CompileOrLoadShader("Rooms", "", ShaderType::Pixel, &transparentDefines[0]);
// Initialize constant buffers // Initialize constant buffers
_cbCameraMatrices = CreateConstantBuffer<CCameraMatrixBuffer>(); _cbCameraMatrices = CreateConstantBuffer<CCameraMatrixBuffer>();
@ -292,9 +285,7 @@ namespace TEN::Renderer
_fullscreenTriangleVertexBuffer = VertexBuffer<PostProcessVertex>(_device.Get(), 3, &vertices[0]); _fullscreenTriangleVertexBuffer = VertexBuffer<PostProcessVertex>(_device.Get(), 3, &vertices[0]);
ComPtr<ID3D10Blob> blob; _sPostProcess = CompileOrLoadShader("PostProcess", "", ShaderType::PixelAndVertex);
_vsPostProcess = Utils::compileVertexShader(_device.Get(), GetAssetPath(L"Shaders\\PostProcess.fx"), "VS", "vs_5_0", nullptr, blob);
D3D11_INPUT_ELEMENT_DESC postProcessInputLayoutItems[] = D3D11_INPUT_ELEMENT_DESC postProcessInputLayoutItems[] =
{ {
@ -302,14 +293,15 @@ namespace TEN::Renderer
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 } { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }
}; };
Utils::throwIfFailed(_device->CreateInputLayout(postProcessInputLayoutItems, 3, blob->GetBufferPointer(), blob->GetBufferSize(), &_fullscreenTriangleInputLayout));
Utils::throwIfFailed(_device->CreateInputLayout(postProcessInputLayoutItems, 3,
_psPostProcessCopy = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\PostProcess.fx"), "PSCopy", "ps_5_0", nullptr, blob); _sPostProcess.Vertex.Blob->GetBufferPointer(), _sPostProcess.Vertex.Blob->GetBufferSize(), &_fullscreenTriangleInputLayout));
_psPostProcessMonochrome = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\PostProcess.fx"), "PSMonochrome", "ps_5_0", nullptr, blob);
_psPostProcessNegative = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\PostProcess.fx"), "PSNegative", "ps_5_0", nullptr, blob); _sPostProcessMonochrome = CompileOrLoadShader("PostProcess", "Monochrome", ShaderType::Pixel);
_psPostProcessExclusion = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\PostProcess.fx"), "PSExclusion", "ps_5_0", nullptr, blob); _sPostProcessNegative = CompileOrLoadShader("PostProcess", "Negative", ShaderType::Pixel);
_psPostProcessFinalPass = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\PostProcess.fx"), "PSFinalPass", "ps_5_0", nullptr, blob); _sPostProcessExclusion = CompileOrLoadShader("PostProcess", "Exclusion", ShaderType::Pixel);
_psPostProcessLensFlare = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\PostProcess.fx"), "PSLensFlare", "ps_5_0", nullptr, blob); _sPostProcessFinalPass = CompileOrLoadShader("PostProcess", "FinalPass", ShaderType::Pixel);
_sPostProcessLensFlare = CompileOrLoadShader("PostProcess", "LensFlare", ShaderType::Pixel);
} }
void Renderer::CreateSSAONoiseTexture() void Renderer::CreateSSAONoiseTexture()
@ -597,16 +589,12 @@ namespace TEN::Renderer
auto null = D3D10_SHADER_MACRO{ nullptr, nullptr }; auto null = D3D10_SHADER_MACRO{ nullptr, nullptr };
defines.push_back(null); defines.push_back(null);
auto blob = ComPtr<ID3D10Blob>{}; _sSMAALumaEdgeDetection = CompileOrLoadShader("SMAA", "LumaEdgeDetection", ShaderType::Pixel, defines.data());
_SMAALumaEdgeDetectionPS = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\SMAA.fx"), "DX11_SMAALumaEdgeDetectionPS", "ps_5_0", defines.data(), blob); _sSMAAColorEdgeDetection = CompileOrLoadShader("SMAA", "ColorEdgeDetection", ShaderType::Pixel, defines.data());
_SMAAColorEdgeDetectionPS = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\SMAA.fx"), "DX11_SMAAColorEdgeDetectionPS", "ps_5_0", defines.data(), blob); _sSMAADepthEdgeDetection = CompileOrLoadShader("SMAA", "DepthEdgeDetection", ShaderType::Pixel, defines.data());
_SMAADepthEdgeDetectionPS = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\SMAA.fx"), "DX11_SMAADepthEdgeDetectionPS", "ps_5_0", defines.data(), blob); _sSMAABlendingWeightCalculation = CompileOrLoadShader("SMAA", "BlendingWeightCalculation", ShaderType::PixelAndVertex, defines.data());
_SMAABlendingWeightCalculationPS = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\SMAA.fx"), "DX11_SMAABlendingWeightCalculationPS", "ps_5_0", defines.data(), blob); _sSMAANeighborhoodBlending = CompileOrLoadShader("SMAA", "NeighborhoodBlending", ShaderType::PixelAndVertex, defines.data());
_SMAANeighborhoodBlendingPS = Utils::compilePixelShader(_device.Get(), GetAssetPath(L"Shaders\\SMAA.fx"), "DX11_SMAANeighborhoodBlendingPS", "ps_5_0", defines.data(), blob); _sSMAAEdgeDetection = CompileOrLoadShader("SMAA", "EdgeDetection", ShaderType::Vertex, defines.data());
_SMAAEdgeDetectionVS = Utils::compileVertexShader(_device.Get(), GetAssetPath(L"Shaders\\SMAA.fx"), "DX11_SMAAEdgeDetectionVS", "vs_5_0", defines.data(), blob);
_SMAABlendingWeightCalculationVS = Utils::compileVertexShader(_device.Get(), GetAssetPath(L"Shaders\\SMAA.fx"), "DX11_SMAABlendingWeightCalculationVS", "vs_5_0", defines.data(), blob);
_SMAANeighborhoodBlendingVS = Utils::compileVertexShader(_device.Get(), GetAssetPath(L"Shaders\\SMAA.fx"), "DX11_SMAANeighborhoodBlendingVS", "vs_5_0", defines.data(), blob);
} }
void Renderer::InitializeCommonTextures() void Renderer::InitializeCommonTextures()
@ -688,4 +676,152 @@ namespace TEN::Renderer
UpdateWindow(WindowsHandle); UpdateWindow(WindowsHandle);
} }
void Renderer::BindShader(const RendererShader& shader)
{
if (shader.Vertex.Shader != nullptr) _context->VSSetShader(shader.Vertex.Shader.Get(), nullptr, 0);
if (shader.Pixel.Shader != nullptr) _context->PSSetShader(shader.Pixel.Shader.Get(), nullptr, 0);
if (shader.Compute.Shader != nullptr) _context->CSSetShader(shader.Compute.Shader.Get(), nullptr, 0);
}
RendererShader Renderer::CompileOrLoadShader(const std::string& fileName, const std::string& funcName, ShaderType type, const D3D_SHADER_MACRO* defines)
{
RendererShader result = {};
// We need to increment the counter to avoid overwriting compiled shaders with the same source file name.
static int compileCounter = 0;
// Define paths for native (uncompiled) shaders and compiled shaders.
std::wstring shaderPath = GetAssetPath(L"Shaders\\");
std::wstring compiledShaderPath = shaderPath + L"Bin\\";
std::wstring wideFileName = TEN::Utils::ToWString(fileName);
// Ensure the /Bin subdirectory exists.
std::filesystem::create_directories(compiledShaderPath);
// Helper function to load or compile a shader.
auto loadOrCompileShader = [this, type, defines, shaderPath, compiledShaderPath]
(const std::wstring& baseFileName, const std::string& shaderType, const std::string& functionName, const char* model, ComPtr<ID3D10Blob>& bytecode)
{
// Construct the full paths using GetAssetPath.
auto prefix = ((compileCounter < 10) ? L"0" : L"") + std::to_wstring(compileCounter) + L"_";
auto csoFileName = compiledShaderPath + prefix + baseFileName + L"." + std::wstring(shaderType.begin(), shaderType.end()) + L".cso";
auto srcFileName = shaderPath + baseFileName;
// Try both .hlsl and .fx extensions for the source shader.
auto srcFileNameWithExtension = srcFileName + L".hlsl";
if (!std::filesystem::exists(srcFileNameWithExtension))
{
srcFileNameWithExtension = srcFileName + L".fx";
if (!std::filesystem::exists(srcFileNameWithExtension))
{
TENLog("Shader source file not found: " + TEN::Utils::ToString(srcFileNameWithExtension), LogLevel::Error);
throw std::runtime_error("Shader source file not found");
}
}
// Check modification dates of the source and compiled files.
bool shouldRecompile = false;
if (std::filesystem::exists(csoFileName))
{
auto csoTime = std::filesystem::last_write_time(csoFileName);
auto srcTime = std::filesystem::last_write_time(srcFileNameWithExtension);
shouldRecompile = srcTime > csoTime; // Recompile if the source is newer.
}
// Load compiled shader if it exists and is up to date.
if (!shouldRecompile)
{
std::ifstream csoFile(csoFileName, std::ios::binary);
if (csoFile.is_open())
{
// Load compiled shader.
csoFile.seekg(0, std::ios::end);
size_t fileSize = csoFile.tellg();
csoFile.seekg(0, std::ios::beg);
std::vector<char> buffer(fileSize);
csoFile.read(buffer.data(), fileSize);
csoFile.close();
D3DCreateBlob(fileSize, &bytecode);
memcpy(bytecode->GetBufferPointer(), buffer.data(), fileSize);
return;
}
}
// Set up compilation flags according to the build configuration.
unsigned int flags = D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_PACK_MATRIX_ROW_MAJOR;
if constexpr (DebugBuild)
flags |= D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION;
else
flags |= D3DCOMPILE_OPTIMIZATION_LEVEL3 | D3DCOMPILE_IEEE_STRICTNESS;
auto trimmedFileName = std::filesystem::path(srcFileNameWithExtension).filename().string();
TENLog("Compiling shader: " + trimmedFileName, LogLevel::Info);
// Compile shader.
ComPtr<ID3D10Blob> errors;
HRESULT res = D3DCompileFromFile(srcFileNameWithExtension.c_str(), defines, D3D_COMPILE_STANDARD_FILE_INCLUDE,
(shaderType + functionName).c_str(), model, flags, 0, bytecode.GetAddressOf(), errors.GetAddressOf());
if (FAILED(res))
{
if (errors)
{
auto error = std::string(static_cast<const char*>(errors->GetBufferPointer()));
TENLog(error, LogLevel::Error);
throw std::runtime_error(error);
}
else
{
TENLog("Error while compiling shader: " + trimmedFileName, LogLevel::Error);
throwIfFailed(res);
}
}
// Save compiled shader to .cso file.
std::ofstream outCsoFile(csoFileName, std::ios::binary);
if (outCsoFile.is_open())
{
outCsoFile.write(reinterpret_cast<const char*>(bytecode->GetBufferPointer()), bytecode->GetBufferSize());
outCsoFile.close();
}
};
// Load or compile and create pixel shader.
if (type == ShaderType::Pixel || type == ShaderType::PixelAndVertex)
{
loadOrCompileShader(wideFileName, "PS", funcName, "ps_5_0", result.Pixel.Blob);
throwIfFailed(_device->CreatePixelShader(result.Pixel.Blob->GetBufferPointer(), result.Pixel.Blob->GetBufferSize(),
nullptr, result.Pixel.Shader.GetAddressOf()
));
}
// Load or compile and create vertex shader.
if (type == ShaderType::Vertex || type == ShaderType::PixelAndVertex)
{
loadOrCompileShader(wideFileName, "VS", funcName, "vs_5_0", result.Vertex.Blob);
throwIfFailed(_device->CreateVertexShader(result.Vertex.Blob->GetBufferPointer(), result.Vertex.Blob->GetBufferSize(),
nullptr, result.Vertex.Shader.GetAddressOf()
));
}
// Load or compile and create compute shader.
if (type == ShaderType::Compute)
{
loadOrCompileShader(wideFileName, "CS", funcName, "cs_5_0", result.Compute.Blob);
throwIfFailed(_device->CreateComputeShader(result.Compute.Blob->GetBufferPointer(), result.Compute.Blob->GetBufferSize(),
nullptr, result.Compute.Shader.GetAddressOf()
));
}
// Increment the compile counter.
compileCounter++;
return result;
}
} }

View file

@ -42,7 +42,7 @@ namespace TEN::Renderer
_cbPostProcessBuffer.UpdateData(_stPostProcessBuffer, _context.Get()); _cbPostProcessBuffer.UpdateData(_stPostProcessBuffer, _context.Get());
// Common vertex shader to all fullscreen effects. // Common vertex shader to all fullscreen effects.
_context->VSSetShader(_vsPostProcess.Get(), nullptr, 0); BindShader(_sPostProcess);
// Draw fullscreen triangle. // Draw fullscreen triangle.
_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); _context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
@ -58,7 +58,6 @@ namespace TEN::Renderer
_context->ClearRenderTargetView(_postProcessRenderTarget[0].RenderTargetView.Get(), clearColor); _context->ClearRenderTargetView(_postProcessRenderTarget[0].RenderTargetView.Get(), clearColor);
_context->OMSetRenderTargets(1, _postProcessRenderTarget[0].RenderTargetView.GetAddressOf(), nullptr); _context->OMSetRenderTargets(1, _postProcessRenderTarget[0].RenderTargetView.GetAddressOf(), nullptr);
_context->PSSetShader(_psPostProcessCopy.Get(), nullptr, 0);
BindRenderTargetAsTexture(TextureRegister::ColorMap, &_renderTarget, SamplerStateRegister::PointWrap); BindRenderTargetAsTexture(TextureRegister::ColorMap, &_renderTarget, SamplerStateRegister::PointWrap);
DrawTriangles(3, 0); DrawTriangles(3, 0);
@ -66,44 +65,13 @@ namespace TEN::Renderer
int currentRenderTarget = 0; int currentRenderTarget = 0;
int destRenderTarget = 1; int destRenderTarget = 1;
// Apply color scheme.
if (_postProcessMode != PostProcessMode::None && _postProcessStrength > EPSILON)
{
_context->ClearRenderTargetView(_postProcessRenderTarget[destRenderTarget].RenderTargetView.Get(), clearColor);
_context->OMSetRenderTargets(1, _postProcessRenderTarget[destRenderTarget].RenderTargetView.GetAddressOf(), nullptr);
switch (_postProcessMode)
{
case PostProcessMode::Monochrome:
_context->PSSetShader(_psPostProcessMonochrome.Get(), nullptr, 0);
break;
case PostProcessMode::Negative:
_context->PSSetShader(_psPostProcessNegative.Get(), nullptr, 0);
break;
case PostProcessMode::Exclusion:
_context->PSSetShader(_psPostProcessExclusion.Get(), nullptr, 0);
break;
default:
return;
}
BindRenderTargetAsTexture(TextureRegister::ColorMap, &_postProcessRenderTarget[currentRenderTarget], SamplerStateRegister::PointWrap);
DrawTriangles(3, 0);
destRenderTarget = (destRenderTarget == 1) ? 0 : 1;
currentRenderTarget = (currentRenderTarget == 1) ? 0 : 1;
}
// Lens flares. // Lens flares.
if (!view.LensFlaresToDraw.empty()) if (!view.LensFlaresToDraw.empty())
{ {
_context->ClearRenderTargetView(_postProcessRenderTarget[destRenderTarget].RenderTargetView.Get(), clearColor); _context->ClearRenderTargetView(_postProcessRenderTarget[destRenderTarget].RenderTargetView.Get(), clearColor);
_context->OMSetRenderTargets(1, _postProcessRenderTarget[destRenderTarget].RenderTargetView.GetAddressOf(), nullptr); _context->OMSetRenderTargets(1, _postProcessRenderTarget[destRenderTarget].RenderTargetView.GetAddressOf(), nullptr);
_context->PSSetShader(_psPostProcessLensFlare.Get(), nullptr, 0); BindShader(_sPostProcessLensFlare);
for (int i = 0; i < view.LensFlaresToDraw.size(); i++) for (int i = 0; i < view.LensFlaresToDraw.size(); i++)
{ {
@ -120,8 +88,39 @@ namespace TEN::Renderer
currentRenderTarget = (currentRenderTarget == 1) ? 0 : 1; currentRenderTarget = (currentRenderTarget == 1) ? 0 : 1;
} }
// Apply color scheme.
if (_postProcessMode != PostProcessMode::None && _postProcessStrength > EPSILON)
{
_context->ClearRenderTargetView(_postProcessRenderTarget[destRenderTarget].RenderTargetView.Get(), clearColor);
_context->OMSetRenderTargets(1, _postProcessRenderTarget[destRenderTarget].RenderTargetView.GetAddressOf(), nullptr);
switch (_postProcessMode)
{
case PostProcessMode::Monochrome:
BindShader(_sPostProcessMonochrome);
break;
case PostProcessMode::Negative:
BindShader(_sPostProcessNegative);
break;
case PostProcessMode::Exclusion:
BindShader(_sPostProcessExclusion);
break;
default:
return;
}
BindRenderTargetAsTexture(TextureRegister::ColorMap, &_postProcessRenderTarget[currentRenderTarget], SamplerStateRegister::PointWrap);
DrawTriangles(3, 0);
destRenderTarget = (destRenderTarget == 1) ? 0 : 1;
currentRenderTarget = (currentRenderTarget == 1) ? 0 : 1;
}
// Do final pass. // Do final pass.
_context->PSSetShader(_psPostProcessFinalPass.Get(), nullptr, 0); BindShader(_sPostProcessFinalPass);
_context->ClearRenderTargetView(renderTarget->RenderTargetView.Get(), Colors::Black); _context->ClearRenderTargetView(renderTarget->RenderTargetView.Get(), Colors::Black);
_context->OMSetRenderTargets(1, renderTarget->RenderTargetView.GetAddressOf(), nullptr); _context->OMSetRenderTargets(1, renderTarget->RenderTargetView.GetAddressOf(), nullptr);
@ -173,7 +172,7 @@ namespace TEN::Renderer
ResetScissor(); ResetScissor();
// Common vertex shader to all fullscreen effects // Common vertex shader to all fullscreen effects
_context->VSSetShader(_vsPostProcess.Get(), nullptr, 0); BindShader(_sPostProcess);
// We draw a fullscreen triangle // We draw a fullscreen triangle
_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); _context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
@ -188,7 +187,6 @@ namespace TEN::Renderer
_context->ClearRenderTargetView(dest->RenderTargetView.Get(), clearColor); _context->ClearRenderTargetView(dest->RenderTargetView.Get(), clearColor);
_context->OMSetRenderTargets(1, dest->RenderTargetView.GetAddressOf(), nullptr); _context->OMSetRenderTargets(1, dest->RenderTargetView.GetAddressOf(), nullptr);
_context->PSSetShader(_psPostProcessCopy.Get(), nullptr, 0);
BindRenderTargetAsTexture(TextureRegister::ColorMap, source, SamplerStateRegister::PointWrap); BindRenderTargetAsTexture(TextureRegister::ColorMap, source, SamplerStateRegister::PointWrap);
DrawTriangles(3, 0); DrawTriangles(3, 0);
} }

View file

@ -279,8 +279,7 @@ namespace TEN::Renderer
SetDepthState(DepthState::Read); SetDepthState(DepthState::Read);
SetCullMode(CullMode::None); SetCullMode(CullMode::None);
_context->VSSetShader(_vsInstancedSprites.Get(), nullptr, 0); BindShader(_sInstancedSprites);
_context->PSSetShader(_psInstancedSprites.Get(), nullptr, 0);
// Set up vertex buffer and parameters. // Set up vertex buffer and parameters.
unsigned int stride = sizeof(Vertex); unsigned int stride = sizeof(Vertex);
@ -341,8 +340,7 @@ namespace TEN::Renderer
SetDepthState(DepthState::Read); SetDepthState(DepthState::Read);
SetCullMode(CullMode::None); SetCullMode(CullMode::None);
_context->VSSetShader(_vsSprites.Get(), nullptr, 0); BindShader(_sSprites);
_context->PSSetShader(_psSprites.Get(), nullptr, 0);
wasGPUSet = true; wasGPUSet = true;
} }
@ -413,8 +411,7 @@ namespace TEN::Renderer
SetBlendMode(object->Sprite->BlendMode); SetBlendMode(object->Sprite->BlendMode);
SetAlphaTest(AlphaTestMode::GreatherThan, ALPHA_TEST_THRESHOLD); SetAlphaTest(AlphaTestMode::GreatherThan, ALPHA_TEST_THRESHOLD);
_context->VSSetShader(_vsInstancedSprites.Get(), nullptr, 0); BindShader(_sInstancedSprites);
_context->PSSetShader(_psInstancedSprites.Get(), nullptr, 0);
// Set up vertex buffer and parameters. // Set up vertex buffer and parameters.
UINT stride = sizeof(Vertex); UINT stride = sizeof(Vertex);
@ -459,8 +456,7 @@ namespace TEN::Renderer
SetBlendMode(object->Sprite->BlendMode); SetBlendMode(object->Sprite->BlendMode);
SetAlphaTest(AlphaTestMode::GreatherThan, ALPHA_TEST_THRESHOLD); SetAlphaTest(AlphaTestMode::GreatherThan, ALPHA_TEST_THRESHOLD);
_context->VSSetShader(_vsSprites.Get(), nullptr, 0); BindShader(_sSprites);
_context->PSSetShader(_psSprites.Get(), nullptr, 0);
_stSprite.IsSoftParticle = object->Sprite->SoftParticle ? 1 : 0; _stSprite.IsSoftParticle = object->Sprite->SoftParticle ? 1 : 0;
_stSprite.RenderType = (int)object->Sprite->renderType; _stSprite.RenderType = (int)object->Sprite->renderType;
@ -505,8 +501,7 @@ namespace TEN::Renderer
UINT stride = sizeof(Vertex); UINT stride = sizeof(Vertex);
UINT offset = 0; UINT offset = 0;
_context->VSSetShader(_vsSprites.Get(), nullptr, 0); BindShader(_sSprites);
_context->PSSetShader(_psSprites.Get(), nullptr, 0);
_sortedPolygonsVertexBuffer.Update(_context.Get(), _sortedPolygonsVertices.data(), 0, (int)_sortedPolygonsVertices.size()); _sortedPolygonsVertexBuffer.Update(_context.Get(), _sortedPolygonsVertices.data(), 0, (int)_sortedPolygonsVertices.size());

View file

@ -1,20 +1,18 @@
#include "framework.h" #include "framework.h"
#include <codecvt> #include <codecvt>
#include <d3dcompiler.h> #include <d3dcompiler.h>
#include <locale> #include <locale>
#include <iostream> #include <iostream>
#include <winerror.h> #include <winerror.h>
#include <wrl/client.h> #include <wrl/client.h>
#include "Renderer/Renderer.h" #include "Renderer/Renderer.h"
#include "Specific/trutils.h" #include "Specific/trutils.h"
#include "Structures/RendererShader.h"
namespace TEN::Renderer::Utils namespace TEN::Renderer::Utils
{ {
using std::wstring;
using std::string;
using Microsoft::WRL::ComPtr;
using std::vector;
void throwIfFailed(const HRESULT& res) void throwIfFailed(const HRESULT& res)
{ {
if (FAILED(res)) if (FAILED(res))
@ -44,119 +42,4 @@ namespace TEN::Renderer::Utils
throw std::runtime_error("An error occured!"); throw std::runtime_error("An error occured!");
} }
} }
ComPtr<ID3D11VertexShader> compileVertexShader(ID3D11Device* device, const std::wstring& fileName, const std::string& function, const std::string& model, const D3D_SHADER_MACRO * defines, ComPtr<ID3D10Blob>& bytecode)
{
ComPtr<ID3D10Blob> errors;
HRESULT res = (D3DCompileFromFile(fileName.c_str(), defines, D3D_COMPILE_STANDARD_FILE_INCLUDE, function.c_str(), model.c_str(), GetShaderFlags(), 0, bytecode.GetAddressOf(),errors.GetAddressOf()));
if (FAILED(res))
{
ID3D10Blob* errorObj = errors.Get();
if (errorObj != nullptr)
{
auto error = std::string((char*)errorObj->GetBufferPointer());
TENLog(error, LogLevel::Error);
throw std::runtime_error(error);
}
else
{
TENLog("Error while compiling VS shader: " + TEN::Utils::ToString(fileName.c_str()), LogLevel::Error);
throwIfFailed(res);
}
}
ComPtr<ID3D11VertexShader> shader;
throwIfFailed(device->CreateVertexShader(bytecode->GetBufferPointer(), bytecode->GetBufferSize(), nullptr, shader.GetAddressOf()));
if constexpr (DebugBuild)
{
char buffer[100];
unsigned int size = (unsigned int)std::wcstombs(buffer, fileName.c_str(), 100);
shader->SetPrivateData(WKPDID_D3DDebugObjectName, size, buffer);
}
return shader;
}
ComPtr<ID3D11PixelShader> compilePixelShader(ID3D11Device* device, const wstring& fileName, const string& function, const string& model, const D3D_SHADER_MACRO* defines, ComPtr<ID3D10Blob>& bytecode)
{
ComPtr<ID3D10Blob> errors;
HRESULT res = (D3DCompileFromFile(fileName.c_str(), defines, D3D_COMPILE_STANDARD_FILE_INCLUDE, function.c_str(), model.c_str(), GetShaderFlags(), 0, bytecode.GetAddressOf(), errors.GetAddressOf()));
if (FAILED(res))
{
ID3D10Blob* errorObj = errors.Get();
if (errorObj != nullptr)
{
auto error = std::string((char*)errorObj->GetBufferPointer());
TENLog(error, LogLevel::Error);
throw std::runtime_error(error);
}
else
{
TENLog("Error while compiling PS shader: " + TEN::Utils::ToString(fileName.c_str()), LogLevel::Error);
throwIfFailed(res);
}
}
ComPtr<ID3D11PixelShader> shader;
throwIfFailed(device->CreatePixelShader(bytecode->GetBufferPointer(), bytecode->GetBufferSize(), nullptr, shader.GetAddressOf()));
if constexpr (DebugBuild)
{
char buffer[100];
unsigned int size = (unsigned int)std::wcstombs(buffer, fileName.c_str(), 100);
shader->SetPrivateData(WKPDID_D3DDebugObjectName, size, buffer);
}
return shader;
}
ComPtr<ID3D11ComputeShader> compileComputeShader(ID3D11Device* device, const wstring& fileName, const string& function, const string& model, const D3D_SHADER_MACRO* defines, ComPtr<ID3D10Blob>& bytecode)
{
auto errors = ComPtr<ID3D10Blob>{};
auto res = D3DCompileFromFile(fileName.c_str(), defines, D3D_COMPILE_STANDARD_FILE_INCLUDE, function.c_str(), model.c_str(), GetShaderFlags(), 0, bytecode.GetAddressOf(), errors.GetAddressOf());
if (FAILED(res))
{
auto* errorObj = errors.Get();
if (errorObj != nullptr)
{
auto error = std::string((char*)errorObj->GetBufferPointer());
TENLog(error, LogLevel::Error);
throw std::runtime_error(error);
}
else
{
TENLog("Error while compiling CS shader: " + TEN::Utils::ToString(fileName.c_str()), LogLevel::Error);
throwIfFailed(res);
}
}
auto shader = ComPtr<ID3D11ComputeShader>{};
throwIfFailed(device->CreateComputeShader(bytecode->GetBufferPointer(), bytecode->GetBufferSize(), nullptr, shader.GetAddressOf()));
if constexpr (DebugBuild)
{
char buffer[100];
unsigned int size = (unsigned int)std::wcstombs(buffer, fileName.c_str(), 100);
shader->SetPrivateData(WKPDID_D3DDebugObjectName, size, buffer);
}
return shader;
}
constexpr unsigned int Utils::GetShaderFlags()
{
unsigned int flags = D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_PACK_MATRIX_ROW_MAJOR;
if constexpr (DebugBuild)
{
flags |= D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION;
}
else
{
flags |= D3DCOMPILE_OPTIMIZATION_LEVEL3 | D3DCOMPILE_IEEE_STRICTNESS;
}
return flags;
}
} }

View file

@ -9,9 +9,4 @@ namespace TEN::Renderer::Utils
void throwIfFailed(const HRESULT& res); void throwIfFailed(const HRESULT& res);
void throwIfFailed(const HRESULT& res, const std::string& info); void throwIfFailed(const HRESULT& res, const std::string& info);
void throwIfFailed(const HRESULT& res, const std::wstring& info); void throwIfFailed(const HRESULT& res, const std::wstring& info);
[[nodiscard]] Microsoft::WRL::ComPtr<ID3D11VertexShader> compileVertexShader(ID3D11Device* device, const std::wstring& fileName, const std::string& function, const std::string& model, const D3D_SHADER_MACRO* defines, Microsoft::WRL::ComPtr<ID3D10Blob>& bytecode);
constexpr [[nodiscard]] unsigned int GetShaderFlags();
[[nodiscard]] Microsoft::WRL::ComPtr<ID3D11PixelShader> compilePixelShader(ID3D11Device* device, const std::wstring& fileName, const std::string& function, const std::string& model, const D3D_SHADER_MACRO* defines, Microsoft::WRL::ComPtr<ID3D10Blob>& bytecode);
[[nodiscard]] Microsoft::WRL::ComPtr<ID3D11ComputeShader> compileComputeShader(ID3D11Device* device, const std::wstring& fileName, const std::string& function, const std::string& model, const D3D_SHADER_MACRO* defines, Microsoft::WRL::ComPtr<ID3D10Blob>& bytecode);
} }

View file

@ -0,0 +1,42 @@
#pragma once
#include <wrl/client.h>
#include <d3d11.h>
#include <utility>
using Microsoft::WRL::ComPtr;
namespace TEN::Renderer::Structures
{
enum class ShaderType
{
Pixel,
Vertex,
PixelAndVertex,
Compute
};
struct RendererPixelShaderAndBlob
{
ComPtr<ID3D11PixelShader> Shader = nullptr;
ComPtr<ID3D10Blob> Blob;
};
struct RendererVertexShaderAndBlob
{
ComPtr<ID3D11VertexShader> Shader = nullptr;
ComPtr<ID3D10Blob> Blob;
};
struct RendererComputeShaderAndBlob
{
ComPtr<ID3D11ComputeShader> Shader = nullptr;
ComPtr<ID3D10Blob> Blob;
};
struct RendererShader
{
RendererPixelShaderAndBlob Pixel;
RendererVertexShaderAndBlob Vertex;
RendererComputeShaderAndBlob Compute;
};
}

View file

@ -32,7 +32,7 @@ PixelShaderInput VS(VertexShaderInput input)
return output; return output;
} }
float4 PSCopy(PixelShaderInput input) : SV_Target float4 PS(PixelShaderInput input) : SV_Target
{ {
return ColorTexture.Sample(ColorSampler, input.UV); return ColorTexture.Sample(ColorSampler, input.UV);
} }

View file

@ -139,7 +139,7 @@ Texture2D searchTex : register(t8);
/** /**
* Function wrappers * Function wrappers
*/ */
void DX11_SMAAEdgeDetectionVS(float3 position : POSITION, void VSEdgeDetection(float3 position : POSITION,
out float4 svPosition : SV_POSITION, out float4 svPosition : SV_POSITION,
inout float2 texcoord : TEXCOORD0, inout float2 texcoord : TEXCOORD0,
out float4 offset[3] : TEXCOORD1) { out float4 offset[3] : TEXCOORD1) {
@ -147,7 +147,7 @@ void DX11_SMAAEdgeDetectionVS(float3 position : POSITION,
SMAAEdgeDetectionVS(texcoord, offset); SMAAEdgeDetectionVS(texcoord, offset);
} }
void DX11_SMAABlendingWeightCalculationVS(float3 position : POSITION, void VSBlendingWeightCalculation(float3 position : POSITION,
out float4 svPosition : SV_POSITION, out float4 svPosition : SV_POSITION,
inout float2 texcoord : TEXCOORD0, inout float2 texcoord : TEXCOORD0,
out float2 pixcoord : TEXCOORD1, out float2 pixcoord : TEXCOORD1,
@ -156,7 +156,7 @@ void DX11_SMAABlendingWeightCalculationVS(float3 position : POSITION,
SMAABlendingWeightCalculationVS(texcoord, pixcoord, offset); SMAABlendingWeightCalculationVS(texcoord, pixcoord, offset);
} }
void DX11_SMAANeighborhoodBlendingVS(float3 position : POSITION, void VSNeighborhoodBlending(float3 position : POSITION,
out float4 svPosition : SV_POSITION, out float4 svPosition : SV_POSITION,
inout float2 texcoord : TEXCOORD0, inout float2 texcoord : TEXCOORD0,
out float4 offset : TEXCOORD1) { out float4 offset : TEXCOORD1) {
@ -164,19 +164,19 @@ void DX11_SMAANeighborhoodBlendingVS(float3 position : POSITION,
SMAANeighborhoodBlendingVS(texcoord, offset); SMAANeighborhoodBlendingVS(texcoord, offset);
} }
void DX11_SMAAResolveVS(float3 position : POSITION, void VSResolve(float3 position : POSITION,
out float4 svPosition : SV_POSITION, out float4 svPosition : SV_POSITION,
inout float2 texcoord : TEXCOORD0) { inout float2 texcoord : TEXCOORD0) {
svPosition = float4(position, 1.0f); svPosition = float4(position, 1.0f);
} }
void DX11_SMAASeparateVS(float3 position : POSITION, void VSSeparate(float3 position : POSITION,
out float4 svPosition : SV_POSITION, out float4 svPosition : SV_POSITION,
inout float2 texcoord : TEXCOORD0) { inout float2 texcoord : TEXCOORD0) {
svPosition = float4(position, 1.0f); svPosition = float4(position, 1.0f);
} }
float2 DX11_SMAALumaEdgeDetectionPS(float4 position : SV_POSITION, float2 PSLumaEdgeDetection(float4 position : SV_POSITION,
float2 texcoord : TEXCOORD0, float2 texcoord : TEXCOORD0,
float4 offset[3] : TEXCOORD1) : SV_TARGET{ float4 offset[3] : TEXCOORD1) : SV_TARGET{
#if SMAA_PREDICATION #if SMAA_PREDICATION
@ -186,7 +186,7 @@ return SMAALumaEdgeDetectionPS(texcoord, offset, colorTexGamma);
#endif #endif
} }
float2 DX11_SMAAColorEdgeDetectionPS(float4 position : SV_POSITION, float2 PSColorEdgeDetection(float4 position : SV_POSITION,
float2 texcoord : TEXCOORD0, float2 texcoord : TEXCOORD0,
float4 offset[3] : TEXCOORD1) : SV_TARGET{ float4 offset[3] : TEXCOORD1) : SV_TARGET{
#if SMAA_PREDICATION #if SMAA_PREDICATION
@ -196,20 +196,20 @@ return SMAAColorEdgeDetectionPS(texcoord, offset, colorTexGamma);
#endif #endif
} }
float2 DX11_SMAADepthEdgeDetectionPS(float4 position : SV_POSITION, float2 PSDepthEdgeDetection(float4 position : SV_POSITION,
float2 texcoord : TEXCOORD0, float2 texcoord : TEXCOORD0,
float4 offset[3] : TEXCOORD1) : SV_TARGET{ float4 offset[3] : TEXCOORD1) : SV_TARGET{
return SMAADepthEdgeDetectionPS(texcoord, offset, depthTex); return SMAADepthEdgeDetectionPS(texcoord, offset, depthTex);
} }
float4 DX11_SMAABlendingWeightCalculationPS(float4 position : SV_POSITION, float4 PSBlendingWeightCalculation(float4 position : SV_POSITION,
float2 texcoord : TEXCOORD0, float2 texcoord : TEXCOORD0,
float2 pixcoord : TEXCOORD1, float2 pixcoord : TEXCOORD1,
float4 offset[3] : TEXCOORD2) : SV_TARGET{ float4 offset[3] : TEXCOORD2) : SV_TARGET{
return SMAABlendingWeightCalculationPS(texcoord, pixcoord, offset, edgesTex, areaTex, searchTex, subsampleIndices); return SMAABlendingWeightCalculationPS(texcoord, pixcoord, offset, edgesTex, areaTex, searchTex, subsampleIndices);
} }
float4 DX11_SMAANeighborhoodBlendingPS(float4 position : SV_POSITION, float4 PSNeighborhoodBlending(float4 position : SV_POSITION,
float2 texcoord : TEXCOORD0, float2 texcoord : TEXCOORD0,
float4 offset : TEXCOORD1) : SV_TARGET{ float4 offset : TEXCOORD1) : SV_TARGET{
#if SMAA_REPROJECTION #if SMAA_REPROJECTION
@ -219,7 +219,7 @@ return SMAANeighborhoodBlendingPS(texcoord, offset, colorTex, blendTex);
#endif #endif
} }
float4 DX11_SMAAResolvePS(float4 position : SV_POSITION, float4 PSResolve(float4 position : SV_POSITION,
float2 texcoord : TEXCOORD0) : SV_TARGET{ float2 texcoord : TEXCOORD0) : SV_TARGET{
#if SMAA_REPROJECTION #if SMAA_REPROJECTION
return SMAAResolvePS(texcoord, colorTex, colorTexPrev, velocityTex); return SMAAResolvePS(texcoord, colorTex, colorTexPrev, velocityTex);
@ -228,7 +228,7 @@ return SMAAResolvePS(texcoord, colorTex, colorTexPrev);
#endif #endif
} }
void DX11_SMAASeparatePS(float4 position : SV_POSITION, void PSSeparate(float4 position : SV_POSITION,
float2 texcoord : TEXCOORD0, float2 texcoord : TEXCOORD0,
out float4 target0 : SV_TARGET0, out float4 target0 : SV_TARGET0,
out float4 target1 : SV_TARGET1) { out float4 target1 : SV_TARGET1) {
@ -240,9 +240,9 @@ void DX11_SMAASeparatePS(float4 position : SV_POSITION,
*/ */
technique10 LumaEdgeDetection { technique10 LumaEdgeDetection {
pass LumaEdgeDetection { pass LumaEdgeDetection {
SetVertexShader(CompileShader(vs_4_0, DX11_SMAAEdgeDetectionVS())); SetVertexShader(CompileShader(vs_4_0, VSEdgeDetection()));
SetGeometryShader(NULL); SetGeometryShader(NULL);
SetPixelShader(CompileShader(PS_VERSION, DX11_SMAALumaEdgeDetectionPS())); SetPixelShader(CompileShader(PS_VERSION, PSLumaEdgeDetection()));
SetDepthStencilState(DisableDepthReplaceStencil, 1); SetDepthStencilState(DisableDepthReplaceStencil, 1);
SetBlendState(NoBlending, float4(0.0f, 0.0f, 0.0f, 0.0f), 0xFFFFFFFF); SetBlendState(NoBlending, float4(0.0f, 0.0f, 0.0f, 0.0f), 0xFFFFFFFF);
@ -251,9 +251,9 @@ technique10 LumaEdgeDetection {
technique10 ColorEdgeDetection { technique10 ColorEdgeDetection {
pass ColorEdgeDetection { pass ColorEdgeDetection {
SetVertexShader(CompileShader(vs_4_0, DX11_SMAAEdgeDetectionVS())); SetVertexShader(CompileShader(vs_4_0, VSEdgeDetection()));
SetGeometryShader(NULL); SetGeometryShader(NULL);
SetPixelShader(CompileShader(PS_VERSION, DX11_SMAAColorEdgeDetectionPS())); SetPixelShader(CompileShader(PS_VERSION, PSColorEdgeDetection()));
SetDepthStencilState(DisableDepthReplaceStencil, 1); SetDepthStencilState(DisableDepthReplaceStencil, 1);
SetBlendState(NoBlending, float4(0.0f, 0.0f, 0.0f, 0.0f), 0xFFFFFFFF); SetBlendState(NoBlending, float4(0.0f, 0.0f, 0.0f, 0.0f), 0xFFFFFFFF);
@ -262,9 +262,9 @@ technique10 ColorEdgeDetection {
technique10 DepthEdgeDetection { technique10 DepthEdgeDetection {
pass DepthEdgeDetection { pass DepthEdgeDetection {
SetVertexShader(CompileShader(vs_4_0, DX11_SMAAEdgeDetectionVS())); SetVertexShader(CompileShader(vs_4_0, VSEdgeDetection()));
SetGeometryShader(NULL); SetGeometryShader(NULL);
SetPixelShader(CompileShader(PS_VERSION, DX11_SMAADepthEdgeDetectionPS())); SetPixelShader(CompileShader(PS_VERSION, PSDepthEdgeDetection()));
SetDepthStencilState(DisableDepthReplaceStencil, 1); SetDepthStencilState(DisableDepthReplaceStencil, 1);
SetBlendState(NoBlending, float4(0.0f, 0.0f, 0.0f, 0.0f), 0xFFFFFFFF); SetBlendState(NoBlending, float4(0.0f, 0.0f, 0.0f, 0.0f), 0xFFFFFFFF);
@ -276,9 +276,9 @@ technique10 DepthEdgeDetection {
*/ */
technique10 BlendingWeightCalculation { technique10 BlendingWeightCalculation {
pass BlendingWeightCalculation { pass BlendingWeightCalculation {
SetVertexShader(CompileShader(vs_4_0, DX11_SMAABlendingWeightCalculationVS())); SetVertexShader(CompileShader(vs_4_0, VSBlendingWeightCalculation()));
SetGeometryShader(NULL); SetGeometryShader(NULL);
SetPixelShader(CompileShader(PS_VERSION, DX11_SMAABlendingWeightCalculationPS())); SetPixelShader(CompileShader(PS_VERSION, PSBlendingWeightCalculation()));
SetDepthStencilState(DisableDepthUseStencil, 1); SetDepthStencilState(DisableDepthUseStencil, 1);
SetBlendState(NoBlending, float4(0.0f, 0.0f, 0.0f, 0.0f), 0xFFFFFFFF); SetBlendState(NoBlending, float4(0.0f, 0.0f, 0.0f, 0.0f), 0xFFFFFFFF);
@ -290,9 +290,9 @@ technique10 BlendingWeightCalculation {
*/ */
technique10 NeighborhoodBlending { technique10 NeighborhoodBlending {
pass NeighborhoodBlending { pass NeighborhoodBlending {
SetVertexShader(CompileShader(vs_4_0, DX11_SMAANeighborhoodBlendingVS())); SetVertexShader(CompileShader(vs_4_0, VSNeighborhoodBlending()));
SetGeometryShader(NULL); SetGeometryShader(NULL);
SetPixelShader(CompileShader(PS_VERSION, DX11_SMAANeighborhoodBlendingPS())); SetPixelShader(CompileShader(PS_VERSION, PSNeighborhoodBlending()));
SetDepthStencilState(DisableDepthStencil, 0); SetDepthStencilState(DisableDepthStencil, 0);
SetBlendState(Blend, float4(blendFactor, blendFactor, blendFactor, blendFactor), 0xFFFFFFFF); SetBlendState(Blend, float4(blendFactor, blendFactor, blendFactor, blendFactor), 0xFFFFFFFF);
@ -305,9 +305,9 @@ technique10 NeighborhoodBlending {
*/ */
technique10 Resolve { technique10 Resolve {
pass Resolve { pass Resolve {
SetVertexShader(CompileShader(vs_4_0, DX11_SMAAResolveVS())); SetVertexShader(CompileShader(vs_4_0, VSResolve()));
SetGeometryShader(NULL); SetGeometryShader(NULL);
SetPixelShader(CompileShader(PS_VERSION, DX11_SMAAResolvePS())); SetPixelShader(CompileShader(PS_VERSION, PSResolve()));
SetDepthStencilState(DisableDepthStencil, 0); SetDepthStencilState(DisableDepthStencil, 0);
SetBlendState(NoBlending, float4(0.0f, 0.0f, 0.0f, 0.0f), 0xFFFFFFFF); SetBlendState(NoBlending, float4(0.0f, 0.0f, 0.0f, 0.0f), 0xFFFFFFFF);
@ -319,9 +319,9 @@ technique10 Resolve {
*/ */
technique10 Separate { technique10 Separate {
pass Separate { pass Separate {
SetVertexShader(CompileShader(vs_4_0, DX11_SMAASeparateVS())); SetVertexShader(CompileShader(vs_4_0, VSSeparate()));
SetGeometryShader(NULL); SetGeometryShader(NULL);
SetPixelShader(CompileShader(PS_VERSION, DX11_SMAASeparatePS())); SetPixelShader(CompileShader(PS_VERSION, PSSeparate()));
SetDepthStencilState(DisableDepthStencil, 0); SetDepthStencilState(DisableDepthStencil, 0);
SetBlendState(NoBlending, float4(0.0f, 0.0f, 0.0f, 0.0f), 0xFFFFFFFF); SetBlendState(NoBlending, float4(0.0f, 0.0f, 0.0f, 0.0f), 0xFFFFFFFF);

View file

@ -88,7 +88,7 @@
<IntDir>$(Configuration)\</IntDir> <IntDir>$(Configuration)\</IntDir>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>true</LinkIncremental> <LinkIncremental>false</LinkIncremental>
<OutDir>$(SolutionDir)Build\$(Configuration)\Bin\x86\</OutDir> <OutDir>$(SolutionDir)Build\$(Configuration)\Bin\x86\</OutDir>
<ExecutablePath>$(ExecutablePath);$(DXSDK_DIR)Utilities\bin\x86</ExecutablePath> <ExecutablePath>$(ExecutablePath);$(DXSDK_DIR)Utilities\bin\x86</ExecutablePath>
<IncludePath>$(SolutionDir)Libs;$(SolutionDir)Libs\lua;$(SolutionDir)Libs\sol;$(SolutionDir)Libs\zlib;$(SolutionDir)Libs\spdlog;$(SolutionDir)Libs\ois;$(SolutionDir)Libs\bass;$(SolutionDir)Libs\srtparser;$(IncludePath)</IncludePath> <IncludePath>$(SolutionDir)Libs;$(SolutionDir)Libs\lua;$(SolutionDir)Libs\sol;$(SolutionDir)Libs\zlib;$(SolutionDir)Libs\spdlog;$(SolutionDir)Libs\ois;$(SolutionDir)Libs\bass;$(SolutionDir)Libs\srtparser;$(IncludePath)</IncludePath>
@ -100,7 +100,7 @@
<IncludePath>$(SolutionDir)Libs;$(SolutionDir)Libs\lua;$(SolutionDir)Libs\sol;$(SolutionDir)Libs\zlib;$(SolutionDir)Libs\spdlog;$(SolutionDir)Libs\ois;$(SolutionDir)Libs\bass;$(SolutionDir)Libs\srtparser;$(IncludePath)</IncludePath> <IncludePath>$(SolutionDir)Libs;$(SolutionDir)Libs\lua;$(SolutionDir)Libs\sol;$(SolutionDir)Libs\zlib;$(SolutionDir)Libs\spdlog;$(SolutionDir)Libs\ois;$(SolutionDir)Libs\bass;$(SolutionDir)Libs\srtparser;$(IncludePath)</IncludePath>
<LibraryPath>$(LibraryPath);$(DXSDK_DIR)Lib\x64;$(SolutionDir)Libs\spdlog\x64;$(SolutionDir)Libs\lua\x64;$(SolutionDir)Libs\zlib\x64;$(SolutionDir)Libs\bass\x64;$(SolutionDir)Libs\ois\x64</LibraryPath> <LibraryPath>$(LibraryPath);$(DXSDK_DIR)Lib\x64;$(SolutionDir)Libs\spdlog\x64;$(SolutionDir)Libs\lua\x64;$(SolutionDir)Libs\zlib\x64;$(SolutionDir)Libs\bass\x64;$(SolutionDir)Libs\ois\x64</LibraryPath>
<TargetExt>.exe</TargetExt> <TargetExt>.exe</TargetExt>
<LinkIncremental>true</LinkIncremental> <LinkIncremental>false</LinkIncremental>
<OutDir>$(SolutionDir)Build\$(Configuration)\Bin\x64\</OutDir> <OutDir>$(SolutionDir)Build\$(Configuration)\Bin\x64\</OutDir>
<IntDir>$(Configuration)\</IntDir> <IntDir>$(Configuration)\</IntDir>
<TargetName>$(ProjectName)</TargetName> <TargetName>$(ProjectName)</TargetName>
@ -321,7 +321,7 @@ if not exist "%ScriptsDir%\Strings.lua" xcopy /Y "$(SolutionDir)Scripts\Strings.
<ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
<LargeAddressAware>true</LargeAddressAware> <LargeAddressAware>true</LargeAddressAware>
<TargetMachine>MachineX86</TargetMachine> <TargetMachine>MachineX86</TargetMachine>
<LinkTimeCodeGeneration>Default</LinkTimeCodeGeneration> <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
</Link> </Link>
<PostBuildEvent> <PostBuildEvent>
<Command>del "$(TargetDir)*.pdb" /q <Command>del "$(TargetDir)*.pdb" /q
@ -400,7 +400,7 @@ if not exist "%ScriptsDir%\Strings.lua" xcopy /Y "$(SolutionDir)Scripts\Strings.
<AdditionalDependencies>comctl32.lib;lua53.lib;bass.lib;bassmix.lib;bass_fx.lib;D3DCompiler.lib;dxgi.lib;dxguid.lib;d3d11.lib;version.lib;zlib.lib;spdlog.lib;OIS.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>comctl32.lib;lua53.lib;bass.lib;bassmix.lib;bass_fx.lib;D3DCompiler.lib;dxgi.lib;dxguid.lib;d3d11.lib;version.lib;zlib.lib;spdlog.lib;OIS.lib;%(AdditionalDependencies)</AdditionalDependencies>
<ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
<LargeAddressAware>true</LargeAddressAware> <LargeAddressAware>true</LargeAddressAware>
<LinkTimeCodeGeneration>Default</LinkTimeCodeGeneration> <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
</Link> </Link>
<PostBuildEvent> <PostBuildEvent>
<Command>del "$(TargetDir)*.pdb" /q <Command>del "$(TargetDir)*.pdb" /q
@ -854,6 +854,7 @@ if not exist "%ScriptsDir%\Strings.lua" xcopy /Y "$(SolutionDir)Scripts\Strings.
<ClInclude Include="Renderer\Structures\RendererRoom.h" /> <ClInclude Include="Renderer\Structures\RendererRoom.h" />
<ClInclude Include="Renderer\Structures\RendererRoomAmbientMap.h" /> <ClInclude Include="Renderer\Structures\RendererRoomAmbientMap.h" />
<ClInclude Include="Renderer\Structures\RendererRoomNode.h" /> <ClInclude Include="Renderer\Structures\RendererRoomNode.h" />
<ClInclude Include="Renderer\Structures\RendererShader.h" />
<ClInclude Include="Renderer\Structures\RendererSortableObject.h" /> <ClInclude Include="Renderer\Structures\RendererSortableObject.h" />
<ClInclude Include="Renderer\Structures\RendererSprite.h" /> <ClInclude Include="Renderer\Structures\RendererSprite.h" />
<ClInclude Include="Renderer\Structures\RendererSprite2D.h" /> <ClInclude Include="Renderer\Structures\RendererSprite2D.h" />