These lines work (compile fine):

float4 offset = HeightMap.Sample(HeightSampler, input.Texcoord);
input.Position.xyzw += float4(0, 1, 0, 0);

These do not (any use of offset together with input/output Position causes the error):

float4 offset = HeightMap.Sample(HeightSampler, input.Texcoord);
input.Position.xyzw += offset;

No matter what I try to do to use the offset values to change the positions it breaks:

float4 offset = HeightMap.Sample(HeightSampler, input.Texcoord);
matrix<float, 4, 4> offs = {
    1, 0, 0, 0,
    0, 1, 0, 0,
    0, 0, 1, 0,
    offset.x, offset.y, offset.z, 1

output.Position = input.Position;
output.Position = mul(output.Position, offs);

Debug output:

(32,9): error X4532: cannot map expression to vs_5_0 instruction set
(62,19): There was an error compiling expression
(49): Error compiling effect hr=S_OK (0x00000000)

Anyone have an idea why?

  • \$\begingroup\$ A guess is that it validates the syntax but leaves some validation to when actually emitting instructions. If it's optimized away due to not being used, no instructions need to be emitted and it may appear to "work". \$\endgroup\$ – Lars Viklund Aug 16 '11 at 9:00
  • \$\begingroup\$ Yeah that was my thought as well. Compiler probably just removes the items that end up not affecting the final output altogether. What a smart compiler ;) \$\endgroup\$ – mikeschuld Aug 17 '11 at 19:39

The problem is that you can't use a simple Sample() call in the vertex shader as it doesn't know what mipmap level to sample from, so the data coming back can't really be a float 4 and the call just doesn't really make sense. In the pixel shader, you need to use:

float4 offset = HeightMap.SampleLevel(HeightSampler, input.Texcoord, 0);

Changing to that worked perfectly.


  • \$\begingroup\$ You star, thank you for coming back to share the solution \$\endgroup\$ – Baggers Dec 3 '19 at 20:53

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.