diff options
| -rw-r--r-- | src/renderergl2/glsl/lightall_fp.glsl | 14 | ||||
| -rw-r--r-- | src/renderergl2/tr_glsl.c | 4 | 
2 files changed, 17 insertions, 1 deletions
diff --git a/src/renderergl2/glsl/lightall_fp.glsl b/src/renderergl2/glsl/lightall_fp.glsl index f2da7821..d1155de4 100644 --- a/src/renderergl2/glsl/lightall_fp.glsl +++ b/src/renderergl2/glsl/lightall_fp.glsl @@ -100,6 +100,9 @@ float RayIntersectDisplaceMap(vec2 dp, vec2 ds, sampler2D normalMap)  	// best match found (starts with last position 1.0)  	float bestDepth = 1.0; +	// texture depth at best depth +	float texDepth = 0.0; +  	// search front to back for first point inside object  	for(int i = 0; i < linearSearchSteps - 1; ++i)  	{ @@ -109,11 +112,19 @@ float RayIntersectDisplaceMap(vec2 dp, vec2 ds, sampler2D normalMap)  		if(bestDepth > 0.996)		// if no depth found yet  			if(depth >= t) +			{  				bestDepth = depth;	// store best depth +				texDepth = t; +			}  	}  	depth = bestDepth; -	 + +#if !defined (USE_RELIEFMAP) +	float prevDepth = depth - size; +	float prevTexDepth = SampleDepth(normalMap, dp + ds * prevDepth); +	bestDepth -= size * (prevDepth - prevTexDepth) / (size - texDepth + prevTexDepth); +#else  	// recurse around first point (depth) for closest match  	for(int i = 0; i < binarySearchSteps; ++i)  	{ @@ -129,6 +140,7 @@ float RayIntersectDisplaceMap(vec2 dp, vec2 ds, sampler2D normalMap)  		depth += size;  	} +#endif  	return bestDepth;  } diff --git a/src/renderergl2/tr_glsl.c b/src/renderergl2/tr_glsl.c index 7dfea6a6..f526b8c6 100644 --- a/src/renderergl2/tr_glsl.c +++ b/src/renderergl2/tr_glsl.c @@ -1079,7 +1079,11 @@ void GLSL_InitGPUShaders(void)  #endif  				if ((i & LIGHTDEF_USE_PARALLAXMAP) && !(i & LIGHTDEF_ENTITY) && r_parallaxMapping->integer) +				{  					Q_strcat(extradefines, 1024, "#define USE_PARALLAXMAP\n"); +					if (r_parallaxMapping->integer > 1) +						Q_strcat(extradefines, 1024, "#define USE_RELIEFMAP\n"); +				}  			}  			if (r_specularMapping->integer)  | 
