From 3740c55decb0a24cef53a76aa1c485ba7f7f4e88 Mon Sep 17 00:00:00 2001 From: SmileTheory Date: Thu, 20 Feb 2014 17:01:50 -0800 Subject: [PATCH 01/10] OpenGL2: Remove and force r_softOverbright. --- code/renderergl2/tr_image.c | 41 +++++-------------------------------- code/renderergl2/tr_init.c | 4 ---- code/renderergl2/tr_local.h | 2 -- code/renderergl2/tr_shade.c | 2 +- code/renderergl2/tr_sky.c | 2 +- 5 files changed, 7 insertions(+), 44 deletions(-) diff --git a/code/renderergl2/tr_image.c b/code/renderergl2/tr_image.c index 243d27df..bd20a7fc 100644 --- a/code/renderergl2/tr_image.c +++ b/code/renderergl2/tr_image.c @@ -3013,37 +3013,14 @@ void R_SetColorMappings( void ) { int i, j; float g; int inf; - int shift; // setup the overbright lighting tr.overbrightBits = r_overBrightBits->integer; - if ( !glConfig.deviceSupportsGamma ) { - tr.overbrightBits = 0; // need hardware gamma for overbright - } - // never overbright in windowed mode without soft overbright - if ( !glConfig.isFullscreen && !r_softOverbright->integer ) - { - tr.overbrightBits = 0; - } - - // never overbright with tonemapping - if ( r_toneMap->integer && r_hdr->integer ) - { - tr.overbrightBits = 0; - } - - // allow 2 overbright bits in 24 bit, but only 1 in 16 bit - if ( glConfig.colorBits > 16 ) { - if ( tr.overbrightBits > 2 ) { - tr.overbrightBits = 2; - } - } else { - if ( tr.overbrightBits > 1 ) { - tr.overbrightBits = 1; - } - } - if ( tr.overbrightBits < 0 ) { + // allow 2 overbright bits + if ( tr.overbrightBits > 2 ) { + tr.overbrightBits = 2; + } else if ( tr.overbrightBits < 0 ) { tr.overbrightBits = 0; } @@ -3063,14 +3040,6 @@ void R_SetColorMappings( void ) { g = r_gamma->value; - shift = tr.overbrightBits; - - // no shift with soft overbright - if (r_softOverbright->integer) - { - shift = 0; - } - for ( i = 0; i < 256; i++ ) { int i2; @@ -3088,7 +3057,7 @@ void R_SetColorMappings( void ) { } else { inf = 255 * pow ( i2/255.0f, 1.0f / g ) + 0.5f; } - inf <<= shift; + if (inf < 0) { inf = 0; } diff --git a/code/renderergl2/tr_init.c b/code/renderergl2/tr_init.c index 84bbeba2..4fb1d99e 100644 --- a/code/renderergl2/tr_init.c +++ b/code/renderergl2/tr_init.c @@ -108,8 +108,6 @@ cvar_t *r_mergeLeafSurfaces; cvar_t *r_cameraExposure; -cvar_t *r_softOverbright; - cvar_t *r_hdr; cvar_t *r_floatLightmap; cvar_t *r_postProcess; @@ -1161,8 +1159,6 @@ void R_Register( void ) r_greyscale = ri.Cvar_Get("r_greyscale", "0", CVAR_ARCHIVE | CVAR_LATCH); ri.Cvar_CheckRange(r_greyscale, 0, 1, qfalse); - r_softOverbright = ri.Cvar_Get( "r_softOverbright", "1", CVAR_ARCHIVE | CVAR_LATCH ); - r_hdr = ri.Cvar_Get( "r_hdr", "1", CVAR_ARCHIVE | CVAR_LATCH ); r_floatLightmap = ri.Cvar_Get( "r_floatLightmap", "0", CVAR_ARCHIVE | CVAR_LATCH ); r_postProcess = ri.Cvar_Get( "r_postProcess", "1", CVAR_ARCHIVE ); diff --git a/code/renderergl2/tr_local.h b/code/renderergl2/tr_local.h index 12fa10ad..d0448507 100644 --- a/code/renderergl2/tr_local.h +++ b/code/renderergl2/tr_local.h @@ -1765,8 +1765,6 @@ extern cvar_t *r_anaglyphMode; extern cvar_t *r_mergeMultidraws; extern cvar_t *r_mergeLeafSurfaces; -extern cvar_t *r_softOverbright; - extern cvar_t *r_hdr; extern cvar_t *r_floatLightmap; extern cvar_t *r_postProcess; diff --git a/code/renderergl2/tr_shade.c b/code/renderergl2/tr_shade.c index 856b8748..115a2c30 100644 --- a/code/renderergl2/tr_shade.c +++ b/code/renderergl2/tr_shade.c @@ -602,7 +602,7 @@ static void ComputeShaderColors( shaderStage_t *pStage, vec4_t baseColor, vec4_t } // multiply color by overbrightbits if this isn't a blend - if (r_softOverbright->integer && tr.overbrightBits + if (tr.overbrightBits && !((blend & GLS_SRCBLEND_BITS) == GLS_SRCBLEND_DST_COLOR) && !((blend & GLS_SRCBLEND_BITS) == GLS_SRCBLEND_ONE_MINUS_DST_COLOR) && !((blend & GLS_DSTBLEND_BITS) == GLS_DSTBLEND_SRC_COLOR) diff --git a/code/renderergl2/tr_sky.c b/code/renderergl2/tr_sky.c index 6a220318..3b739df0 100644 --- a/code/renderergl2/tr_sky.c +++ b/code/renderergl2/tr_sky.c @@ -449,7 +449,7 @@ static void DrawSkySide( struct image_s *image, const int mins[2], const int max color[0] = color[1] = - color[2] = (r_softOverbright->integer ? 1.0 : tr.identityLight) * backEnd.refdef.colorScale; + color[2] = backEnd.refdef.colorScale; color[3] = 1.0f; GLSL_SetUniformVec4(sp, UNIFORM_BASECOLOR, color); From 6887a69064e394baf93eac790a271ff6938d6d46 Mon Sep 17 00:00:00 2001 From: MAN-AT-ARMS Date: Sat, 22 Feb 2014 17:57:19 -0500 Subject: [PATCH 02/10] Replace deprecated alDopplerVelocity with alSpeedOfSound per OpenAL 1.1 spec --- code/client/qal.c | 3 +++ code/client/snd_openal.c | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/code/client/qal.c b/code/client/qal.c index eb225512..1219cf7c 100644 --- a/code/client/qal.c +++ b/code/client/qal.c @@ -84,6 +84,7 @@ LPALGETBUFFERF qalGetBufferf; LPALGETBUFFERI qalGetBufferi; LPALDOPPLERFACTOR qalDopplerFactor; LPALDOPPLERVELOCITY qalDopplerVelocity; +LPALSPEEDOFSOUND qalSpeedOfSound; LPALDISTANCEMODEL qalDistanceModel; LPALCCREATECONTEXT qalcCreateContext; @@ -202,6 +203,7 @@ qboolean QAL_Init(const char *libname) qalGetBufferi = GPA("alGetBufferi"); qalDopplerFactor = GPA("alDopplerFactor"); qalDopplerVelocity = GPA("alDopplerVelocity"); + qalSpeedOfSound = GPA("alSpeedOfSound"); qalDistanceModel = GPA("alDistanceModel"); qalcCreateContext = GPA("alcCreateContext"); @@ -301,6 +303,7 @@ void QAL_Shutdown( void ) qalGetBufferi = NULL; qalDopplerFactor = NULL; qalDopplerVelocity = NULL; + qalSpeedOfSound = NULL; qalDistanceModel = NULL; qalcCreateContext = NULL; diff --git a/code/client/snd_openal.c b/code/client/snd_openal.c index 2ba07038..fe31f1eb 100644 --- a/code/client/snd_openal.c +++ b/code/client/snd_openal.c @@ -2309,7 +2309,7 @@ void S_AL_Update( void ) } if(s_alDopplerSpeed->modified) { - qalDopplerVelocity(s_alDopplerSpeed->value); + qalSpeedOfSound(s_alDopplerSpeed->value); s_alDopplerSpeed->modified = qfalse; } @@ -2623,7 +2623,7 @@ qboolean S_AL_Init( soundInterface_t *si ) // Set up OpenAL parameters (doppler, etc) qalDistanceModel(AL_INVERSE_DISTANCE_CLAMPED); qalDopplerFactor( s_alDopplerFactor->value ); - qalDopplerVelocity( s_alDopplerSpeed->value ); + qalSpeedOfSound( s_alDopplerSpeed->value ); #ifdef USE_VOIP // !!! FIXME: some of these alcCaptureOpenDevice() values should be cvars. From 5bf4f26d5f3cf4f82bfb2d8f0f19010669148ff2 Mon Sep 17 00:00:00 2001 From: Zack Middleton Date: Sat, 22 Feb 2014 18:05:48 -0600 Subject: [PATCH 03/10] Remove references to alDopplerVelocity Let's load driver even if it doesn't have the deprecated alDopplerVelocity. --- code/client/qal.c | 3 --- code/client/qal.h | 2 -- 2 files changed, 5 deletions(-) diff --git a/code/client/qal.c b/code/client/qal.c index 1219cf7c..5cc40de2 100644 --- a/code/client/qal.c +++ b/code/client/qal.c @@ -83,7 +83,6 @@ LPALBUFFERDATA qalBufferData; LPALGETBUFFERF qalGetBufferf; LPALGETBUFFERI qalGetBufferi; LPALDOPPLERFACTOR qalDopplerFactor; -LPALDOPPLERVELOCITY qalDopplerVelocity; LPALSPEEDOFSOUND qalSpeedOfSound; LPALDISTANCEMODEL qalDistanceModel; @@ -202,7 +201,6 @@ qboolean QAL_Init(const char *libname) qalGetBufferf = GPA("alGetBufferf"); qalGetBufferi = GPA("alGetBufferi"); qalDopplerFactor = GPA("alDopplerFactor"); - qalDopplerVelocity = GPA("alDopplerVelocity"); qalSpeedOfSound = GPA("alSpeedOfSound"); qalDistanceModel = GPA("alDistanceModel"); @@ -302,7 +300,6 @@ void QAL_Shutdown( void ) qalGetBufferf = NULL; qalGetBufferi = NULL; qalDopplerFactor = NULL; - qalDopplerVelocity = NULL; qalSpeedOfSound = NULL; qalDistanceModel = NULL; diff --git a/code/client/qal.h b/code/client/qal.h index 8234497a..5a25ec40 100644 --- a/code/client/qal.h +++ b/code/client/qal.h @@ -125,7 +125,6 @@ extern LPALGETBUFFERI qalGetBufferi; extern LPALGETBUFFER3I qalGetBuffer3i; extern LPALGETBUFFERIV qalGetBufferiv; extern LPALDOPPLERFACTOR qalDopplerFactor; -extern LPALDOPPLERVELOCITY qalDopplerVelocity; extern LPALSPEEDOFSOUND qalSpeedOfSound; extern LPALDISTANCEMODEL qalDistanceModel; @@ -220,7 +219,6 @@ extern LPALCCAPTURESAMPLES qalcCaptureSamples; #define qalGetBuffer3i alGetBuffer3i #define qalGetBufferiv alGetBufferiv #define qalDopplerFactor alDopplerFactor -#define qalDopplerVelocity alDopplerVelocity #define qalSpeedOfSound alSpeedOfSound #define qalDistanceModel alDistanceModel From 71386beaac7890b20f2040e7bb9397dfca724d87 Mon Sep 17 00:00:00 2001 From: MAN-AT-ARMS Date: Sat, 22 Feb 2014 18:48:48 -0500 Subject: [PATCH 04/10] OpenGL2: Fix pshadows for MDR models --- code/renderergl2/tr_animation.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/renderergl2/tr_animation.c b/code/renderergl2/tr_animation.c index a5f08986..3c49e146 100644 --- a/code/renderergl2/tr_animation.c +++ b/code/renderergl2/tr_animation.c @@ -193,7 +193,8 @@ void R_MDRAddAnimSurfaces( trRefEntity_t *ent ) { header = (mdrHeader_t *) tr.currentModel->modelData; - personalModel = (ent->e.renderfx & RF_THIRD_PERSON) && !tr.viewParms.isPortal; + personalModel = (ent->e.renderfx & RF_THIRD_PERSON) && !(tr.viewParms.isPortal + || (tr.viewParms.flags & (VPF_SHADOWMAP | VPF_DEPTHSHADOW))); if ( ent->e.renderfx & RF_WRAP_FRAMES ) { From 950dc7254aa94ee62c9f2da63e9baf28bc6d9556 Mon Sep 17 00:00:00 2001 From: Ensiform Date: Sun, 2 Mar 2014 22:53:15 -0600 Subject: [PATCH 05/10] Fix native trap_BotMutateGoalFuzzyLogic --- code/game/g_syscalls.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/g_syscalls.c b/code/game/g_syscalls.c index 21208f3b..c12aa06b 100644 --- a/code/game/g_syscalls.c +++ b/code/game/g_syscalls.c @@ -688,7 +688,7 @@ void trap_BotSaveGoalFuzzyLogic(int goalstate, char *filename) { } void trap_BotMutateGoalFuzzyLogic(int goalstate, float range) { - syscall( BOTLIB_AI_MUTATE_GOAL_FUZZY_LOGIC, goalstate, range ); + syscall( BOTLIB_AI_MUTATE_GOAL_FUZZY_LOGIC, goalstate, PASSFLOAT(range) ); } int trap_BotAllocGoalState(int state) { From 89fab090d75c20905b27e21526d3c027bba8c5a1 Mon Sep 17 00:00:00 2001 From: MAN-AT-ARMS Date: Sun, 2 Mar 2014 23:00:46 -0600 Subject: [PATCH 06/10] Fix s_alDopplerSpeed default value --- code/client/snd_openal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/client/snd_openal.c b/code/client/snd_openal.c index fe31f1eb..f0a5f4f2 100644 --- a/code/client/snd_openal.c +++ b/code/client/snd_openal.c @@ -2506,7 +2506,7 @@ qboolean S_AL_Init( soundInterface_t *si ) s_alGain = Cvar_Get( "s_alGain", "1.0", CVAR_ARCHIVE ); s_alSources = Cvar_Get( "s_alSources", "96", CVAR_ARCHIVE ); s_alDopplerFactor = Cvar_Get( "s_alDopplerFactor", "1.0", CVAR_ARCHIVE ); - s_alDopplerSpeed = Cvar_Get( "s_alDopplerSpeed", "2200", CVAR_ARCHIVE ); + s_alDopplerSpeed = Cvar_Get( "s_alDopplerSpeed", "13512", CVAR_ARCHIVE ); s_alMinDistance = Cvar_Get( "s_alMinDistance", "120", CVAR_CHEAT ); s_alMaxDistance = Cvar_Get("s_alMaxDistance", "1024", CVAR_CHEAT); s_alRolloff = Cvar_Get( "s_alRolloff", "2", CVAR_CHEAT); From ea2810c0850076941ea25b181fc8e008b0e42c08 Mon Sep 17 00:00:00 2001 From: SmileTheory Date: Mon, 3 Mar 2014 17:32:07 -0800 Subject: [PATCH 07/10] OpenGL2: Minor GLSL shader improvements. --- code/renderergl2/glsl/lightall_fp.glsl | 18 ++++++++++++++++-- code/renderergl2/glsl/shadowmask_fp.glsl | 9 +++++++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/code/renderergl2/glsl/lightall_fp.glsl b/code/renderergl2/glsl/lightall_fp.glsl index b983d6fe..871c527e 100644 --- a/code/renderergl2/glsl/lightall_fp.glsl +++ b/code/renderergl2/glsl/lightall_fp.glsl @@ -167,7 +167,7 @@ vec3 EnvironmentBRDF(float gloss, float NE, vec3 specular) return clamp( a0 + specular * ( a1 - a0 ), 0.0, 1.0 ); #elif 0 // from http://seblagarde.wordpress.com/2011/08/17/hello-world/ - return mix(specular.rgb, max(specular.rgb, vec3(gloss)), CalcFresnel(NE)); + return specular + CalcFresnel(NE) * clamp(vec3(gloss) - specular, 0.0, 1.0); #else // from http://advances.realtimerendering.com/s2011/Lazarov-Physically-Based-Lighting-in-Black-Ops%20%28Siggraph%202011%20Advances%20in%20Real-Time%20Rendering%20Course%29.pptx return mix(specular.rgb, vec3(1.0), CalcFresnel(NE) / (4.0 - 3.0 * gloss)); @@ -379,7 +379,7 @@ void main() N.xy = texture2D(u_NormalMap, texCoords).rg - vec2(0.5); #endif N.xy *= u_EnableTextures.x; - N.z = sqrt((0.25 - N.x * N.x) - N.y * N.y); + N.z = sqrt(clamp((0.25 - N.x * N.x) - N.y * N.y, 0.0, 1.0)); N = tangentToWorld * N; #else N = var_Normal.xyz; @@ -473,7 +473,21 @@ void main() #endif gl_FragColor.rgb = lightColor * reflectance * NL; + +#if 0 + vec3 aSpecular = EnvironmentBRDF(gloss, NE, specular.rgb); + + // do ambient as two hemisphere lights, one straight up one straight down + float hemiDiffuseUp = N.z * 0.5 + 0.5; + float hemiDiffuseDown = 1.0 - hemiDiffuseUp; + float hemiSpecularUp = mix(hemiDiffuseUp, float(N.z >= 0.0), gloss); + float hemiSpecularDown = 1.0 - hemiSpecularUp; + + gl_FragColor.rgb += ambientColor * 0.75 * (diffuse.rgb * hemiDiffuseUp + aSpecular * hemiSpecularUp); + gl_FragColor.rgb += ambientColor * 0.25 * (diffuse.rgb * hemiDiffuseDown + aSpecular * hemiSpecularDown); +#else gl_FragColor.rgb += ambientColor * (diffuse.rgb + specular.rgb); +#endif #if defined(USE_CUBEMAP) reflectance = EnvironmentBRDF(gloss, NE, specular.rgb); diff --git a/code/renderergl2/glsl/shadowmask_fp.glsl b/code/renderergl2/glsl/shadowmask_fp.glsl index 4bac5ccd..b489fef5 100644 --- a/code/renderergl2/glsl/shadowmask_fp.glsl +++ b/code/renderergl2/glsl/shadowmask_fp.glsl @@ -18,6 +18,10 @@ uniform vec4 u_ViewInfo; // zfar / znear, zfar varying vec2 var_DepthTex; varying vec3 var_ViewDir; +// depth is GL_DEPTH_COMPONENT24 +// so the maximum error is 1.0 / 2^24 +#define DEPTH_MAX_ERROR 0.000000059604644775390625 + // Input: It uses texture coords as the random number seed. // Output: Random number: [0,1), that is between 0.0 and 0.999999... inclusive. // Author: Michael Pohoreski @@ -39,7 +43,7 @@ float PCF(const sampler2D shadowmap, const vec2 st, const float dist) { float mult; float scale = 2.0 / r_shadowMapSize; - + #if defined(USE_SHADOW_FILTER) float r = random(var_DepthTex.xy); float sinr = sin(r) * scale; @@ -71,6 +75,7 @@ float PCF(const sampler2D shadowmap, const vec2 st, const float dist) float getLinearDepth(sampler2D depthMap, vec2 tex, float zFarDivZNear) { float sampleZDivW = texture2D(depthMap, tex).r; + sampleZDivW -= DEPTH_MAX_ERROR; return 1.0 / mix(zFarDivZNear, 1.0, sampleZDivW); } @@ -81,7 +86,7 @@ void main() float depth = getLinearDepth(u_ScreenDepthMap, var_DepthTex, u_ViewInfo.x); float sampleZ = u_ViewInfo.y * depth; - vec4 biasPos = vec4(u_ViewOrigin + var_ViewDir * depth * 0.99, 1.0); + vec4 biasPos = vec4(u_ViewOrigin + var_ViewDir * (depth - 0.5 / u_ViewInfo.x), 1.0); vec4 shadowpos = u_ShadowMvp * biasPos; From ee67d0a981e4133fba4b72ed91e6c5486d36a11c Mon Sep 17 00:00:00 2001 From: SmileTheory Date: Mon, 3 Mar 2014 21:02:39 -0800 Subject: [PATCH 08/10] OpenGL2: Add normalScale and parallaxDepth stage keywords and helper cvars. --- code/renderergl2/glsl/lightall_fp.glsl | 17 +-- code/renderergl2/tr_glsl.c | 7 +- code/renderergl2/tr_init.c | 6 + code/renderergl2/tr_local.h | 11 +- code/renderergl2/tr_shade.c | 31 +++++- code/renderergl2/tr_shader.c | 146 ++++++++++++++++++++----- opengl2-readme.txt | 51 ++++++++- 7 files changed, 224 insertions(+), 45 deletions(-) diff --git a/code/renderergl2/glsl/lightall_fp.glsl b/code/renderergl2/glsl/lightall_fp.glsl index 871c527e..c74d6844 100644 --- a/code/renderergl2/glsl/lightall_fp.glsl +++ b/code/renderergl2/glsl/lightall_fp.glsl @@ -25,7 +25,8 @@ uniform samplerCube u_CubeMap; #endif #if defined(USE_NORMALMAP) || defined(USE_DELUXEMAP) || defined(USE_SPECULARMAP) || defined(USE_CUBEMAP) -uniform vec4 u_EnableTextures; // x = normal, y = deluxe, z = specular, w = cube +// y = deluxe, w = cube +uniform vec4 u_EnableTextures; #endif #if defined(USE_LIGHT_VECTOR) && !defined(USE_FAST_LIGHT) @@ -39,7 +40,8 @@ uniform vec3 u_PrimaryLightAmbient; #endif #if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT) -uniform vec2 u_MaterialInfo; +uniform vec4 u_NormalScale; +uniform vec4 u_SpecularScale; #endif varying vec4 var_TexCoords; @@ -360,7 +362,7 @@ void main() #if defined(USE_PARALLAXMAP) vec3 offsetDir = normalize(E * tangentToWorld); - offsetDir.xy *= -0.05 / offsetDir.z; + offsetDir.xy *= -u_NormalScale.a / offsetDir.z; texCoords += offsetDir.xy * RayIntersectDisplaceMap(texCoords, offsetDir.xy, u_NormalMap); #endif @@ -378,7 +380,7 @@ void main() #else N.xy = texture2D(u_NormalMap, texCoords).rg - vec2(0.5); #endif - N.xy *= u_EnableTextures.x; + N.xy *= u_NormalScale.xy; N.z = sqrt(clamp((0.25 - N.x * N.x) - N.y * N.y, 0.0, 1.0)); N = tangentToWorld * N; #else @@ -425,15 +427,16 @@ void main() NL = clamp(dot(N, L), 0.0, 1.0); NE = clamp(dot(N, E), 0.0, 1.0); - vec4 specular = vec4(1.0); #if defined(USE_SPECULARMAP) - specular += texture2D(u_SpecularMap, texCoords) * u_EnableTextures.z - u_EnableTextures.zzzz; + vec4 specular = texture2D(u_SpecularMap, texCoords); #if defined(USE_GAMMA2_TEXTURES) specular.rgb *= specular.rgb; #endif + #else + vec4 specular = vec4(1.0); #endif - specular *= u_MaterialInfo.xxxy; + specular *= u_SpecularScale; float gloss = specular.a; float shininess = exp2(gloss * 13.0); diff --git a/code/renderergl2/tr_glsl.c b/code/renderergl2/tr_glsl.c index 4919254f..c4a30b60 100644 --- a/code/renderergl2/tr_glsl.c +++ b/code/renderergl2/tr_glsl.c @@ -123,9 +123,10 @@ static uniformInfo_t uniformsInfo[] = { "u_ModelMatrix", GLSL_MAT16 }, { "u_ModelViewProjectionMatrix", GLSL_MAT16 }, - { "u_Time", GLSL_FLOAT }, - { "u_VertexLerp" , GLSL_FLOAT }, - { "u_MaterialInfo", GLSL_VEC2 }, + { "u_Time", GLSL_FLOAT }, + { "u_VertexLerp" , GLSL_FLOAT }, + { "u_NormalScale", GLSL_VEC4 }, + { "u_SpecularScale", GLSL_VEC4 }, { "u_ViewInfo", GLSL_VEC4 }, { "u_ViewOrigin", GLSL_VEC3 }, diff --git a/code/renderergl2/tr_init.c b/code/renderergl2/tr_init.c index 4fb1d99e..6c9d248f 100644 --- a/code/renderergl2/tr_init.c +++ b/code/renderergl2/tr_init.c @@ -135,6 +135,9 @@ cvar_t *r_parallaxMapping; cvar_t *r_cubeMapping; cvar_t *r_deluxeSpecular; cvar_t *r_specularIsMetallic; +cvar_t *r_baseNormalX; +cvar_t *r_baseNormalY; +cvar_t *r_baseParallax; cvar_t *r_baseSpecular; cvar_t *r_baseGloss; cvar_t *r_recalcMD3Normals; @@ -1188,6 +1191,9 @@ void R_Register( void ) r_cubeMapping = ri.Cvar_Get( "r_cubeMapping", "0", CVAR_ARCHIVE | CVAR_LATCH ); r_deluxeSpecular = ri.Cvar_Get( "r_deluxeSpecular", "0.3", CVAR_ARCHIVE | CVAR_LATCH ); r_specularIsMetallic = ri.Cvar_Get( "r_specularIsMetallic", "0", CVAR_ARCHIVE | CVAR_LATCH ); + r_baseNormalX = ri.Cvar_Get( "r_baseNormalX", "1.0", CVAR_ARCHIVE | CVAR_LATCH ); + r_baseNormalY = ri.Cvar_Get( "r_baseNormalY", "1.0", CVAR_ARCHIVE | CVAR_LATCH ); + r_baseParallax = ri.Cvar_Get( "r_baseParallax", "0.05", CVAR_ARCHIVE | CVAR_LATCH ); r_baseSpecular = ri.Cvar_Get( "r_baseSpecular", "0.04", CVAR_ARCHIVE | CVAR_LATCH ); r_baseGloss = ri.Cvar_Get( "r_baseGloss", "0.3", CVAR_ARCHIVE | CVAR_LATCH ); r_dlightMode = ri.Cvar_Get( "r_dlightMode", "0", CVAR_ARCHIVE | CVAR_LATCH ); diff --git a/code/renderergl2/tr_local.h b/code/renderergl2/tr_local.h index d0448507..1f7c6fd6 100644 --- a/code/renderergl2/tr_local.h +++ b/code/renderergl2/tr_local.h @@ -400,7 +400,10 @@ typedef struct { stageType_t type; struct shaderProgram_s *glslShaderGroup; int glslShaderIndex; - vec2_t materialInfo; + + vec4_t normalScale; + vec4_t specularScale; + } shaderStage_t; struct shaderCommands_s; @@ -676,7 +679,8 @@ typedef enum UNIFORM_TIME, UNIFORM_VERTEXLERP, - UNIFORM_MATERIALINFO, + UNIFORM_NORMALSCALE, + UNIFORM_SPECULARSCALE, UNIFORM_VIEWINFO, // znear, zfar, width/2, height/2 UNIFORM_VIEWORIGIN, @@ -1794,6 +1798,9 @@ extern cvar_t *r_parallaxMapping; extern cvar_t *r_cubeMapping; extern cvar_t *r_deluxeSpecular; extern cvar_t *r_specularIsMetallic; +extern cvar_t *r_baseNormalX; +extern cvar_t *r_baseNormalY; +extern cvar_t *r_baseParallax; extern cvar_t *r_baseSpecular; extern cvar_t *r_baseGloss; extern cvar_t *r_dlightMode; diff --git a/code/renderergl2/tr_shade.c b/code/renderergl2/tr_shade.c index 115a2c30..349f7e2e 100644 --- a/code/renderergl2/tr_shade.c +++ b/code/renderergl2/tr_shade.c @@ -811,7 +811,8 @@ static void ForwardDlight( void ) { GLSL_SetUniformFloat(sp, UNIFORM_LIGHTRADIUS, radius); - GLSL_SetUniformVec2(sp, UNIFORM_MATERIALINFO, pStage->materialInfo); + GLSL_SetUniformVec4(sp, UNIFORM_NORMALSCALE, pStage->normalScale); + GLSL_SetUniformVec4(sp, UNIFORM_SPECULARSCALE, pStage->specularScale); // include GLS_DEPTHFUNC_EQUAL so alpha tested surfaces don't add light // where they aren't rendered @@ -822,11 +823,36 @@ static void ForwardDlight( void ) { if (pStage->bundle[TB_DIFFUSEMAP].image[0]) R_BindAnimatedImageToTMU( &pStage->bundle[TB_DIFFUSEMAP], TB_DIFFUSEMAP); + // bind textures that are sampled and used in the glsl shader, and + // bind whiteImage to textures that are sampled but zeroed in the glsl shader + // + // alternatives: + // - use the last bound texture + // -> costs more to sample a higher res texture then throw out the result + // - disable texture sampling in glsl shader with #ifdefs, as before + // -> increases the number of shaders that must be compiled + // + if (pStage->bundle[TB_NORMALMAP].image[0]) + { R_BindAnimatedImageToTMU( &pStage->bundle[TB_NORMALMAP], TB_NORMALMAP); + } + else if (r_normalMapping->integer) + GL_BindToTMU( tr.whiteImage, TB_NORMALMAP ); if (pStage->bundle[TB_SPECULARMAP].image[0]) + { R_BindAnimatedImageToTMU( &pStage->bundle[TB_SPECULARMAP], TB_SPECULARMAP); + } + else if (r_specularMapping->integer) + GL_BindToTMU( tr.whiteImage, TB_SPECULARMAP ); + + { + vec4_t enableTextures; + + VectorSet4(enableTextures, 0.0f, 0.0f, 0.0f, 0.0f); + GLSL_SetUniformVec4(sp, UNIFORM_ENABLETEXTURES, enableTextures); + } if (r_dlightMode->integer >= 2) { @@ -1222,7 +1248,8 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input ) GLSL_SetUniformMat4(sp, UNIFORM_MODELMATRIX, backEnd.or.transformMatrix); - GLSL_SetUniformVec2(sp, UNIFORM_MATERIALINFO, pStage->materialInfo); + GLSL_SetUniformVec4(sp, UNIFORM_NORMALSCALE, pStage->normalScale); + GLSL_SetUniformVec4(sp, UNIFORM_SPECULARSCALE, pStage->specularScale); //GLSL_SetUniformFloat(sp, UNIFORM_MAPLIGHTSCALE, backEnd.refdef.mapLightScale); diff --git a/code/renderergl2/tr_shader.c b/code/renderergl2/tr_shader.c index 6dbac55a..d6e0727a 100644 --- a/code/renderergl2/tr_shader.c +++ b/code/renderergl2/tr_shader.c @@ -911,6 +911,7 @@ static qboolean ParseStage( shaderStage_t *stage, char **text ) else if(!Q_stricmp(token, "normalMap") || !Q_stricmp(token, "bumpMap")) { stage->type = ST_NORMALMAP; + VectorSet4(stage->normalScale, r_baseNormalX->value, r_baseNormalY->value, 1.0f, r_baseParallax->value); } else if(!Q_stricmp(token, "normalParallaxMap") || !Q_stricmp(token, "bumpParallaxMap")) { @@ -918,12 +919,12 @@ static qboolean ParseStage( shaderStage_t *stage, char **text ) stage->type = ST_NORMALPARALLAXMAP; else stage->type = ST_NORMALMAP; + VectorSet4(stage->normalScale, r_baseNormalX->value, r_baseNormalY->value, 1.0f, r_baseParallax->value); } else if(!Q_stricmp(token, "specularMap")) { stage->type = ST_SPECULARMAP; - stage->materialInfo[0] = 1.0f; - stage->materialInfo[1] = 1.0f; + VectorSet4(stage->specularScale, 1.0f, 1.0f, 1.0f, 1.0f); } else { @@ -942,7 +943,9 @@ static qboolean ParseStage( shaderStage_t *stage, char **text ) ri.Printf( PRINT_WARNING, "WARNING: missing parameter for specular reflectance in shader '%s'\n", shader.name ); continue; } - stage->materialInfo[0] = atof( token ); + stage->specularScale[0] = + stage->specularScale[1] = + stage->specularScale[2] = atof( token ); } // // specularExponent @@ -964,7 +967,7 @@ static qboolean ParseStage( shaderStage_t *stage, char **text ) // FIXME: assumes max exponent of 8192 and min of 1, must change here if altered in lightall_fp.glsl exponent = CLAMP(exponent, 1.0, 8192.0); - stage->materialInfo[1] = log(exponent) / log(8192.0); + stage->specularScale[3] = log(exponent) / log(8192.0); } // // gloss @@ -978,7 +981,103 @@ static qboolean ParseStage( shaderStage_t *stage, char **text ) continue; } - stage->materialInfo[1] = atof( token ); + stage->specularScale[3] = atof( token ); + } + // + // parallaxDepth + // + else if (!Q_stricmp(token, "parallaxdepth")) + { + token = COM_ParseExt(text, qfalse); + if ( token[0] == 0 ) + { + ri.Printf( PRINT_WARNING, "WARNING: missing parameter for parallaxDepth in shader '%s'\n", shader.name ); + continue; + } + + stage->normalScale[3] = atof( token ); + } + // + // normalScale + // or normalScale + // or normalScale + // + else if (!Q_stricmp(token, "normalscale")) + { + token = COM_ParseExt(text, qfalse); + if ( token[0] == 0 ) + { + ri.Printf( PRINT_WARNING, "WARNING: missing parameter for normalScale in shader '%s'\n", shader.name ); + continue; + } + + stage->normalScale[0] = atof( token ); + + token = COM_ParseExt(text, qfalse); + if ( token[0] == 0 ) + { + // one value, applies to X/Y + stage->normalScale[1] = stage->normalScale[0]; + continue; + } + + stage->normalScale[1] = atof( token ); + + token = COM_ParseExt(text, qfalse); + if ( token[0] == 0 ) + { + // two values, no height + continue; + } + + stage->normalScale[3] = atof( token ); + } + // + // specularScale + // or specularScale + // or specularScale + // + else if (!Q_stricmp(token, "specularscale")) + { + token = COM_ParseExt(text, qfalse); + if ( token[0] == 0 ) + { + ri.Printf( PRINT_WARNING, "WARNING: missing parameter for specularScale in shader '%s'\n", shader.name ); + continue; + } + + stage->specularScale[0] = atof( token ); + + token = COM_ParseExt(text, qfalse); + if ( token[0] == 0 ) + { + ri.Printf( PRINT_WARNING, "WARNING: missing parameter for specularScale in shader '%s'\n", shader.name ); + continue; + } + + stage->specularScale[1] = atof( token ); + + token = COM_ParseExt(text, qfalse); + if ( token[0] == 0 ) + { + // two values, rgb then gloss + stage->specularScale[3] = stage->specularScale[1]; + stage->specularScale[1] = + stage->specularScale[2] = stage->specularScale[0]; + continue; + } + + stage->specularScale[2] = atof( token ); + + token = COM_ParseExt(text, qfalse); + if ( token[0] == 0 ) + { + // three values, rgb + continue; + } + + stage->specularScale[2] = atof( token ); + } // // rgbGen @@ -2231,6 +2330,8 @@ static void CollapseStagesToLightall(shaderStage_t *diffuse, diffuse->bundle[TB_NORMALMAP] = normal->bundle[0]; if (parallax && r_parallaxMapping->integer) defs |= LIGHTDEF_USE_PARALLAXMAP; + + VectorCopy4(normal->normalScale, diffuse->normalScale); } else if ((lightmap || useLightVector || useLightVertex) && (diffuseImg = diffuse->bundle[TB_DIFFUSEMAP].image[0])) { @@ -2251,6 +2352,8 @@ static void CollapseStagesToLightall(shaderStage_t *diffuse, if (parallax && r_parallaxMapping->integer) defs |= LIGHTDEF_USE_PARALLAXMAP; + + VectorSet4(diffuse->normalScale, r_baseNormalX->value, r_baseNormalY->value, 1.0f, r_baseParallax->value); } } } @@ -2261,8 +2364,7 @@ static void CollapseStagesToLightall(shaderStage_t *diffuse, { //ri.Printf(PRINT_ALL, ", specularmap %s", specular->bundle[0].image[0]->imgName); diffuse->bundle[TB_SPECULARMAP] = specular->bundle[0]; - diffuse->materialInfo[0] = specular->materialInfo[0]; - diffuse->materialInfo[1] = specular->materialInfo[1]; + VectorCopy4(specular->specularScale, diffuse->specularScale); } } @@ -2568,29 +2670,6 @@ static qboolean CollapseStagesToGLSL(void) } } - // insert default material info if needed - for (i = 0; i < MAX_SHADER_STAGES; i++) - { - shaderStage_t *pStage = &stages[i]; - - if (!pStage->active) - continue; - - if (pStage->glslShaderGroup != tr.lightallShader) - continue; - - if ((pStage->glslShaderIndex & LIGHTDEF_LIGHTTYPE_MASK) == 0) - continue; - - if (!pStage->bundle[TB_SPECULARMAP].image[0] && r_specularMapping->integer) - { - if (!pStage->materialInfo[0]) - pStage->materialInfo[0] = r_baseSpecular->value; - if (!pStage->materialInfo[1]) - pStage->materialInfo[1] = r_baseGloss->value; - } - } - return numStages; } @@ -3216,6 +3295,13 @@ shader_t *R_FindShader( const char *name, int lightmapIndex, qboolean mipRawImag shader.lightmapIndex = lightmapIndex; for ( i = 0 ; i < MAX_SHADER_STAGES ; i++ ) { stages[i].bundle[0].texMods = texMods[i]; + + // default normal/specular + VectorSet4(stages[i].normalScale, 0.0f, 0.0f, 0.0f, 0.0f); + stages[i].specularScale[0] = + stages[i].specularScale[1] = + stages[i].specularScale[2] = r_baseSpecular->value; + stages[i].specularScale[3] = r_baseGloss->value; } // diff --git a/opengl2-readme.txt b/opengl2-readme.txt index 999fd385..3df7958e 100644 --- a/opengl2-readme.txt +++ b/opengl2-readme.txt @@ -203,6 +203,44 @@ Cvars for advanced material usage: 0 - No. (default) 1 - Yes. + r_baseSpecular - Set the specular reflectance of materials + which don't include a specular map or + use the specularReflectance keyword. + 0 - No. + 0.04 - Realistic. (default) + 1.0 - Ack. + + r_baseGloss - Set the glossiness of materials which don't + include a specular map or use the + specularExponent keyword. + 0 - Rough. + 0.3 - Default. + 1.0 - Shiny. + + r_baseNormalX - Set the scale of the X values from normal + maps when the normalScale keyword is not + used. + -1 - Flip X. + 0 - Ignore X. + 1 - Normal X. (default) + 2 - Double X. + + r_baseNormalY - Set the scale of the Y values from normal + maps when the normalScale keyword is not + used. + -1 - Flip Y. + 0 - Ignore Y. + 1 - Normal Y. (default) + 2 - Double Y. + + r_baseParallax - Sets the scale of the parallax effect for + materials when the parallaxDepth keyword + is not used. + 0 - No depth. + 0.01 - Pretty smooth. + 0.05 - Standard depth. (default) + 0.1 - Looks broken. + Cvars for image interpolation and generation: r_imageUpsample - Use interpolation to artifically increase the resolution of all textures. Looks good @@ -362,6 +400,8 @@ Here's an example of a material stored in one, showing off some new features: { stage normalparallaxmap map textures/abandon/grass3_1024_n.png + normalScale 1 1 + parallaxDepth 0.05 } { stage specularmap @@ -401,7 +441,16 @@ they mean: alpha channel of the specular map, so if it were set to 16, and the alpha channel of the specular map was set to 0.5, then the shininess would be set to 8. Default 256. - + + normalScale + - State the X and Y scales of the normal map. This is useful for increasing + or decreasing the "strength" of the normal map, or entering negative values + to flip the X and/or Y values. Default 1 1. + + parallaxDepth + - State the maximum depth of the parallax map. This is a fairly sensitive + value, and I recommend the default or lower. Default 0.05. + An important note is that normal and specular maps influence the diffuse map declared before them, so materials like this are possible: From 11ed8832984d6b7ef42143eb82d9ff7b8d6ce3f6 Mon Sep 17 00:00:00 2001 From: MAN-AT-ARMS Date: Tue, 4 Mar 2014 20:31:31 -0500 Subject: [PATCH 09/10] OpenGL2: Set default normal/specular in RE_RegisterShaderFromImage --- code/renderergl2/tr_shader.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/code/renderergl2/tr_shader.c b/code/renderergl2/tr_shader.c index d6e0727a..b90030c0 100644 --- a/code/renderergl2/tr_shader.c +++ b/code/renderergl2/tr_shader.c @@ -3447,6 +3447,13 @@ qhandle_t RE_RegisterShaderFromImage(const char *name, int lightmapIndex, image_ shader.lightmapIndex = lightmapIndex; for ( i = 0 ; i < MAX_SHADER_STAGES ; i++ ) { stages[i].bundle[0].texMods = texMods[i]; + + // default normal/specular + VectorSet4(stages[i].normalScale, 0.0f, 0.0f, 0.0f, 0.0f); + stages[i].specularScale[0] = + stages[i].specularScale[1] = + stages[i].specularScale[2] = r_baseSpecular->value; + stages[i].specularScale[3] = r_baseGloss->value; } // From e7f43545edc56892f9481fe0d5633ddba0e4364b Mon Sep 17 00:00:00 2001 From: Zack Middleton Date: Fri, 7 Mar 2014 17:58:30 -0600 Subject: [PATCH 10/10] Don't wash out HDR vertex lite surfaces in OpenGL2 Vertex lite surfaces being brighter than light maps looks bad, they're meant to look the same. Especially in ET, which mixes them fequently. It's noticeable in Q3 too though. BSP lightmaps (i.e. not external HDR lightmaps) use R_ColorShiftLightingBytes, now *Floats (used by vertex colors) has the same behavior. This may be a problem for HDR lightmaps, as the RGB will always be scaled to 0.0 to 1.0 range. I had enabled this for non-HDR before, but now HDR needs it too. --- code/renderergl2/tr_bsp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/renderergl2/tr_bsp.c b/code/renderergl2/tr_bsp.c index 964a6601..d9fdb4ab 100644 --- a/code/renderergl2/tr_bsp.c +++ b/code/renderergl2/tr_bsp.c @@ -143,7 +143,7 @@ static void R_ColorShiftLightingFloats(float in[4], float out[4], float scale ) b = in[2] * scale; // normalize by color instead of saturating to white - if ( !r_hdr->integer && ( r > 1 || g > 1 || b > 1 ) ) { + if ( r > 1 || g > 1 || b > 1 ) { float max; max = r > g ? r : g;