67 lines
1.7 KiB
GLSL
67 lines
1.7 KiB
GLSL
#version 110
|
|
#extension GL_EXT_gpu_shader4 : enable
|
|
|
|
uniform bool perspective;
|
|
uniform vec2 p0;
|
|
uniform vec2 p1;
|
|
uniform vec2 p2;
|
|
uniform vec2 p3;
|
|
|
|
varying vec2 q;
|
|
varying vec2 b1;
|
|
varying vec2 b2;
|
|
varying vec2 b3;
|
|
varying vec2 vTexCoord;
|
|
|
|
void main() {
|
|
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
|
|
|
|
if (perspective) {
|
|
float m1 = (p3.y - p0.y)/(p3.x - p0.x);
|
|
float c1 = p0.y - m1 * p0.x;
|
|
float m2 = (p1.y - p2.y)/(p1.x - p2.x);
|
|
float c2 = p2.y - m2 * p2.x;
|
|
float mid_x = (c2 - c1) / (m1 - m2);
|
|
float mid_y = m1 * mid_x + c1;
|
|
|
|
float d0 = length(vec2(mid_x - p0.x, mid_y - p0.y));
|
|
float d1 = length(vec2(p1.x - mid_x, mid_y - p1.y));
|
|
float d2 = length(vec2(p3.x - mid_x, p3.y - mid_y));
|
|
float d3 = length(vec2(mid_x - p2.x, p2.y - mid_y));
|
|
|
|
float q;
|
|
|
|
if (gl_VertexID == 0) {
|
|
q = (d1+d3)/d3;
|
|
} else if (gl_VertexID == 1) {
|
|
q = (d0+d2)/d2;
|
|
} else if (gl_VertexID == 2) {
|
|
q = (d3+d1)/d1;
|
|
} else {
|
|
q = (d2+d0)/d0;
|
|
}
|
|
|
|
gl_Position[0] *= q;
|
|
gl_Position[1] *= q;
|
|
gl_Position[3] = q;
|
|
|
|
vTexCoord = gl_MultiTexCoord0.xy;
|
|
} else {
|
|
vec2 pos;
|
|
|
|
if (gl_VertexID == 0) { // top left
|
|
pos = p2;
|
|
} else if (gl_VertexID == 1) { // top right
|
|
pos = p3;
|
|
} else if (gl_VertexID == 2) { // bottom right
|
|
pos = p1;
|
|
} else if (gl_VertexID == 3) { // bottom left
|
|
pos = p0;
|
|
}
|
|
|
|
q = pos - p0;
|
|
b1 = p1 - p0;
|
|
b2 = p2 - p0;
|
|
b3 = p0 - p1 - p2 + p3;
|
|
}
|
|
} |