No announcement yet.

WorldDisplacement - no displace = black pixels

  • Filter
  • Time
  • Show
Clear All
new posts

    WorldDisplacement - no displace = black pixels

    Hello all,
    We know in Unreal, range displacement goes from fully black pixels to fully white pixels : world displacement works with positives values :

    Click image for larger version  Name:	20200115_08h01_19.jpg Views:	3 Size:	8.8 KB ID:	1708865

    That is not the way other programs works where middle grey pixels are not affected by displacement distance (3ds, blender...): dark tones go down, and light tones go up :

    Click image for larger version  Name:	20200115_08h03_58.jpg Views:	3 Size:	9.3 KB ID:	1708866Click image for larger version  Name:	20200114_18h05_41.jpg Views:	3 Size:	266.3 KB ID:	1708867

    The problem is, with height map generated from quixel mixer, once set in an unreal material, the surface will be moved as a whole, since where the gray pixels are not supposed to be affected, they are in unreal : we want the surface keeps its original Z locaiton as much as possible.
    (for the screenshot purpose, in the 3rd image, I manually lowered the Z location of the surface)

    Click image for larger version  Name:	20200115_08h12_33.jpg Views:	3 Size:	424.2 KB ID:	1708868

    Is there a way to uniformize the way displacement works in unreal?
    Source code modification? Texture remapping by using nodes in material?
    Maybe there is an option in quixel mixer to remap the heightmap before exporting?

    What do you think guys?

    Last edited by etiles; 01-15-2020, 03:24 AM.

    Multiply your displacement by two and subtract one.


      Thanks Deathrey, good point here.
      But there is a ray tracing limitation with the use of negative values that causes shadow artefacts, as you can see :

      Click image for larger version  Name:	20200115_09h04_27.jpg Views:	0 Size:	287.8 KB ID:	1708886

      So, with the use of ray tracing, we have to keep positives values.
      I think the easiest way would be to get the lowest pixel value from the displacement texture and then, substract it to the texture, in order to keep a range from 0.

      It could be possible to do it in C++, but is there a way calculate it directly in the shader? (With a custom node I guess...)
      Last edited by etiles; 01-15-2020, 05:14 AM.


        Why wouldn't an absolute value setter node work for it? What is meant by subtract it TO the texture? isn't it mathematically subtracting from the texture values?