From 333bc486d67faddfee45d24e34b3c2522b406bc6 Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Mon, 8 Jan 2024 18:00:04 +0100 Subject: [PATCH] Implemented typical PSX style vertex jittering --- neo/renderer/RenderBackend.cpp | 18 ++++++++++++++++++ neo/renderer/RenderCommon.h | 2 ++ neo/renderer/RenderProgs.h | 3 +++ neo/renderer/RenderSystem_init.cpp | 2 ++ neo/shaders/builtin/color.vs.hlsl | 2 ++ neo/shaders/builtin/depth.vs.hlsl | 3 +++ neo/shaders/builtin/fog/blendLight.vs.hlsl | 2 ++ neo/shaders/builtin/fog/fog.vs.hlsl | 2 ++ neo/shaders/builtin/gbuffer.vs.hlsl | 2 ++ .../builtin/legacy/bumpyenvironment.vs.hlsl | 2 ++ .../builtin/legacy/environment.vs.hlsl | 2 ++ neo/shaders/builtin/legacy/skybox.vs.hlsl | 2 ++ .../lighting/ambient_lightgrid_IBL.vs.hlsl | 2 ++ .../lighting/ambient_lighting_IBL.vs.hlsl | 2 ++ .../builtin/lighting/interaction.vs.hlsl | 2 ++ .../lighting/interactionAmbient.vs.hlsl | 2 ++ .../builtin/lighting/interactionSM.vs.hlsl | 2 ++ neo/shaders/builtin/texture.vs.hlsl | 2 ++ neo/shaders/builtin/texture_color.vs.hlsl | 4 ++++ .../builtin/texture_color_texgen.vs.hlsl | 2 ++ neo/shaders/builtin/vertex_color.vs.hlsl | 2 ++ neo/shaders/builtin/video/bink.vs.hlsl | 2 ++ neo/shaders/global_inc.hlsl | 19 +++++++++++++++++++ 23 files changed, 83 insertions(+) diff --git a/neo/renderer/RenderBackend.cpp b/neo/renderer/RenderBackend.cpp index 2ce34268..5583b128 100644 --- a/neo/renderer/RenderBackend.cpp +++ b/neo/renderer/RenderBackend.cpp @@ -5578,6 +5578,24 @@ void idRenderBackend::DrawViewInternal( const viewDef_t* _viewDef, const int ste float projMatrixTranspose[16]; R_MatrixTranspose( viewDef->projectionMatrix, projMatrixTranspose ); SetVertexParms( RENDERPARM_PROJMATRIX_X, projMatrixTranspose, 4 ); + + // PSX jitter parms + if( !_viewDef->is2Dgui ) + { + parm[0] = r_psxVertexJitter.GetFloat(); + parm[1] = 0; + parm[2] = 0; + parm[3] = 0; + } + else + { + parm[0] = 0; + parm[1] = 0; + parm[2] = 0; + parm[3] = 0; + } + + SetVertexParm( RENDERPARM_PSX_DISTORTIONS, parm ); } //------------------------------------------------- diff --git a/neo/renderer/RenderCommon.h b/neo/renderer/RenderCommon.h index d797a631..42bdc23e 100644 --- a/neo/renderer/RenderCommon.h +++ b/neo/renderer/RenderCommon.h @@ -1276,6 +1276,8 @@ extern idCVar r_retroDitherScale; extern idCVar r_renderMode; extern idCVar image_pixelLook; + +extern idCVar r_psxVertexJitter; // RB end /* diff --git a/neo/renderer/RenderProgs.h b/neo/renderer/RenderProgs.h index 25f44899..a9bfc0af 100644 --- a/neo/renderer/RenderProgs.h +++ b/neo/renderer/RenderProgs.h @@ -151,6 +151,9 @@ enum renderParm_t RENDERPARM_GLOBALLIGHTORIGIN, RENDERPARM_JITTERTEXSCALE, RENDERPARM_JITTERTEXOFFSET, + + RENDERPARM_PSX_DISTORTIONS, + RENDERPARM_CASCADEDISTANCES, RENDERPARM_SHADOW_MATRIX_0_X, // rpShadowMatrices[6 * 4] diff --git a/neo/renderer/RenderSystem_init.cpp b/neo/renderer/RenderSystem_init.cpp index 94b76a1b..841adc9b 100644 --- a/neo/renderer/RenderSystem_init.cpp +++ b/neo/renderer/RenderSystem_init.cpp @@ -303,6 +303,8 @@ idCVar r_crtVignette( "r_crtVignette", "0.8", CVAR_RENDERER | CVAR_FLOAT | CVAR_ idCVar r_retroDitherScale( "r_retroDitherScale", "0.3", CVAR_RENDERER | CVAR_FLOAT | CVAR_NEW, "" ); idCVar r_renderMode( "r_renderMode", "0", CVAR_RENDERER | CVAR_ARCHIVE | CVAR_INTEGER | CVAR_NEW, "0 = Doom, 1 = Commodore 64, 2 = Commodore 64 Highres, 3 = Amstrad CPC 6128, 4 = Amstrad CPC 6128 Highres, 5 = Sega Genesis, 6 = Sega Genesis Highres, 7 = Sony PSX", 0, 7 ); + +idCVar r_psxVertexJitter( "r_psxVertexJitter", "0.5", CVAR_RENDERER | CVAR_FLOAT | CVAR_NEW, "" ); // RB end const char* fileExten[4] = { "tga", "png", "jpg", "exr" }; diff --git a/neo/shaders/builtin/color.vs.hlsl b/neo/shaders/builtin/color.vs.hlsl index e7525599..b4b36aa6 100644 --- a/neo/shaders/builtin/color.vs.hlsl +++ b/neo/shaders/builtin/color.vs.hlsl @@ -101,4 +101,6 @@ void main( VS_IN vertex, out VS_OUT result ) result.position.z = dot4( vertex.position, rpMVPmatrixZ ); result.position.w = dot4( vertex.position, rpMVPmatrixW ); #endif + + result.position.xyz = psxVertexJitter( result.position ); } \ No newline at end of file diff --git a/neo/shaders/builtin/depth.vs.hlsl b/neo/shaders/builtin/depth.vs.hlsl index f7a2b3ea..cf3a0e9c 100644 --- a/neo/shaders/builtin/depth.vs.hlsl +++ b/neo/shaders/builtin/depth.vs.hlsl @@ -94,9 +94,12 @@ void main( VS_IN vertex, out VS_OUT result ) result.position.z = dot4( modelPosition, rpMVPmatrixZ ); result.position.w = dot4( modelPosition, rpMVPmatrixW ); #else + result.position.x = dot4( vertex.position, rpMVPmatrixX ); result.position.y = dot4( vertex.position, rpMVPmatrixY ); result.position.z = dot4( vertex.position, rpMVPmatrixZ ); result.position.w = dot4( vertex.position, rpMVPmatrixW ); #endif + + result.position.xyz = psxVertexJitter( result.position ); } \ No newline at end of file diff --git a/neo/shaders/builtin/fog/blendLight.vs.hlsl b/neo/shaders/builtin/fog/blendLight.vs.hlsl index fbff331a..29eecec0 100644 --- a/neo/shaders/builtin/fog/blendLight.vs.hlsl +++ b/neo/shaders/builtin/fog/blendLight.vs.hlsl @@ -120,4 +120,6 @@ void main( VS_IN vertex, out VS_OUT result ) result.texcoord1.x = dot4( vertex.position, rpTexGen1S ); result.texcoord1.y = 0.5; #endif + + result.position.xyz = psxVertexJitter( result.position ); } diff --git a/neo/shaders/builtin/fog/fog.vs.hlsl b/neo/shaders/builtin/fog/fog.vs.hlsl index 7118650e..ff4ae34a 100644 --- a/neo/shaders/builtin/fog/fog.vs.hlsl +++ b/neo/shaders/builtin/fog/fog.vs.hlsl @@ -116,4 +116,6 @@ void main( VS_IN vertex, out VS_OUT result ) result.texcoord1.x = dot4( vertex.position, rpTexGen1S ); result.texcoord1.y = dot4( vertex.position, rpTexGen1T ); #endif + + result.position.xyz = psxVertexJitter( result.position ); } diff --git a/neo/shaders/builtin/gbuffer.vs.hlsl b/neo/shaders/builtin/gbuffer.vs.hlsl index ed8271a4..71749153 100644 --- a/neo/shaders/builtin/gbuffer.vs.hlsl +++ b/neo/shaders/builtin/gbuffer.vs.hlsl @@ -130,6 +130,8 @@ void main( VS_IN vertex, out VS_OUT result ) result.position.z = dot4( modelPosition, rpMVPmatrixZ ); result.position.w = dot4( modelPosition, rpMVPmatrixW ); + result.position.xyz = psxVertexJitter( result.position ); + // textures 0 takes the base coordinates by the texture matrix result.texcoord0.x = dot4( vertex.texcoord.xy, rpBumpMatrixS ); result.texcoord0.y = dot4( vertex.texcoord.xy, rpBumpMatrixT ); diff --git a/neo/shaders/builtin/legacy/bumpyenvironment.vs.hlsl b/neo/shaders/builtin/legacy/bumpyenvironment.vs.hlsl index 803e2713..f0536507 100644 --- a/neo/shaders/builtin/legacy/bumpyenvironment.vs.hlsl +++ b/neo/shaders/builtin/legacy/bumpyenvironment.vs.hlsl @@ -173,5 +173,7 @@ void main( VS_IN vertex, out VS_OUT result ) #endif + result.position.xyz = psxVertexJitter( result.position ); + result.color = rpColor; } diff --git a/neo/shaders/builtin/legacy/environment.vs.hlsl b/neo/shaders/builtin/legacy/environment.vs.hlsl index 4cb9f31c..0901145d 100644 --- a/neo/shaders/builtin/legacy/environment.vs.hlsl +++ b/neo/shaders/builtin/legacy/environment.vs.hlsl @@ -121,5 +121,7 @@ void main( VS_IN vertex, out VS_OUT result ) result.texcoord1 = vNormal.xyz; #endif + result.position.xyz = psxVertexJitter( result.position ); + result.color = sRGBAToLinearRGBA( rpColor ); } diff --git a/neo/shaders/builtin/legacy/skybox.vs.hlsl b/neo/shaders/builtin/legacy/skybox.vs.hlsl index b642b04d..37d2159c 100644 --- a/neo/shaders/builtin/legacy/skybox.vs.hlsl +++ b/neo/shaders/builtin/legacy/skybox.vs.hlsl @@ -54,6 +54,8 @@ void main( VS_IN vertex, out VS_OUT result ) result.position.z = dot4( vertex.position, rpMVPmatrixZ ); result.position.w = dot4( vertex.position, rpMVPmatrixW ); + result.position.xyz = psxVertexJitter( result.position ); + result.texcoord0 = vertex.position.xyz - rpLocalViewOrigin.xyz; result.color = ( swizzleColor( vertex.color ) * rpVertexColorModulate ) + rpVertexColorAdd; diff --git a/neo/shaders/builtin/lighting/ambient_lightgrid_IBL.vs.hlsl b/neo/shaders/builtin/lighting/ambient_lightgrid_IBL.vs.hlsl index c1246f1f..49e98598 100644 --- a/neo/shaders/builtin/lighting/ambient_lightgrid_IBL.vs.hlsl +++ b/neo/shaders/builtin/lighting/ambient_lightgrid_IBL.vs.hlsl @@ -135,6 +135,8 @@ void main( VS_IN vertex, out VS_OUT result ) result.position.z = dot4( modelPosition, rpMVPmatrixZ ); result.position.w = dot4( modelPosition, rpMVPmatrixW ); + result.position.xyz = psxVertexJitter( result.position ); + float4 defaultTexCoord = float4( 0.0f, 0.5f, 0.0f, 1.0f ); //-------------------------------------------------------------- diff --git a/neo/shaders/builtin/lighting/ambient_lighting_IBL.vs.hlsl b/neo/shaders/builtin/lighting/ambient_lighting_IBL.vs.hlsl index 28befa53..859ce627 100644 --- a/neo/shaders/builtin/lighting/ambient_lighting_IBL.vs.hlsl +++ b/neo/shaders/builtin/lighting/ambient_lighting_IBL.vs.hlsl @@ -135,6 +135,8 @@ void main( VS_IN vertex, out VS_OUT result ) result.position.z = dot4( modelPosition, rpMVPmatrixZ ); result.position.w = dot4( modelPosition, rpMVPmatrixW ); + result.position.xyz = psxVertexJitter( result.position ); + float4 defaultTexCoord = float4( 0.0f, 0.5f, 0.0f, 1.0f ); //calculate vector to light diff --git a/neo/shaders/builtin/lighting/interaction.vs.hlsl b/neo/shaders/builtin/lighting/interaction.vs.hlsl index be528720..ff580fe4 100644 --- a/neo/shaders/builtin/lighting/interaction.vs.hlsl +++ b/neo/shaders/builtin/lighting/interaction.vs.hlsl @@ -133,6 +133,8 @@ void main( VS_IN vertex, out VS_OUT result ) result.position.z = dot4( modelPosition, rpMVPmatrixZ ); result.position.w = dot4( modelPosition, rpMVPmatrixW ); + result.position.xyz = psxVertexJitter( result.position ); + float4 defaultTexCoord = float4( 0.0f, 0.5f, 0.0f, 1.0f ); //calculate vector to light diff --git a/neo/shaders/builtin/lighting/interactionAmbient.vs.hlsl b/neo/shaders/builtin/lighting/interactionAmbient.vs.hlsl index 7682eab2..ec807422 100644 --- a/neo/shaders/builtin/lighting/interactionAmbient.vs.hlsl +++ b/neo/shaders/builtin/lighting/interactionAmbient.vs.hlsl @@ -132,6 +132,8 @@ void main( VS_IN vertex, out VS_OUT result ) result.position.z = dot4( modelPosition, rpMVPmatrixZ ); result.position.w = dot4( modelPosition, rpMVPmatrixW ); + result.position.xyz = psxVertexJitter( result.position ); + float4 defaultTexCoord = float4( 0.0f, 0.5f, 0.0f, 1.0f ); //calculate vector to light diff --git a/neo/shaders/builtin/lighting/interactionSM.vs.hlsl b/neo/shaders/builtin/lighting/interactionSM.vs.hlsl index 1e3f1bad..ce1af3de 100644 --- a/neo/shaders/builtin/lighting/interactionSM.vs.hlsl +++ b/neo/shaders/builtin/lighting/interactionSM.vs.hlsl @@ -136,6 +136,8 @@ void main( VS_IN vertex, out VS_OUT result ) result.position.z = dot4( modelPosition, rpMVPmatrixZ ); result.position.w = dot4( modelPosition, rpMVPmatrixW ); + result.position.xyz = psxVertexJitter( result.position ); + float4 defaultTexCoord = float4( 0.0f, 0.5f, 0.0f, 1.0f ); //calculate vector to light diff --git a/neo/shaders/builtin/texture.vs.hlsl b/neo/shaders/builtin/texture.vs.hlsl index 6491a155..c7951699 100644 --- a/neo/shaders/builtin/texture.vs.hlsl +++ b/neo/shaders/builtin/texture.vs.hlsl @@ -53,6 +53,8 @@ void main( VS_IN vertex, out VS_OUT result ) result.position.z = dot4( vertex.position, rpMVPmatrixZ ); result.position.w = dot4( vertex.position, rpMVPmatrixW ); + result.position.xyz = psxVertexJitter( result.position ); + // compute oldschool texgen or multiply by texture matrix BRANCH if( rpTexGen0Enabled.x > 0.0 ) { diff --git a/neo/shaders/builtin/texture_color.vs.hlsl b/neo/shaders/builtin/texture_color.vs.hlsl index 7451a5af..6e3c316a 100644 --- a/neo/shaders/builtin/texture_color.vs.hlsl +++ b/neo/shaders/builtin/texture_color.vs.hlsl @@ -91,6 +91,8 @@ void main( VS_IN vertex, out VS_OUT result ) modelPosition.z = dot4( matZ, vertex.position ); modelPosition.w = 1.0; + modelPosition.xyz = psxVertexJitter( modelPosition ); + result.position.x = dot4( modelPosition, rpMVPmatrixX ); result.position.y = dot4( modelPosition, rpMVPmatrixY ); result.position.z = dot4( modelPosition, rpMVPmatrixZ ); @@ -114,6 +116,8 @@ void main( VS_IN vertex, out VS_OUT result ) result.position.z = dot4( vertex.position, rpMVPmatrixZ ); result.position.w = dot4( vertex.position, rpMVPmatrixW ); + result.position.xyz = psxVertexJitter( result.position ); + // Compute oldschool texgen or multiply by texture matrix BRANCH if( rpTexGen0Enabled.x > 0.0 ) { diff --git a/neo/shaders/builtin/texture_color_texgen.vs.hlsl b/neo/shaders/builtin/texture_color_texgen.vs.hlsl index a5f8b619..b5b4c961 100644 --- a/neo/shaders/builtin/texture_color_texgen.vs.hlsl +++ b/neo/shaders/builtin/texture_color_texgen.vs.hlsl @@ -55,6 +55,8 @@ void main( VS_IN vertex, out VS_OUT result ) result.position.z = dot4( vertex.position, rpMVPmatrixZ ); result.position.w = dot4( vertex.position, rpMVPmatrixW ); + result.position.xyz = psxVertexJitter( result.position ); + float4 tc0; tc0.x = dot4( vertex.position, rpTexGen0S ); tc0.y = dot4( vertex.position, rpTexGen0T ); diff --git a/neo/shaders/builtin/vertex_color.vs.hlsl b/neo/shaders/builtin/vertex_color.vs.hlsl index 6cbea33b..ff28212e 100644 --- a/neo/shaders/builtin/vertex_color.vs.hlsl +++ b/neo/shaders/builtin/vertex_color.vs.hlsl @@ -55,5 +55,7 @@ void main( VS_IN vertex, out VS_OUT result ) result.position.z = dot4( vertex.position, rpMVPmatrixZ ); result.position.w = dot4( vertex.position, rpMVPmatrixW ); + result.position.xyz = psxVertexJitter( result.position ); + result.color = swizzleColor( vertex.color ); } \ No newline at end of file diff --git a/neo/shaders/builtin/video/bink.vs.hlsl b/neo/shaders/builtin/video/bink.vs.hlsl index cd6b347e..d74ddf0a 100644 --- a/neo/shaders/builtin/video/bink.vs.hlsl +++ b/neo/shaders/builtin/video/bink.vs.hlsl @@ -53,5 +53,7 @@ void main( VS_IN vertex, out VS_OUT result ) result.position.z = dot4( vertex.position, rpMVPmatrixZ ); result.position.w = dot4( vertex.position, rpMVPmatrixW ); + result.position.xyz = psxVertexJitter( result.position ); + result.texcoord0 = vertex.texcoord; } \ No newline at end of file diff --git a/neo/shaders/global_inc.hlsl b/neo/shaders/global_inc.hlsl index 7a769262..f614b7f1 100644 --- a/neo/shaders/global_inc.hlsl +++ b/neo/shaders/global_inc.hlsl @@ -107,6 +107,7 @@ cbuffer globals : register( b0 VK_DESCRIPTOR_SET( 0 ) ) float4 rpGlobalLightOrigin; float4 rpJitterTexScale; float4 rpJitterTexOffset; + float4 rpPSXDistortions; float4 rpCascadeDistances; float4 rpShadowMatrices[6 * 4]; @@ -491,6 +492,24 @@ static float2 vposToScreenPosTexCoord( float2 vpos ) return vpos.xy * rpWindowCoord.xy; } +static float3 psxVertexJitter( float4 spos ) +{ + float jitterScale = rpPSXDistortions.x; + if( jitterScale > 0.0 ) + { + // snap to vertex to a pixel position on a lower grid + float3 vertex = spos.xyz / spos.w; + //float2 resolution = float2( 320, 240 ); // TODO 320x240 * jitterScale + float2 resolution = float2( 160, 120 ); + vertex.xy = floor( resolution * vertex.xy ) / resolution; + vertex *= spos.w; + + return vertex; + } + + return spos.xyz; +} + #define BRANCH #define IFANY