| /**************************************************************************** |
| ** |
| ** Copyright (C) 2014 NVIDIA Corporation. |
| ** Copyright (C) 2019 The Qt Company Ltd. |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of Qt 3D Studio. |
| ** |
| ** $QT_BEGIN_LICENSE:GPL$ |
| ** Commercial License Usage |
| ** Licensees holding valid commercial Qt licenses may use this file in |
| ** accordance with the commercial license agreement provided with the |
| ** Software or, alternatively, in accordance with the terms contained in |
| ** a written agreement between you and The Qt Company. For licensing terms |
| ** and conditions see https://www.qt.io/terms-conditions. For further |
| ** information use the contact form at https://www.qt.io/contact-us. |
| ** |
| ** GNU General Public License Usage |
| ** Alternatively, this file may be used under the terms of the GNU |
| ** General Public License version 3 or (at your option) any later version |
| ** approved by the KDE Free Qt Foundation. The licenses are as published by |
| ** the Free Software Foundation and appearing in the file LICENSE.GPL3 |
| ** included in the packaging of this file. Please review the following |
| ** information to ensure the GNU General Public License requirements will |
| ** be met: https://www.gnu.org/licenses/gpl-3.0.html. |
| ** |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| |
| #ifndef TESSELLATION_LINEAR_GLSLLIB |
| #define TESSELLATION_LINEAR_GLSLLIB |
| |
| |
| #if TESSELLATION_CONTROL_SHADER |
| layout (vertices = 3) out; |
| |
| // global setup in main |
| vec3 ctWorldPos[3]; |
| |
| uniform vec3 cameraPosition; |
| uniform vec2 distanceRange; |
| uniform float disableCulling; |
| |
| float isBackFace() |
| { |
| vec3 faceNormal = normalize( cross( ctWorldPos[2] - ctWorldPos[0], ctWorldPos[1] - ctWorldPos[0] ) ); |
| |
| vec3 ncd = normalize( ctWorldPos[0] - cameraPosition ); |
| |
| return sign( dot(faceNormal, ncd) ); |
| } |
| |
| float adaptiveCameraFactor( in float minTess, in float maxTess ) |
| { |
| float distanceValue0 = distance( cameraPosition, ctWorldPos[0] ); |
| float distanceValue1 = distance( cameraPosition, ctWorldPos[1] ); |
| float distanceValue2 = distance( cameraPosition, ctWorldPos[2] ); |
| |
| float range = distanceRange[1] - distanceRange[0]; |
| |
| vec3 edgeDistance; |
| edgeDistance[0] = ((distanceValue1 + distanceValue2) / 2.0) / range; |
| edgeDistance[1] = ((distanceValue2 + distanceValue0) / 2.0) / range; |
| edgeDistance[2] = ((distanceValue0 + distanceValue1) / 2.0) / range; |
| |
| edgeDistance = clamp( edgeDistance, vec3(0.0), vec3(1.0) ); |
| |
| //float af = mix( minTess, maxTess, 1.0 - edgeDistance[gl_InvocationID] ); |
| float af = 1.0 - edgeDistance[gl_InvocationID]; |
| af = clamp( af*af*maxTess , minTess, maxTess ); |
| |
| return af; |
| } |
| |
| void tessShader ( in float tessEdge, in float tessInner ) |
| { |
| float bf = isBackFace(); |
| bf = max(disableCulling, bf); |
| |
| // adapative tessellation factor |
| float af = adaptiveCameraFactor( tessInner, tessEdge ); |
| |
| // Calculate the tessellation levels |
| gl_TessLevelInner[0] = af * bf; |
| gl_TessLevelOuter[gl_InvocationID] = af * bf; |
| } |
| #endif |
| |
| #if TESSELLATION_EVALUATION_SHADER |
| layout (triangles, equal_spacing, ccw) in; |
| |
| vec4 tessShader ( ) |
| { |
| vec4 p0 = gl_TessCoord.x * gl_in[0].gl_Position; |
| vec4 p1 = gl_TessCoord.y * gl_in[1].gl_Position; |
| vec4 p2 = gl_TessCoord.z * gl_in[2].gl_Position; |
| vec4 pos = p0 + p1 + p2; |
| return pos; |
| } |
| #endif |
| |
| #endif |
| |