relief mapping: artifacts at polygon boundaries

Hi,
I’ve been trying to implement the Relief Mapping algorithm found in GPUGems3, which works quite well. However, I’ve encountered some strange artifacts. When I enable mipmapping, I get wrong pixels at the boundaries between the two triangles as seen in the picture.
I’ve also tried a simple linear search which yields the same results.
With disabled mip-mapping the result is correct and without relief mapping and enabled mipmapping the result is also correct.
The resulting texture coords are correct, it’s just that sampling these coords in a mipmapped texture leads to wrong results.

Has anyone encountered such a problem before?
Thanks,

Is your sample inside of a conditional?

Derivatives are undefined inside conditionals. That’s why we have texture*Grad().

The texture is not sampled inside a conditional.
I don’t quite understand what you mean by texture*Grad(). As far as I understand it, mipmapping needs the derivative to work, but I don’t see how I can influence this process at all.
Maybe I’m doing something else wrong in the shader?
vertex shader:


varying vec2 vTexCoord;
varying vec3 lightDir, vEyeVec, vTangent, vBinormal, vNormal, vPos;

uniform vec3 vPlayerPosition;

void main()
{	
	vTangent  = gl_MultiTexCoord0.rgb;
	vBinormal = gl_MultiTexCoord1.rgb;
	vNormal   = gl_Normal.rgb;
	
		
	mat3 TBNMatrix = mat3(vTangent, vBinormal, vNormal);
	vEyeVec = vPlayerPosition - gl_Vertex.rgb;
	vEyeVec *= TBNMatrix;
	
	vTexCoord = gl_MultiTexCoord2.rg;
  
	gl_Position = ftransform();		
}

fragment shader:


varying vec2 vTexCoord;
varying vec3 lightDir, vEyeVec, vTangent, vBinormal, vNormal, vPos;

uniform vec3 vPlayerPosition;
uniform sampler2D oDiffuse;
uniform sampler2D oHeight;
 
 
void main (void)
{
	const float fDepthScale = 0.1;
	const int iNumSteps = 50;
	
	int iStep = 0;
	float fStep = (1.0 / float(iNumSteps));
	
	vec2 vDelta = (vEyeVec.xy * fDepthScale / (float(iNumSteps) * vEyeVec.z));
	vec2 vCoord = vTexCoord.xy;

	float fHeight = 1.0;
	vec4 vNormal = vec4(0.0);
		
	//linear search
	while (iStep < iNumSteps)
	{
		vNormal = (1.0 - texture2D (oHeight, vCoord));
		iStep++;
		fHeight -= fStep;
		vCoord -= vDelta;
		
		if(vNormal.r > fHeight)
		{
			break;
		}
	}

	gl_FragColor.rgb = texture2D (oDiffuse, vCoord.xy).rgb;
}

Now I understand you^^
I actually didn’t know there was a texture2DGrad function.
By using
vec2 dPdx = dFdx(vTexCoord);
vec2 dPdy = dFdy(vTexCoord);
and
gl_FragColor.rgb = texture2DGrad(oDiffuse, vCoord, dPdx, dPdy).rgb;
to sample the texture I did solve the problem.

Thank you very much for your help!

On ATI, you have to use texture2DdP_ARB or texture2DGradARB