diff options
author | SmileTheory <SmileTheory@gmail.com> | 2013-09-24 03:29:49 -0700 |
---|---|---|
committer | Tim Angus <tim@ngus.net> | 2014-06-17 17:43:34 +0100 |
commit | 20086c573fcd1532b6d82f94b0930c52d3802a56 (patch) | |
tree | 04b58f7a24b964be592261e1a416396e09ed5aff /src | |
parent | d941d27dfddb30cb6ac4f10fec3124d04bcc11e2 (diff) |
OpenGL2: Remove AGEN_FRESNEL(superceded by cubemap patch), and some small fixes and optimizations.
Diffstat (limited to 'src')
-rw-r--r-- | src/renderergl2/glsl/fogpass_vp.glsl | 12 | ||||
-rw-r--r-- | src/renderergl2/glsl/generic_vp.glsl | 33 | ||||
-rw-r--r-- | src/renderergl2/glsl/lightall_fp.glsl | 92 | ||||
-rw-r--r-- | src/renderergl2/glsl/lightall_vp.glsl | 26 | ||||
-rw-r--r-- | src/renderergl2/tr_glsl.c | 5 | ||||
-rw-r--r-- | src/renderergl2/tr_local.h | 1 | ||||
-rw-r--r-- | src/renderergl2/tr_shade.c | 149 | ||||
-rw-r--r-- | src/renderergl2/tr_shader.c | 50 |
8 files changed, 156 insertions, 212 deletions
diff --git a/src/renderergl2/glsl/fogpass_vp.glsl b/src/renderergl2/glsl/fogpass_vp.glsl index 40d14d9f..ce0e015b 100644 --- a/src/renderergl2/glsl/fogpass_vp.glsl +++ b/src/renderergl2/glsl/fogpass_vp.glsl @@ -85,13 +85,13 @@ float CalcFog(vec4 position) float s = dot(position, u_FogDistance) * 8.0; float t = dot(position, u_FogDepth); - bool eyeOutside = u_FogEyeT < 0.0; - float t2 = float(t >= float(eyeOutside)); + float eyeOutside = step(0.0, -u_FogEyeT); + float fogged = step(eyeOutside, t); + + t = max(t, 1e-6); + t *= fogged / (t - u_FogEyeT * eyeOutside); - if (eyeOutside) - t2 *= t / (t - u_FogEyeT); - - return s * t2; + return s * t; } void main() diff --git a/src/renderergl2/glsl/generic_vp.glsl b/src/renderergl2/glsl/generic_vp.glsl index 9ad4489b..429d62f5 100644 --- a/src/renderergl2/glsl/generic_vp.glsl +++ b/src/renderergl2/glsl/generic_vp.glsl @@ -93,7 +93,7 @@ vec3 DeformPosition(const vec3 pos, const vec3 normal, const vec2 st) } else if (u_DeformGen == DGEN_WAVE_TRIANGLE) { - func = abs(fract(value + 0.75) - 0.5) * 4.0 - 1.0; + func = 1.0 - abs(4.0 * fract(value + 0.25) - 2.0); } else if (u_DeformGen == DGEN_WAVE_SAWTOOTH) { @@ -163,25 +163,20 @@ vec4 CalcColor(vec3 position, vec3 normal) color.rgb = clamp(u_DirectedLight * incoming + u_AmbientLight, 0.0, 1.0); } - vec3 toView = u_ViewOrigin - position; - vec3 viewer = normalize(u_ViewOrigin - position); + vec3 viewer = u_ViewOrigin - position; if (u_AlphaGen == AGEN_LIGHTING_SPECULAR) { - vec3 lightDir = normalize(vec3(-960.0, -1980.0, 96.0) - position.xyz); - vec3 halfangle = normalize(lightDir + viewer); + vec3 lightDir = normalize(vec3(-960.0, 1980.0, 96.0) - position.xyz); + vec3 reflected = -reflect(lightDir, normal); - color.a = pow(max(dot(normal, halfangle), 0.0), 8.0); + color.a = clamp(dot(reflected, normalize(viewer)), 0.0, 1.0); + color.a *= color.a; + color.a *= color.a; } else if (u_AlphaGen == AGEN_PORTAL) { - float alpha = length(toView) / u_PortalRange; - - color.a = clamp(alpha, 0.0, 1.0); - } - else if (u_AlphaGen == AGEN_FRESNEL) - { - color.a = 0.10 + 0.90 * pow(1.0 - dot(normal, viewer), 5); + color.a = clamp(length(viewer) / u_PortalRange, 0.0, 1.0); } return color; @@ -194,13 +189,13 @@ float CalcFog(vec4 position) float s = dot(position, u_FogDistance) * 8.0; float t = dot(position, u_FogDepth); - bool eyeOutside = u_FogEyeT < 0.0; - float t2 = float(t >= float(eyeOutside)); - - if (eyeOutside) - t2 *= t / (t - u_FogEyeT); + float eyeOutside = step(0.0, -u_FogEyeT); + float fogged = step(eyeOutside, t); + + t = max(t, 1e-6); + t *= fogged / (t - u_FogEyeT * eyeOutside); - return s * t2; + return s * t; } #endif diff --git a/src/renderergl2/glsl/lightall_fp.glsl b/src/renderergl2/glsl/lightall_fp.glsl index 5bc7b11a..f223bb0c 100644 --- a/src/renderergl2/glsl/lightall_fp.glsl +++ b/src/renderergl2/glsl/lightall_fp.glsl @@ -176,17 +176,21 @@ float CalcBlinn(float NH, float shininess) #endif } -float CalcGGX(float NH, float shininess) +float CalcGGX(float NH, float gloss) { - // from http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes.pdf - float m_sq = 2.0 / shininess; - float d = ((NH * NH) * (m_sq - 1.0) + 1.0); - return m_sq / (d * d); + // from http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf + float a_sq = exp2(gloss * -13.0 + 1.0); + float d = ((NH * NH) * (a_sq - 1.0) + 1.0); + return a_sq / (d * d); } float CalcFresnel(float EH) { #if 1 + // From http://blog.selfshadow.com/publications/s2013-shading-course/lazarov/s2013_pbs_black_ops_2_notes.pdf + // not accurate, but fast + return exp2(-10.0 * EH); +#elif 0 // From http://seblagarde.wordpress.com/2012/06/03/spherical-gaussien-approximation-for-blinn-phong-phong-and-fresnel/ return exp2((-5.55473 * EH - 6.98316) * EH); #elif 0 @@ -196,42 +200,48 @@ float CalcFresnel(float EH) return blend; #else - return pow(1.0 - NH, 5.0); + return pow(1.0 - EH, 5.0); #endif } -float CalcVisibility(float NH, float NL, float NE, float EH, float shininess) +float CalcVisibility(float NH, float NL, float NE, float EH, float gloss) { -#if 0 - float geo = 2.0 * NH * min(NE, NL); - geo /= max(EH, geo); - - return geo; -#else - // Modified from http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes.pdf - // NL, NE in numerator factored out from cook-torrance +#if 1 + // From http://blog.selfshadow.com/publications/s2013-shading-course/lazarov/s2013_pbs_black_ops_2_notes.pdf + float k = min(1.0, gloss + 0.545); + return 1.0 / (k * EH * EH + (1.0 - k)); +#elif 0 + float roughness = exp2(gloss * -6.5); + #if defined(USE_GGX) - float roughness = sqrt(2.0 / (shininess + 2.0)); - float k = (roughness + 1.0); + // From http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf + float k = roughness + 1.0; k *= k * 0.125; #else - float k = 2.0 / sqrt(3.1415926535 * (shininess + 2.0)); + float k = roughness; #endif + // Modified from http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf + // NL, NE in numerator factored out from cook-torrance float k2 = 1.0 - k; float invGeo1 = NL * k2 + k; float invGeo2 = NE * k2 + k; return 1.0 / (invGeo1 * invGeo2); - #endif +#else + float geo = 2.0 * NH * min(NE, NL); + geo /= max(EH, geo); + + return geo; +#endif } -vec3 CalcSpecular(vec3 specular, float NH, float NL, float NE, float EH, float shininess) +vec3 CalcSpecular(vec3 specular, float NH, float NL, float NE, float EH, float gloss, float shininess) { float blinn = CalcBlinn(NH, shininess); vec3 fSpecular = mix(specular, vec3(1.0), CalcFresnel(EH)); - float vis = CalcVisibility(NH, NL, NE, EH, shininess); + float vis = CalcVisibility(NH, NL, NE, EH, gloss); #if defined(USE_BLINN) // Normalized Blinn-Phong @@ -330,13 +340,12 @@ void main() #endif vec4 diffuse = texture2D(u_DiffuseMap, texCoords); - -#if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT) - - #if defined(USE_LINEAR_LIGHT) +#if defined(USE_GAMMA2_TEXTURES) diffuse.rgb *= diffuse.rgb; - #endif +#endif + +#if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT) #if defined(USE_NORMALMAP) #if defined(SWIZZLE_NORMALMAP) N.xy = 2.0 * texture2D(u_NormalMap, texCoords).ag - vec2(1.0); @@ -361,9 +370,9 @@ void main() // surfaces not facing the light are always shadowed #if defined(USE_TANGENT_SPACE_LIGHT) - shadowValue *= float(var_PrimaryLightDir.z > 0.0); + shadowValue *= step(0.0, var_PrimaryLightDir.z); #else - shadowValue *= float(dot(var_Normal.xyz, var_PrimaryLightDir.xyz) > 0.0); + shadowValue *= step(0.0, dot(var_Normal.xyz, var_PrimaryLightDir.xyz)); #endif #if defined(SHADOWMAP_MODULATE) @@ -403,9 +412,9 @@ void main() #if defined(USE_SPECULARMAP) vec4 specular = texture2D(u_SpecularMap, texCoords); - #if defined(USE_LINEAR_LIGHT) + #if defined(USE_GAMMA2_TEXTURES) specular.rgb *= specular.rgb; - #endif + #endif #else vec4 specular = vec4(1.0); #endif @@ -414,7 +423,6 @@ void main() float gloss = specular.a; float shininess = exp2(gloss * 13.0); - float localOcclusion = clamp((diffuse.r + diffuse.g + diffuse.b) * 16.0f, 0.0, 1.0); #if defined(SPECULAR_IS_METALLIC) // diffuse is actually base color, and red of specular is metallicness @@ -431,10 +439,12 @@ void main() reflectance = CalcDiffuse(diffuse.rgb, N, L, E, NE, NL, shininess); #if defined(r_deluxeSpecular) || defined(USE_LIGHT_VECTOR) + float adjGloss = gloss; float adjShininess = shininess; #if !defined(USE_LIGHT_VECTOR) - adjShininess = exp2(gloss * r_deluxeSpecular * 13.0); + adjGloss *= r_deluxeSpecular; + adjShininess = exp2(adjGloss * 13.0); #endif H = normalize(L + E); @@ -443,9 +453,9 @@ void main() NH = clamp(dot(N, H), 0.0, 1.0); #if !defined(USE_LIGHT_VECTOR) - reflectance += CalcSpecular(specular.rgb, NH, NL, NE, EH, adjShininess) * r_deluxeSpecular * localOcclusion; + reflectance += CalcSpecular(specular.rgb, NH, NL, NE, EH, adjGloss, adjShininess) * r_deluxeSpecular; #else - reflectance += CalcSpecular(specular.rgb, NH, NL, NE, EH, adjShininess) * localOcclusion; + reflectance += CalcSpecular(specular.rgb, NH, NL, NE, EH, adjGloss, adjShininess); #endif #endif @@ -462,10 +472,6 @@ void main() vec3 cubeLightColor = textureCubeLod(u_CubeMap, R, 7.0 - gloss * 7.0).rgb; - #if defined(USE_LINEAR_LIGHT) - cubeLightColor *= cubeLightColor; - #endif - #if defined(USE_LIGHTMAP) cubeLightColor *= lightSample.rgb; #elif defined (USE_LIGHT_VERTEX) @@ -475,11 +481,11 @@ void main() #endif //gl_FragColor.rgb += diffuse.rgb * textureCubeLod(u_CubeMap, N, 7.0).rgb; - gl_FragColor.rgb += cubeLightColor * reflectance * localOcclusion; + gl_FragColor.rgb += cubeLightColor * reflectance; #endif #if defined(USE_PRIMARY_LIGHT) - L = normalize(var_PrimaryLightDir.xyz); + L = var_PrimaryLightDir.xyz; //normalize(var_PrimaryLightDir.xyz); NL = clamp(dot(N, L), 0.0, 1.0); H = normalize(L + E); @@ -487,7 +493,7 @@ void main() NH = clamp(dot(N, H), 0.0, 1.0); reflectance = CalcDiffuse(diffuse.rgb, N, L, E, NE, NL, shininess); - reflectance += CalcSpecular(specular.rgb, NH, NL, NE, EH, shininess); + reflectance += CalcSpecular(specular.rgb, NH, NL, NE, EH, gloss, shininess); lightColor = u_PrimaryLightColor; // * CalcLightAttenuation(L, u_PrimaryLightDir.w); @@ -497,10 +503,6 @@ void main() gl_FragColor.rgb += lightColor * reflectance * NL; #endif - - #if defined(USE_LINEAR_LIGHT) - gl_FragColor.rgb = sqrt(gl_FragColor.rgb); - #endif gl_FragColor.a = diffuse.a; #else diff --git a/src/renderergl2/glsl/lightall_vp.glsl b/src/renderergl2/glsl/lightall_vp.glsl index 8230b9db..d9655ebe 100644 --- a/src/renderergl2/glsl/lightall_vp.glsl +++ b/src/renderergl2/glsl/lightall_vp.glsl @@ -113,7 +113,7 @@ vec2 ModTexCoords(vec2 st, vec3 position, vec4 texMatrix, vec4 offTurb) float phase = offTurb.w; vec2 st2 = vec2(dot(st, texMatrix.xz), dot(st, texMatrix.yw)) + offTurb.xy; - vec3 offsetPos = position * 0.0009765625; + vec3 offsetPos = position / 1024.0; offsetPos.x += offsetPos.z; vec2 texOffset = sin((offsetPos.xy + vec2(phase)) * 2.0 * M_PI); @@ -183,7 +183,7 @@ void main() #if defined(USE_LIGHT_VECTOR) vec3 L = u_LightOrigin.xyz - (position * u_LightOrigin.w); -#elif defined(USE_LIGHT) && !defined(USE_LIGHT_VECTOR) +#elif defined(USE_LIGHT) && !defined(USE_DELUXEMAP) vec3 L = attr_LightDirection; #if defined(USE_MODELMATRIX) L = (u_ModelMatrix * vec4(L, 0.0)).xyz; @@ -194,12 +194,10 @@ void main() var_TexCoords.zw = attr_TexCoord1.st; #endif + var_Color = u_VertColor * attr_Color + u_BaseColor; #if defined(USE_LIGHT_VERTEX) && !defined(USE_FAST_LIGHT) - var_LightColor = u_VertColor.rgb * attr_Color.rgb; + var_LightColor = var_Color.rgb; var_Color.rgb = vec3(1.0); - var_Color.a = u_VertColor.a * attr_Color.a + u_BaseColor.a; -#else - var_Color = u_VertColor * attr_Color + u_BaseColor; #endif #if defined(USE_LIGHT_VECTOR) && defined(USE_FAST_LIGHT) @@ -209,14 +207,8 @@ void main() var_Color.rgb *= u_DirectedLight * attenuation * NL + u_AmbientLight; #endif -#if (defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)) || defined(USE_PARALLAXMAP) - var_Normal.xyz = normal; - var_Tangent.xyz = tangent; - var_Bitangent.xyz = bitangent; -#endif - #if defined(USE_PRIMARY_LIGHT) || defined(USE_SHADOWMAP) - var_PrimaryLightDir.xyz = (u_PrimaryLightOrigin.xyz - (position * u_PrimaryLightOrigin.w)); + var_PrimaryLightDir.xyz = u_PrimaryLightOrigin.xyz - (position * u_PrimaryLightOrigin.w); var_PrimaryLightDir.w = u_PrimaryLightRadius * u_PrimaryLightRadius; #endif @@ -229,7 +221,7 @@ void main() #endif #if (defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)) || defined(USE_PARALLAXMAP) - vec3 viewDir = (u_ViewOrigin - position); + vec3 viewDir = u_ViewOrigin - position; #endif #if defined(USE_TANGENT_SPACE_LIGHT) @@ -250,8 +242,8 @@ void main() #if (defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)) || defined(USE_PARALLAXMAP) // store view direction in tangent space to save on varyings - var_Normal.w = viewDir.x; - var_Tangent.w = viewDir.y; - var_Bitangent.w = viewDir.z; + var_Normal = vec4(normal, viewDir.x); + var_Tangent = vec4(tangent, viewDir.y); + var_Bitangent = vec4(bitangent, viewDir.z); #endif } diff --git a/src/renderergl2/tr_glsl.c b/src/renderergl2/tr_glsl.c index a2707cd0..93884b91 100644 --- a/src/renderergl2/tr_glsl.c +++ b/src/renderergl2/tr_glsl.c @@ -294,11 +294,9 @@ static void GLSL_GetShaderHeader( GLenum shaderType, const GLcharARB *extra, cha "#define alphaGen_t\n" "#define AGEN_LIGHTING_SPECULAR %i\n" "#define AGEN_PORTAL %i\n" - "#define AGEN_FRESNEL %i\n" "#endif\n", AGEN_LIGHTING_SPECULAR, - AGEN_PORTAL, - AGEN_FRESNEL)); + AGEN_PORTAL)); Q_strcat(dest, size, va("#ifndef texenv_t\n" @@ -1829,7 +1827,6 @@ shaderProgram_t *GLSL_GetGenericShaderProgram(int stage) { case AGEN_LIGHTING_SPECULAR: case AGEN_PORTAL: - case AGEN_FRESNEL: shaderAttribs |= GENERICDEF_USE_RGBAGEN; break; default: diff --git a/src/renderergl2/tr_local.h b/src/renderergl2/tr_local.h index ae13b9a8..394f7893 100644 --- a/src/renderergl2/tr_local.h +++ b/src/renderergl2/tr_local.h @@ -242,7 +242,6 @@ typedef enum { AGEN_WAVEFORM, AGEN_PORTAL, AGEN_CONST, - AGEN_FRESNEL } alphaGen_t; typedef enum { diff --git a/src/renderergl2/tr_shade.c b/src/renderergl2/tr_shade.c index f679ddee..a6b956bb 100644 --- a/src/renderergl2/tr_shade.c +++ b/src/renderergl2/tr_shade.c @@ -424,44 +424,27 @@ static void ProjectDlightTexture( void ) { static void ComputeShaderColors( shaderStage_t *pStage, vec4_t baseColor, vec4_t vertColor ) { + baseColor[0] = + baseColor[1] = + baseColor[2] = + baseColor[3] = 1.0f; + + vertColor[0] = + vertColor[1] = + vertColor[2] = + vertColor[3] = 0.0f; + // // rgbGen // switch ( pStage->rgbGen ) { - case CGEN_IDENTITY: - baseColor[0] = - baseColor[1] = - baseColor[2] = - baseColor[3] = 1.0f; - - vertColor[0] = - vertColor[1] = - vertColor[2] = - vertColor[3] = 0.0f; - break; case CGEN_IDENTITY_LIGHTING: baseColor[0] = baseColor[1] = baseColor[2] = tr.identityLight; - baseColor[3] = 1.0f; - - vertColor[0] = - vertColor[1] = - vertColor[2] = - vertColor[3] = 0.0f; break; case CGEN_EXACT_VERTEX: - baseColor[0] = - baseColor[1] = - baseColor[2] = - baseColor[3] = 0.0f; - - vertColor[0] = - vertColor[1] = - vertColor[2] = - vertColor[3] = 1.0f; - break; case CGEN_EXACT_VERTEX_LIT: baseColor[0] = baseColor[1] = @@ -478,11 +461,6 @@ static void ComputeShaderColors( shaderStage_t *pStage, vec4_t baseColor, vec4_t baseColor[1] = pStage->constantColor[1] / 255.0f; baseColor[2] = pStage->constantColor[2] / 255.0f; baseColor[3] = pStage->constantColor[3] / 255.0f; - - vertColor[0] = - vertColor[1] = - vertColor[2] = - vertColor[3] = 0.0f; break; case CGEN_VERTEX: baseColor[0] = @@ -510,12 +488,10 @@ static void ComputeShaderColors( shaderStage_t *pStage, vec4_t baseColor, vec4_t baseColor[0] = baseColor[1] = baseColor[2] = tr.identityLight; - baseColor[3] = 1.0f; vertColor[0] = vertColor[1] = vertColor[2] = -tr.identityLight; - vertColor[3] = 0.0f; break; case CGEN_FOG: { @@ -528,22 +504,11 @@ static void ComputeShaderColors( shaderStage_t *pStage, vec4_t baseColor, vec4_t baseColor[2] = ((unsigned char *)(&fog->colorInt))[2] / 255.0f; baseColor[3] = ((unsigned char *)(&fog->colorInt))[3] / 255.0f; } - - vertColor[0] = - vertColor[1] = - vertColor[2] = - vertColor[3] = 0.0f; break; case CGEN_WAVEFORM: baseColor[0] = baseColor[1] = baseColor[2] = RB_CalcWaveColorSingle( &pStage->rgbWave ); - baseColor[3] = 1.0f; - - vertColor[0] = - vertColor[1] = - vertColor[2] = - vertColor[3] = 0.0f; break; case CGEN_ENTITY: if (backEnd.currentEntity) @@ -553,11 +518,6 @@ static void ComputeShaderColors( shaderStage_t *pStage, vec4_t baseColor, vec4_t baseColor[2] = ((unsigned char *)backEnd.currentEntity->e.shaderRGBA)[2] / 255.0f; baseColor[3] = ((unsigned char *)backEnd.currentEntity->e.shaderRGBA)[3] / 255.0f; } - - vertColor[0] = - vertColor[1] = - vertColor[2] = - vertColor[3] = 0.0f; break; case CGEN_ONE_MINUS_ENTITY: if (backEnd.currentEntity) @@ -567,23 +527,10 @@ static void ComputeShaderColors( shaderStage_t *pStage, vec4_t baseColor, vec4_t baseColor[2] = 1.0f - ((unsigned char *)backEnd.currentEntity->e.shaderRGBA)[2] / 255.0f; baseColor[3] = 1.0f - ((unsigned char *)backEnd.currentEntity->e.shaderRGBA)[3] / 255.0f; } - - vertColor[0] = - vertColor[1] = - vertColor[2] = - vertColor[3] = 0.0f; break; + case CGEN_IDENTITY: case CGEN_LIGHTING_DIFFUSE: case CGEN_BAD: - baseColor[0] = - baseColor[1] = - baseColor[2] = - baseColor[3] = 1.0f; - - vertColor[0] = - vertColor[1] = - vertColor[2] = - vertColor[3] = 0.0f; break; } @@ -594,10 +541,6 @@ static void ComputeShaderColors( shaderStage_t *pStage, vec4_t baseColor, vec4_t { case AGEN_SKIP: break; - case AGEN_IDENTITY: - baseColor[3] = 1.0f; - vertColor[3] = 0.0f; - break; case AGEN_CONST: baseColor[3] = pStage->constantColor[3] / 255.0f; vertColor[3] = 0.0f; @@ -628,9 +571,9 @@ static void ComputeShaderColors( shaderStage_t *pStage, vec4_t baseColor, vec4_t baseColor[3] = 1.0f; vertColor[3] = -1.0f; break; + case AGEN_IDENTITY: case AGEN_LIGHTING_SPECULAR: case AGEN_PORTAL: - case AGEN_FRESNEL: // Done entirely in vertex program baseColor[3] = 1.0f; vertColor[3] = 0.0f; @@ -1083,7 +1026,7 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input ) if (backEnd.depthFill) { - if (pStage->glslShaderGroup) + if (pStage->glslShaderGroup == tr.lightallShader) { int index = 0; @@ -1121,7 +1064,7 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input ) sp = &tr.genericShader[shaderAttribs]; } } - else if (pStage->glslShaderGroup) + else if (pStage->glslShaderGroup == tr.lightallShader) { int index = pStage->glslShaderIndex; @@ -1147,10 +1090,7 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input ) sp = &pStage->glslShaderGroup[index]; - if (pStage->glslShaderGroup == tr.lightallShader) - { - backEnd.pc.c_lightallDraws++; - } + backEnd.pc.c_lightallDraws++; } else { @@ -1270,7 +1210,7 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input ) else if ( pStage->bundle[TB_COLORMAP].image[0] != 0 ) R_BindAnimatedImageToTMU( &pStage->bundle[TB_COLORMAP], TB_COLORMAP ); } - else if ( pStage->glslShaderGroup ) + else if ( pStage->glslShaderGroup == tr.lightallShader ) { int i; @@ -1286,13 +1226,29 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input ) { for (i = 0; i < NUM_TEXTURE_BUNDLES; i++) { - if (i == TB_LIGHTMAP) - { - R_BindAnimatedImageToTMU( &pStage->bundle[i], i); - } - else if (pStage->bundle[i].image[0]) + image_t *img; + + if (pStage->bundle[i].image[0]) { - GL_BindToTMU( tr.whiteImage, i); + switch(i) + { + case TB_LIGHTMAP: + R_BindAnimatedImageToTMU( &pStage->bundle[TB_LIGHTMAP], i); + break; + + case TB_DIFFUSEMAP: + case TB_SPECULARMAP: + case TB_SHADOWMAP: + case TB_CUBEMAP: + default: + GL_BindToTMU( tr.whiteImage, i); + break; + + case TB_NORMALMAP: + case TB_DELUXEMAP: + GL_BindToTMU( tr.greyImage, i); + break; + } } } } @@ -1300,15 +1256,32 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input ) { for (i = 0; i < NUM_TEXTURE_BUNDLES; i++) { - if (i == TB_LIGHTMAP) - { - R_BindAnimatedImageToTMU( &pStage->bundle[TB_DELUXEMAP], i); - } - else if (pStage->bundle[i].image[0]) + image_t *img; + + if (pStage->bundle[i].image[0]) { - GL_BindToTMU( tr.whiteImage, i); + switch(i) + { + case TB_LIGHTMAP: + R_BindAnimatedImageToTMU( &pStage->bundle[TB_DELUXEMAP], i); + break; + + case TB_DIFFUSEMAP: + case TB_SPECULARMAP: + case TB_SHADOWMAP: + case TB_CUBEMAP: + default: + GL_BindToTMU( tr.whiteImage, i); + break; + + case TB_NORMALMAP: + case TB_DELUXEMAP: + GL_BindToTMU( tr.greyImage, i); + break; + } } } + } else { diff --git a/src/renderergl2/tr_shader.c b/src/renderergl2/tr_shader.c index 5057b436..36e159b4 100644 --- a/src/renderergl2/tr_shader.c +++ b/src/renderergl2/tr_shader.c @@ -1110,10 +1110,6 @@ static qboolean ParseStage( shaderStage_t *stage, char **text ) shader.portalRange = atof( token ); } } - else if ( !Q_stricmp( token, "fresnel" ) ) - { - stage->alphaGen = AGEN_FRESNEL; - } else { ri.Printf( PRINT_WARNING, "WARNING: unknown alphaGen parameter '%s' in shader '%s'\n", token, shader.name ); @@ -2012,7 +2008,6 @@ static void ComputeVertexAttribs(void) switch(pStage->alphaGen) { case AGEN_LIGHTING_SPECULAR: - case AGEN_FRESNEL: shader.vertexAttribs |= ATTR_NORMAL; break; @@ -2248,15 +2243,6 @@ static void CollapseStagesToLightall(shaderStage_t *diffuse, defs |= LIGHTDEF_USE_PARALLAXMAP; } } - - if (!diffuse->bundle[TB_NORMALMAP].image[0]) - { - // use 0x80 image, shader will interpret as (0,0,1) - diffuse->bundle[TB_NORMALMAP] = diffuse->bundle[0]; - diffuse->bundle[TB_NORMALMAP].numImageAnimations = 0; - diffuse->bundle[TB_NORMALMAP].image[0] = tr.greyImage; - //ri.Printf(PRINT_ALL, ", normalmap %s", diffuse->bundle[TB_NORMALMAP].image[0]->imgName); - } } if (r_specularMapping->integer) @@ -2268,18 +2254,6 @@ static void CollapseStagesToLightall(shaderStage_t *diffuse, diffuse->materialInfo[0] = specular->materialInfo[0]; diffuse->materialInfo[1] = specular->materialInfo[1]; } - else if (lightmap || useLightVector || useLightVertex) - { - // use a white image, materialinfo will do the rest - diffuse->bundle[TB_SPECULARMAP] = diffuse->bundle[0]; - diffuse->bundle[TB_SPECULARMAP].numImageAnimations = 0; - diffuse->bundle[TB_SPECULARMAP].image[0] = tr.whiteImage; - if (!diffuse->materialInfo[0]) - diffuse->materialInfo[0] = r_baseSpecular->value; - if (!diffuse->materialInfo[1]) - diffuse->materialInfo[1] = r_baseGloss->value; - //ri.Printf(PRINT_ALL, ", specularmap %s", diffuse->bundle[TB_SPECULARMAP].image[0]->imgName); - } } if (tcgen || diffuse->bundle[0].numTexMods) @@ -2373,7 +2347,6 @@ static qboolean CollapseStagesToGLSL(void) { case AGEN_LIGHTING_SPECULAR: case AGEN_PORTAL: - case AGEN_FRESNEL: skip = qtrue; break; default: @@ -2582,7 +2555,7 @@ static qboolean CollapseStagesToGLSL(void) } } - // convert any remaining lightingdiffuse stages to a lighting pass + // insert default normal and specular textures if necessary for (i = 0; i < MAX_SHADER_STAGES; i++) { shaderStage_t *pStage = &stages[i]; @@ -2590,13 +2563,26 @@ static qboolean CollapseStagesToGLSL(void) if (!pStage->active) continue; - if (pStage->rgbGen == CGEN_LIGHTING_DIFFUSE) + if (pStage->glslShaderGroup != tr.lightallShader) + continue; + + if ((pStage->glslShaderIndex & LIGHTDEF_LIGHTTYPE_MASK) == 0) + continue; + + if (!pStage->bundle[TB_NORMALMAP].image[0] && r_normalMapping->integer) { - pStage->glslShaderGroup = tr.lightallShader; - pStage->glslShaderIndex = LIGHTDEF_USE_LIGHT_VECTOR; + pStage->bundle[TB_NORMALMAP].image[0] = tr.greyImage; } - } + if (!pStage->bundle[TB_SPECULARMAP].image[0] && r_specularMapping->integer) + { + pStage->bundle[TB_SPECULARMAP].image[0] = tr.whiteImage; + if (!pStage->materialInfo[0]) + pStage->materialInfo[0] = r_baseSpecular->value; + if (!pStage->materialInfo[1]) + pStage->materialInfo[1] = r_baseGloss->value; + } + } return numStages; } |