Added cvar r_useHalfLambertLighting to make it optional, it requires reloadShaders

This commit is contained in:
Robert Beckebans 2014-05-15 16:37:55 +02:00
parent 42874cfd05
commit e13fc0f4e9
6 changed files with 72 additions and 29 deletions

View file

@ -62,17 +62,28 @@ void main( PS_IN fragment, out PS_OUT result ) {
half3 diffuseMap = ConvertYCoCgToRGB( YCoCG );
half3 localNormal;
// RB begin
#if defined(USE_NORMAL_FMT_RGB8)
localNormal.xy = bumpMap.rg - 0.5;
#else
localNormal.xy = bumpMap.wy - 0.5;
#endif
// RB end
localNormal.z = sqrt( abs( dot( localNormal.xy, localNormal.xy ) - 0.25 ) );
localNormal = normalize( localNormal );
// traditional very dark Lambert light model used in Doom 3
half ldotN = dot3( localNormal, lightVector );
#if defined(USE_HALF_LAMBERT)
// RB: http://developer.valvesoftware.com/wiki/Half_Lambert
float halfLdotN = dot3( localNormal, lightVector ) * 0.5 + 0.5;
half halfLdotN = dot3( localNormal, lightVector ) * 0.5 + 0.5;
halfLdotN *= halfLdotN;
// traditional very dark Lambert light model used in Doom 3
//float ldotN = clamp( dot3( localNormal, lightVector ), 0.0, 1.0 );
float ldotN = dot3( localNormal, lightVector );
half lambert = halfLdotN;
#else
half lambert = ldotN;
#endif
const half specularPower = 10.0f;
half hDotN = dot3( normalize( fragment.texcoord6.xyz ), localNormal );
@ -87,6 +98,6 @@ void main( PS_IN fragment, out PS_OUT result ) {
half rimPower = 16.0f;
half3 rimColor = diffuseColor * lightProj.xyz * lightFalloff.xyz * 1.0f * pow( rim, rimPower ) * fragment.color.rgb;// * halfLdotN;
result.color.xyz = ( diffuseColor + specularColor ) * halfLdotN * lightColor * fragment.color.rgb;// + rimColor;
result.color.xyz = ( diffuseColor + specularColor ) * lambert * lightColor * fragment.color.rgb;// + rimColor;
result.color.w = 1.0;
}

View file

@ -73,7 +73,7 @@ void main( PS_IN fragment, out PS_OUT result )
half3 localNormal;
// RB begin
#if defined(GLES2)
#if defined(USE_NORMAL_FMT_RGB8)
localNormal.xy = bumpMap.rg - 0.5;
#else
localNormal.xy = bumpMap.wy - 0.5;
@ -82,12 +82,18 @@ void main( PS_IN fragment, out PS_OUT result )
localNormal.z = sqrt( abs( dot( localNormal.xy, localNormal.xy ) - 0.25 ) );
localNormal = normalize( localNormal );
// traditional very dark Lambert light model used in Doom 3
half ldotN = dot3( localNormal, lightVector );
#if defined(USE_HALF_LAMBERT)
// RB: http://developer.valvesoftware.com/wiki/Half_Lambert
float halfLdotN = dot3( localNormal, lightVector ) * 0.5 + 0.5;
half halfLdotN = dot3( localNormal, lightVector ) * 0.5 + 0.5;
halfLdotN *= halfLdotN;
// traditional very dark Lambert light model used in Doom 3
float ldotN = dot3( localNormal, lightVector );
half lambert = halfLdotN;
#else
half lambert = ldotN;
#endif
const half specularPower = 10.0f;
half hDotN = dot3( normalize( fragment.texcoord6.xyz ), localNormal );
@ -228,6 +234,6 @@ void main( PS_IN fragment, out PS_OUT result )
float shadow = texture( samp5, shadowTexcoord.xywz );
#endif
result.color.xyz = ( diffuseColor + specularColor ) * halfLdotN * lightColor * fragment.color.rgb * shadow;// + rimColor;
result.color.xyz = ( diffuseColor + specularColor ) * lambert * lightColor * fragment.color.rgb * shadow;// + rimColor;
result.color.w = 1.0;
}

View file

