Warning, /plasma/kwin/src/scene/shaders/debug_fractional.vert is written in an unsupported language. File is not indexed.
0001 /* 0002 SPDX-FileCopyrightText: 2022 Arjen Hiemstra <ahiemstra@heimr.nl> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 uniform mat4 modelViewProjectionMatrix; 0008 uniform float fractionalPrecision; 0009 uniform vec2 screenSize; 0010 uniform vec2 geometrySize; 0011 0012 attribute vec4 vertex; 0013 attribute vec4 texcoord; 0014 0015 varying vec2 texcoord0; 0016 varying float vertexFractional; 0017 0018 // This shader calculates the fractional component of the vertex position and 0019 // passes 1 to the fragment shader if it is larger than the precision we want to 0020 // measure, or 0 if it is not. The fragment shader can then use that information 0021 // to color the pixel based on that value. 0 or 1 is used instead of something 0022 // like vertex coloring because of vertex interpolation and the fragment shader 0023 // having control over the final appearance. 0024 void main(void) 0025 { 0026 float errorCorrection = 1.0 / fractionalPrecision; 0027 0028 gl_Position = modelViewProjectionMatrix * vertex; 0029 0030 vec2 screenPosition = ((gl_Position.xy / gl_Position.w + vec2(1.0)) / vec2(2.0)) * screenSize; 0031 // Cancel out any floating point errors below what we want to measure. 0032 screenPosition = round(screenPosition * errorCorrection) / errorCorrection; 0033 0034 // Dermine how far off the pixel grid this vertex is. 0035 vec2 error = fract(screenPosition); 0036 0037 vertexFractional = dot(error, vec2(1.0)) > fractionalPrecision ? 1.0 : 0.0; 0038 0039 // Correct texture sampling for floating-point error on the vertices. 0040 // This currently assumes UV coordinates are always from 0 to 1 over an 0041 // entire triangle. 0042 texcoord0 = texcoord.xy + (error / geometrySize); 0043 }