Revision control
Copy as Markdown
// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
vec2 qt_parallaxMapping(in vec2 uv,
in sampler2D heightMap,
in vec3 tangent,
in vec3 binormal,
in vec3 normal,
in vec3 vertex,
in vec3 cameraPosition,
in float depthScale,
in float minLayers,
in float maxLayers)
{
mat3 tanFrame = transpose(mat3(tangent, binormal, normal));
vec3 viewDir = normalize(tanFrame * vertex - tanFrame * cameraPosition);
float numLayers = mix(float(maxLayers), float(minLayers), abs(dot(vec3(0.0, 0.0, 1.0), viewDir)));
float layerDepth = 1.0 / numLayers;
float currentLayerDepth = 0.0;
vec2 P = viewDir.xy * depthScale;
vec2 delta = P / numLayers;
vec2 offset = uv;
float depth = textureLod(heightMap, offset, 0.0).r;
float currentDepth = 0.0;
while (currentDepth < depth)
{
offset -= delta;
depth = textureLod(heightMap, offset, 0.0).r;
currentDepth += layerDepth;
}
vec2 prevOffset = offset + delta;
float afterDepth = depth - currentDepth;
float beforeDepth = textureLod(heightMap, prevOffset, 0.0).r - currentDepth + layerDepth;
float weight = afterDepth / (afterDepth - beforeDepth);
return mix(offset, prevOffset, weight);
}