From db282dea858f122ea9de516d5297c71e6e60c975 Mon Sep 17 00:00:00 2001 From: hzqst <113660872@qq.com> Date: Tue, 26 Dec 2023 00:49:34 +0800 Subject: [PATCH] update studio shaders. --- .../renderer/shader/studio_shader.fsh | 65 ++++++++++++++++--- .../renderer/shader/studio_shader.vsh | 15 ++--- Plugins/Renderer/gl_hooks.cpp | 2 +- Plugins/Renderer/gl_studio.cpp | 4 +- Plugins/Renderer/gl_studio.h | 2 +- Plugins/Renderer/gl_wsurf.cpp | 1 + 6 files changed, 67 insertions(+), 22 deletions(-) diff --git a/Build/svencoop/renderer/shader/studio_shader.fsh b/Build/svencoop/renderer/shader/studio_shader.fsh index c04a041b..68c9c801 100644 --- a/Build/svencoop/renderer/shader/studio_shader.fsh +++ b/Build/svencoop/renderer/shader/studio_shader.fsh @@ -37,8 +37,8 @@ in vec2 v_texcoord; in vec4 v_projpos; #if defined(STUDIO_NF_CELSHADE) -in mat4 v_bonematrix; -in mat4 v_invbonematrix; +in mat3 v_rotmatrix; +//in mat3 v_invrotmatrix; #endif layout(location = 0) out vec4 out_Diffuse; @@ -219,6 +219,29 @@ float StrandSpecular(vec3 T, vec3 H, float exponent) return dirAtten * pow(sinTH, exponent); } +vec3 ProjectVectorOntoPlane(vec3 v, vec3 normal) { + float dotProduct = dot(v, normal); + vec3 projectionOntoNormal = dotProduct * normal; + vec3 projectionOntoPlane = v - projectionOntoNormal; + return normalize(projectionOntoPlane); +} + +vec3 ExtractUpVector(mat3 rotationMatrix) { + return rotationMatrix[0]; +} + +vec3 ExtractForwardVector(mat3 rotationMatrix) { + return rotationMatrix[1]; +} + +vec3 ExtractRightVector(mat3 rotationMatrix) { + return -rotationMatrix[2]; +} + +mat3 ExtractRotationMatrix(mat4 transform) { + return mat3(transform[0].xyz, transform[1].xyz, transform[2].xyz); +} + vec3 R_StudioCelShade(vec3 v_color, vec3 normalWS, vec3 lightdirWS, float specularMask) { vec3 N = normalWS; @@ -235,20 +258,42 @@ vec3 R_StudioCelShade(vec3 v_color, vec3 normalWS, vec3 lightdirWS, float specul vec3 BiT = cross(N, UP); vec3 T = cross(N, BiT); - vec4 lightdirLS = v_invbonematrix * vec4(L, 0.0); - +#if 1 + #if defined(STUDIO_NF_CELSHADE_FACE) - lightdirLS.z *= 0.001; + L.z *= 0.0001; #else - lightdirLS.z *= 0.01; + L.z *= 0.01; +#endif + + L = normalize(L); + + vec3 vecForward = ExtractForwardVector(v_rotmatrix); + vec3 vecUp = ExtractUpVector(v_rotmatrix); + vec3 vecBack = -vecForward; + + L = ProjectVectorOntoPlane(L, vecUp); + + vec3 L2 = normalize(L); + + float flFaceUp = abs(vecForward.z); + flFaceUp = pow(flFaceUp, 10.0); + + L = mix(L2, vecBack, flFaceUp); + #endif - lightdirLS.xyz = normalize(lightdirLS.xyz); - lightdirLS.w = 0.0; +#if 0 + +#if defined(STUDIO_NF_CELSHADE_FACE) + L.z = 0; +#else + L.z *= 0.01; +#endif - vec4 lightdirWS_new = v_bonematrix * lightdirLS; + L = normalize(L); - L = lightdirWS_new.xyz; +#endif float NoL = dot(-N,L); diff --git a/Build/svencoop/renderer/shader/studio_shader.vsh b/Build/svencoop/renderer/shader/studio_shader.vsh index dddd7155..ff3602c8 100644 --- a/Build/svencoop/renderer/shader/studio_shader.vsh +++ b/Build/svencoop/renderer/shader/studio_shader.vsh @@ -16,8 +16,8 @@ out vec2 v_texcoord; out vec4 v_projpos; #if defined(STUDIO_NF_CELSHADE) -out mat4 v_bonematrix; -out mat4 v_invbonematrix; +out mat3 v_rotmatrix; +//out mat3 v_invrotmatrix; #endif void main(void) @@ -117,13 +117,12 @@ void main(void) #if defined(STUDIO_NF_CELSHADE) - v_bonematrix = mat4( - vec4(vertbone_matrix[0][0], vertbone_matrix[0][1], vertbone_matrix[0][2], 0.0), - vec4(vertbone_matrix[1][0], vertbone_matrix[1][1], vertbone_matrix[1][2], 0.0), - vec4(vertbone_matrix[2][0], vertbone_matrix[2][1], vertbone_matrix[2][2], 0.0), - vec4(vertbone_matrix[0][3], vertbone_matrix[1][3], vertbone_matrix[2][3], 1.0)); + v_rotmatrix = mat3( + vec3(vertbone_matrix[0][0], vertbone_matrix[1][0], vertbone_matrix[2][0]), + vec3(vertbone_matrix[0][1], vertbone_matrix[1][1], vertbone_matrix[2][1]), + vec3(vertbone_matrix[0][2], vertbone_matrix[1][2], vertbone_matrix[2][2])); - v_invbonematrix = inverse(v_bonematrix); + //v_invrotmatrix = inverse(v_rotmatrix); #endif diff --git a/Plugins/Renderer/gl_hooks.cpp b/Plugins/Renderer/gl_hooks.cpp index d783f3a3..67954eb2 100644 --- a/Plugins/Renderer/gl_hooks.cpp +++ b/Plugins/Renderer/gl_hooks.cpp @@ -5615,7 +5615,7 @@ void R_FillAddress(void) if (g_iEngineType == ENGINE_SVENGINE) { #define VERTICAL_FOV_SIG_SVENGINE "\x50\xFF\x15\x2A\x2A\x2A\x2A\x83\x3D\x2A\x2A\x2A\x2A\x00" - addr = (DWORD)Search_Pattern_From_Size((void*)gPrivateFuncs.R_SetupGL, 0x120, VERTICAL_FOV_SIG_SVENGINE, sizeof(VERTICAL_FOV_SIG_SVENGINE) - 1); + addr = (DWORD)Search_Pattern_From_Size((void*)gPrivateFuncs.R_SetupGL, 0x120, VERTICAL_FOV_SIG_SVENGINE); Sig_AddrNotFound(vertical_fov_SvEngine); vertical_fov_SvEngine = *(decltype(vertical_fov_SvEngine)*)(addr + 9); } diff --git a/Plugins/Renderer/gl_studio.cpp b/Plugins/Renderer/gl_studio.cpp index 55ddbae8..7b0b6cdb 100644 --- a/Plugins/Renderer/gl_studio.cpp +++ b/Plugins/Renderer/gl_studio.cpp @@ -52,7 +52,7 @@ float* g_ChromeOrigin = NULL; int* r_ambientlight = NULL; float* r_shadelight = NULL; vec3_t* r_blightvec = NULL; -float* r_plightvec = NULL; +vec3_t* r_plightvec = NULL; float* r_colormix = NULL; void* tmp_palette = NULL; int* r_smodels_total = NULL; @@ -1571,7 +1571,7 @@ void R_StudioDrawVBOBegin(studio_vbo_t* VBOData) if (r_studio_legacy_elight->value > 0) { - StudioUBO.r_numelight = *numlight; + StudioUBO.r_numelight = (*numlight); for (int i = 0; i < StudioUBO.r_numelight; ++i) { diff --git a/Plugins/Renderer/gl_studio.h b/Plugins/Renderer/gl_studio.h index 6f9b66e0..8c43ad56 100644 --- a/Plugins/Renderer/gl_studio.h +++ b/Plugins/Renderer/gl_studio.h @@ -317,7 +317,7 @@ extern float *g_ChromeOrigin; extern int *r_ambientlight; extern float *r_shadelight; extern vec3_t *r_blightvec; -extern float *r_plightvec; +extern vec3_t *r_plightvec; extern float *r_colormix; extern int *r_smodels_total; extern int *r_amodels_drawn; diff --git a/Plugins/Renderer/gl_wsurf.cpp b/Plugins/Renderer/gl_wsurf.cpp index 99c13d07..36717a44 100644 --- a/Plugins/Renderer/gl_wsurf.cpp +++ b/Plugins/Renderer/gl_wsurf.cpp @@ -4258,6 +4258,7 @@ void R_DrawWorld(void) }; memcpy(r_entity_matrix, r_identity_matrix, sizeof(r_entity_matrix)); + r_entity_color[0] = 1; r_entity_color[1] = 1; r_entity_color[2] = 1;