@ -534,7 +534,7 @@ idStr StripDeadCode( const idStr& in, const char* name, const idStrList& compile
{
case GLDRV_OPENGL_ES2:
case GLDRV_OPENGL_ES3:
src.AddDefine( "GLES2" );
//src.AddDefine( "GLES2" );
break;
}
@ -548,6 +548,11 @@ idStr StripDeadCode( const idStr& in, const char* name, const idStrList& compile
src.AddDefine( "USE_UNIFORM_ARRAYS" );
}
if( r_useHalfLambertLighting.GetBool() )
{
src.AddDefine( "USE_HALF_LAMBERT" );
}
idList< idCGBlock > blocks;
blocks.SetNum( 100 );

View file

@ -3925,17 +3925,28 @@ static const cgShaderDef_t cg_renderprogs[] =
" half3 diffuseMap = ConvertYCoCgToRGB( YCoCG );\n"
"\n"
" half3 localNormal;\n"
" // RB begin\n"
"#if defined(USE_NORMAL_FMT_RGB8)\n"
" localNormal.xy = bumpMap.rg - 0.5;\n"
"#else\n"
" localNormal.xy = bumpMap.wy - 0.5;\n"
"#endif\n"
" // RB end\n"
" localNormal.z = sqrt( abs( dot( localNormal.xy, localNormal.xy ) - 0.25 ) );\n"
" localNormal = normalize( localNormal );\n"
" \n"
" // traditional very dark Lambert light model used in Doom 3\n"
" half ldotN = dot3( localNormal, lightVector );\n"
"\n"
"#if defined(USE_HALF_LAMBERT)\n"
" // RB: http://developer.valvesoftware.com/wiki/Half_Lambert\n"
" float halfLdotN = dot3( localNormal, lightVector ) * 0.5 + 0.5;\n"
" half halfLdotN = dot3( localNormal, lightVector ) * 0.5 + 0.5;\n"
" halfLdotN *= halfLdotN;\n"
"\n"
" // traditional very dark Lambert light model used in Doom 3\n"
" //float ldotN = clamp( dot3( localNormal, lightVector ), 0.0, 1.0 );\n"
" float ldotN = dot3( localNormal, lightVector );\n"
" half lambert = halfLdotN;\n"
"#else\n"
" half lambert = ldotN;\n"
"#endif\n"
" \n"
" const half specularPower = 10.0f;\n"
" half hDotN = dot3( normalize( fragment.texcoord6.xyz ), localNormal );\n"
@ -3950,7 +3961,7 @@ static const cgShaderDef_t cg_renderprogs[] =
" half rimPower = 16.0f;\n"
" half3 rimColor = diffuseColor * lightProj.xyz * lightFalloff.xyz * 1.0f * pow( rim, rimPower ) * fragment.color.rgb;// * halfLdotN;\n"
"\n"
" result.color.xyz = ( diffuseColor + specularColor ) * halfLdotN * lightColor * fragment.color.rgb;// + rimColor;\n"
" result.color.xyz = ( diffuseColor + specularColor ) * lambert * lightColor * fragment.color.rgb;// + rimColor;\n"
" result.color.w = 1.0;\n"
"}\n"
"\n"
@ -4237,7 +4248,7 @@ static const cgShaderDef_t cg_renderprogs[] =
"\n"
" half3 localNormal;\n"
" // RB begin\n"
"#if defined(GLES2)\n"
"#if defined(USE_NORMAL_FMT_RGB8)\n"
" localNormal.xy = bumpMap.rg - 0.5;\n"
"#else\n"
" localNormal.xy = bumpMap.wy - 0.5;\n"
@ -4246,12 +4257,18 @@ static const cgShaderDef_t cg_renderprogs[] =
" localNormal.z = sqrt( abs( dot( localNormal.xy, localNormal.xy ) - 0.25 ) );\n"
" localNormal = normalize( localNormal );\n"
" \n"
" // traditional very dark Lambert light model used in Doom 3\n"
" half ldotN = dot3( localNormal, lightVector );\n"
"\n"
"#if defined(USE_HALF_LAMBERT)\n"
" // RB: http://developer.valvesoftware.com/wiki/Half_Lambert\n"
" float halfLdotN = dot3( localNormal, lightVector ) * 0.5 + 0.5;\n"
" half halfLdotN = dot3( localNormal, lightVector ) * 0.5 + 0.5;\n"
" halfLdotN *= halfLdotN;\n"
"\n"
" // traditional very dark Lambert light model used in Doom 3\n"
" float ldotN = dot3( localNormal, lightVector );\n"
" half lambert = halfLdotN;\n"
"#else\n"
" half lambert = ldotN;\n"
"#endif\n"
" \n"
" const half specularPower = 10.0f;\n"
" half hDotN = dot3( normalize( fragment.texcoord6.xyz ), localNormal );\n"
@ -4392,7 +4409,7 @@ static const cgShaderDef_t cg_renderprogs[] =
" float shadow = texture( samp5, shadowTexcoord.xywz );\n"
"#endif\n"
"\n"
" result.color.xyz = ( diffuseColor + specularColor ) * halfLdotN * lightColor * fragment.color.rgb * shadow;// + rimColor;\n"
" result.color.xyz = ( diffuseColor + specularColor ) * lambert * lightColor * fragment.color.rgb * shadow;// + rimColor;\n"
" result.color.w = 1.0;\n"
"}\n"
"\n"

View file

@ -146,6 +146,9 @@ idCVar r_skipPrelightShadows( "r_skipPrelightShadows", "0", CVAR_RENDERER | CVAR
idCVar r_useScissor( "r_useScissor", "1", CVAR_RENDERER | CVAR_BOOL, "scissor clip as portals and lights are processed" );
idCVar r_useLightDepthBounds( "r_useLightDepthBounds", "1", CVAR_RENDERER | CVAR_BOOL, "use depth bounds test on lights to reduce both shadow and interaction fill" );
idCVar r_useShadowDepthBounds( "r_useShadowDepthBounds", "1", CVAR_RENDERER | CVAR_BOOL, "use depth bounds test on individual shadow volumes to reduce shadow fill" );
// RB begin
idCVar r_useHalfLambertLighting( "r_useHalfLambertLighting", "1", CVAR_RENDERER | CVAR_BOOL | CVAR_ARCHIVE, "use Half-Lambert lighting instead of classic Lambert, requires reloadShaders" );
// RB end
idCVar r_screenFraction( "r_screenFraction", "100", CVAR_RENDERER | CVAR_INTEGER, "for testing fill rate, the resolution of the entire screen can be changed" );
idCVar r_usePortals( "r_usePortals", "1", CVAR_RENDERER | CVAR_BOOL, " 1 = use portals to perform area culling, otherwise draw everything" );

View file

@ -958,6 +958,7 @@ extern idCVar r_useLightDepthBounds; // use depth bounds test on lights to redu
extern idCVar r_useShadowDepthBounds; // use depth bounds test on individual shadows to reduce shadow fill
// RB begin
extern idCVar r_useShadowMapping; // use shadow mapping instead of stencil shadows
extern idCVar r_useHalfLambertLighting; // use Half-Lambert lighting instead of classic Lambert
// RB end
extern idCVar r_skipStaticInteractions; // skip interactions created at level load