Skip to content

Commit

Permalink
[MP] Rend2: rend2 is now up to date through ioq3 rend2 commits.
Browse files Browse the repository at this point in the history
Latest being "OpenGL2: Add normalScale and parallaxDepth stage keywords and helper cvars."
  • Loading branch information
ensiform committed Mar 4, 2014
1 parent 37a6878 commit 7181157
Show file tree
Hide file tree
Showing 11 changed files with 203 additions and 97 deletions.
35 changes: 26 additions & 9 deletions codemp/rd-rend2/glsl/lightall_fp.glsl
Expand Up @@ -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)
Expand All @@ -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;
Expand Down Expand Up @@ -167,7 +169,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));
Expand Down Expand Up @@ -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
Expand All @@ -378,8 +380,8 @@ void main()
#else
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.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
N = var_Normal.xyz;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -473,7 +476,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);
Expand Down
9 changes: 7 additions & 2 deletions codemp/rd-rend2/glsl/shadowmask_fp.glsl
Expand Up @@ -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
Expand All @@ -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;
Expand Down Expand Up @@ -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);
}

Expand All @@ -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;

Expand Down
3 changes: 2 additions & 1 deletion codemp/rd-rend2/tr_animation.cpp
Expand Up @@ -193,7 +193,8 @@ void R_MDRAddAnimSurfaces( trRefEntity_t *ent ) {

header = (mdrHeader_t *)tr.currentModel->data.mdr;

personalModel = (qboolean)((ent->e.renderfx & RF_THIRD_PERSON) && !tr.viewParms.isPortal);
personalModel = (qboolean)((ent->e.renderfx & RF_THIRD_PERSON) && !(tr.viewParms.isPortal
|| (tr.viewParms.flags & (VPF_SHADOWMAP | VPF_DEPTHSHADOW))));

if ( ent->e.renderfx & RF_WRAP_FRAMES )
{
Expand Down
3 changes: 2 additions & 1 deletion codemp/rd-rend2/tr_ghoul2.cpp
Expand Up @@ -3201,7 +3201,8 @@ void R_AddGhoulSurfaces( trRefEntity_t *ent ) {
RootMatrix(ghoul2,currentTime, ent->e.modelScale,rootMatrix);

// don't add third_person objects if not in a portal
personalModel = (qboolean)((ent->e.renderfx & RF_THIRD_PERSON) && !tr.viewParms.isPortal);
personalModel = (qboolean)((ent->e.renderfx & RF_THIRD_PERSON) && !(tr.viewParms.isPortal
|| (tr.viewParms.flags & (VPF_SHADOWMAP | VPF_DEPTHSHADOW))));

int modelList[256];
assert(ghoul2.size()<=255);
Expand Down
7 changes: 4 additions & 3 deletions codemp/rd-rend2/tr_glsl.cpp
Expand Up @@ -123,9 +123,10 @@ static uniformInfo_t uniformsInfo[] =
{ "u_ModelMatrix", GLSL_MAT16, 1 },
{ "u_ModelViewProjectionMatrix", GLSL_MAT16, 1 },

{ "u_Time", GLSL_FLOAT, 1 },
{ "u_VertexLerp" , GLSL_FLOAT, 1 },
{ "u_MaterialInfo", GLSL_VEC2, 1 },
{ "u_Time", GLSL_FLOAT, 1 },
{ "u_VertexLerp" , GLSL_FLOAT, 1 },
{ "u_NormalScale", GLSL_VEC4, 1 },
{ "u_SpecularScale", GLSL_VEC4, 1 },

{ "u_ViewInfo", GLSL_VEC4, 1 },
{ "u_ViewOrigin", GLSL_VEC3, 1 },
Expand Down
42 changes: 5 additions & 37 deletions codemp/rd-rend2/tr_image.cpp
Expand Up @@ -2913,44 +2913,20 @@ 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;
}

tr.identityLight = 1.0f / ( 1 << tr.overbrightBits );
tr.identityLightByte = 255 * tr.identityLight;


if ( r_intensity->value <= 1 ) {
ri->Cvar_Set( "r_intensity", "1" );
}
Expand All @@ -2963,14 +2939,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;

Expand All @@ -2988,7 +2956,7 @@ void R_SetColorMappings( void ) {
} else {
inf = 255 * pow ( i2/255.0f, 1.0f / g ) + 0.5f;
}
inf <<= shift;

if (inf < 0) {
inf = 0;
}
Expand Down
10 changes: 6 additions & 4 deletions codemp/rd-rend2/tr_init.cpp
Expand Up @@ -109,8 +109,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;
Expand Down Expand Up @@ -138,6 +136,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;
Expand Down Expand Up @@ -1234,8 +1235,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 );
Expand Down Expand Up @@ -1265,6 +1264,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 );
Expand Down
15 changes: 9 additions & 6 deletions codemp/rd-rend2/tr_local.h
Expand Up @@ -145,8 +145,6 @@ extern cvar_t *r_mergeLeafSurfaces;

extern cvar_t *r_cameraExposure;

extern cvar_t *r_softOverbright;

extern cvar_t *r_hdr;
extern cvar_t *r_postProcess;

Expand Down Expand Up @@ -713,7 +711,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;
Expand Down Expand Up @@ -1074,7 +1075,8 @@ typedef enum

UNIFORM_TIME,
UNIFORM_VERTEXLERP,
UNIFORM_MATERIALINFO,
UNIFORM_NORMALSCALE,
UNIFORM_SPECULARSCALE,

UNIFORM_VIEWINFO, // znear, zfar, width/2, height/2
UNIFORM_VIEWORIGIN,
Expand Down Expand Up @@ -2234,8 +2236,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;
Expand Down Expand Up @@ -2265,6 +2265,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;
Expand Down
29 changes: 26 additions & 3 deletions codemp/rd-rend2/tr_shade.cpp
Expand Up @@ -655,7 +655,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)
Expand Down Expand Up @@ -864,7 +864,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
Expand All @@ -875,11 +876,32 @@ 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)
{
Expand Down Expand Up @@ -1366,7 +1388,8 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input )

GLSL_SetUniformMatrix16(sp, UNIFORM_MODELMATRIX, backEnd.ori.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);

Expand Down

0 comments on commit 7181157

Please sign in to comment.