This is an old revision of the document!


Parallax Occlusion Mapping Material (TGorillaPOMMaterialSource)

The parallax occlusion mapping material (short: POM) TGorillaPOMMaterialSource is inherited from the TGorillaDefaultMaterialSource and supports multiple lights, fog, shadows and much more features.

Definition

Parallax occlusion mapping (POM) is an enhancement of the parallax mapping technique. Parallax occlusion mapping is used to procedurally create 3D definition in textured surfaces, using a displacement map (similar to a topography map) instead of through the generation of new geometry.[1] This allows developers of 3D rendering applications to add 3D complexity in textures, which correctly change relative to perspective and with self occlusion in real time (self-shadowing is additionally possible), without sacrificing the processor cycles required to create the same effect with geometry calculations.[2]

https://en.wikipedia.org/wiki/Parallax_occlusion_mapping

Why using POM

It is an alternative to the normal mapping material. Parallax occlusion mapping is able to create a more realistic look and depth in surface without creating new vertices.

Here a rendering with normal mapping:

And the same texture, normal map + height map rendered with parallax occlusion mapping:

Because parallax occlusion mapping using a more complex way to build the surface by raytracing it is more intense to the GPU, which means, it costs performance in comparison to normal mapping.

We recommend to use POM materials only if camera is getting close to objects and where depth of a surface is important.

In all other cases normal mapping might be good enough.

Example

uses
  Gorilla.Material.POM;
 
[...]
 
var FPOMMaterial : TGorillaPOMMaterialSource;
 
FPOMMaterial:= TGorillaPOMMaterialSource.Create(GorillaViewport1);
FPOMMaterial.Parent := GorillaViewport1;
 
/// load the regular diffuse color texture
FPOMMaterial.Texture.LoadFromFile('pom_wood.png');
/// load a normal map
FPOMMaterial.NormalMap.LoadFromFile('pom_normal.png');
/// finally load the occlusion map, which is just a black-white texture for the depth.
/// you can use displacement maps or height maps also.
FPOMMaterial.ParallaxOcclusionMap.LoadFromFile('pom_disp.png');