// 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); }