Jump to content

  • Log In with Google      Sign In   
  • Create Account


viX0026

Member Since 18 Sep 2013
Offline Last Active May 03 2014 01:40 AM
-----

Topics I've Started

Some Problem when trying to implement ParallaxMapping

24 October 2013 - 09:38 PM

Hi, guys, I'm trying to implement parallax mapping in hlsl, I use the algorithm in "ParallaxOcclusionMapping" in D3D Sample, But I always get a complie error X3511: Unable to unroll loop, loop does not appear to terminate in a timely manner (1024 iterations). I have tried on RenderMonkey and D3D9, neither of them works. Here is my code(simplified, I just implemented the height profile-ray intersection):

struct PS_INPUT
{
    float2 texCoord    : TEXCOORD0;
    float3 vLightDirTS : TEXCOORD1;
    float3 vViewDirTS  : TEXCOORD2;
    float3 vNormalWS   : TEXCOORD3;
    float3 vViewDirWS  : TEXCOORD4;
};


float4 CalculateLighting(float3 vViewTS, float3 vLightTS, float2 texCoord)
{
    float3 vNormalTS = normalize(tex2D(tNormalHeightMap, texCoord).xyz * 2 - 1);
    float4 cBaseColor = tex2D(tBase, texCoord);
    float4 cDiffuse = saturate(dot(vLightTS, vNormalTS)) * g_LightDiffuse;
    float4 cFinal = (g_LightAmbient + cDiffuse) * cBaseColor;
    return cFinal;
}

float4 PM_PS( VS_OUTPUT In ) : COLOR0
{ 
    float2 vOffsetTS = float2(In.vViewDirTS.x, In.vViewDirTS.y) / In.vViewDirTS.z;
    float3 vViewTS   = normalize(In.vViewDirTS);   // view direction in tangent space
    float3 vViewWS   = normalize(In.vViewDirWS);   // view direction in world space
    float3 vLightTS  = normalize(In.vLightDirTS);  // light direction in tangent space
    float3 vNormalWS = normalize(In.vNormalWS);    // normal in world space

    vOffsetTS *= g_fHeightMapScale;
    int NumSteps = (int)lerp(g_MaxSample, g_MinSample, max(dot(vNormalWS, vViewWS), 0.0f));
    float fStepSize = 1.0f / (float)NumSteps;
    float fCurrHeight = 0.0f;
    float fPrevHeight = 1.0f;
    float fCurrBound  = 1.0f;
    float fHeight = 0.0f;

    int nStepIndex = 0;
    float2 vTexOffsetPerStep = vOffsetTS * fStepSize;
    float2 vCurrTexCoord = In.texCoord;

	while(nStepIndex < NumSteps)   // height profile-ray intersection
	{
		vCurrTexCoord -= vTexOffsetPerStep;
		fCurrHeight = tex2D(tNormalHeightMap, vCurrTexCoord);
		fCurrBound -= fStepSize;
		if(fCurrHeight > fCurrHeight)   // we have found the intersection point
		{
			float delta1 = fCurrHeight - fCurrBound;
			float delta2 = fCurrBound + fStepSize - fPrevHeight;
			float alpha = delta1 / (delta1 + delta2);
			fHeight = 1.0f - lerp(fCurrHeight, fPrevHeight, alpha);  // calculate height approximately
			nStepIndex = NumSteps + 1;
		}
		else
		{
			fPrevHeight = fCurrHeight;
			nStepIndex++;
		}
	}

    float2 vParallaxOffset = vOffsetTS * fHeight;
    float2 texCoord = In.texCoord - vParallaxOffset;
   
    float4 cFinalColor = CalculateLighting(In.vViewDirTS, In.vLightDirTS, texCoord);
    return cFinalColor;
}

I compiled the "ParallaxOcclusionMapping" in D3D Sample, everything is OK. But mine couldn't work. I can't figure it out how to solve this problem.


PARTNERS