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.

**Edited by viX0026, 24 October 2013 - 09:40 PM.**