在GLSL着色器中计算点投影

问题描述 投票:2回答:1

我需要在着色器(OpenGL ES 2)中计算特定线段上点的投影。 以下是我测试算法的方法: 我用点A(0,0.5),B(1,-0.5),C(-1,-0.5)绘制简单三角形。 我计算线段AC上每个点的投影。 我用蓝色线段AC中间的投影绘制点。绿色的剩余点。 我希望得到一个绿色三角形,蓝色线垂直于AC侧。但蓝线与AC不垂直。 我在代码中检查投影公式,并在画布上绘图并获得预期结果。 我的错是什么?

着色器的结果:enter image description here

顶点着色器:

uniform mat4 matrix;
attribute vec4 position;
varying vec4 vPosition;

void main()
{
    vPosition = matrix * position;
    gl_Position = matrix * position;
}

片段着色器:

precision mediump float;

varying vec4 vPosition;

void main()
{

    vec2 P = vPosition.xy;
    vec2 A = vec2(0.0, 0.5);
    vec2 B = vec2(-1.0, -0.5);
    vec2 AP = P - A;
    vec2 AB = B - A;
    vec2 projection = A + dot(AP, AB) / dot(AB, AB) * AB;

    if(projection.x > -0.51 && projection.x < -0.49 && projection.y > -0.01 && projection.y < 0.01) {
        gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);
    } else {
        gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
    }
}
opengl opengl-es glsl shader
1个回答
3
投票

你没有考虑窗口的矩形方面。当范围[-1,1]中的标准化设备坐标映射到视口矩形(请参阅glViewport)时,三角形将被拉伸。这导致不保持90度的角度。

uniform variable添加到片段着色器,其中包含视口的宽度和高度:

uniform vec2 u_resolution;

计算宽高比:

float aspect = u_resolution.x / u_resolution.y;

当然,您也可以通过常量值初始化变量float aspect。 例如float aspect = 16.0/9.0;

根据纵横比校正点ABP的坐标:

vec2 P = vPosition.xy;
vec2 A = vec2(0.0, 0.5);
vec2 B = vec2(-1.0, -0.5);

A.x *= aspect;
B.x *= aspect;
P.x *= aspect;

在评估结果qazxsw poi时考虑纵横比:

projection

最终的片段着色器可能如下所示:

vec2 projection = A + dot(AP, AB) / dot(AB, AB) * AB;
projection.x /= aspect;

precision mediump float; varying vec4 vPosition; uniform vec2 u_resolution; void main() { float aspect = u_resolution.x / u_resolution.y; vec2 as = vec2(aspect, 1.0); vec2 P = as * vPosition.xy; vec2 A = as * vec2(0.0, 0.5); vec2 B = as * vec2(-1.0, -0.5); vec2 AP = P - A; vec2 AB = B - A; vec2 projection = A + dot(AP, AB) / dot(AB, AB) * AB / as; if(projection.x > -0.51 && projection.x < -0.49 && projection.y > -0.01 && projection.y < 0.01) { gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0); } else { gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); } }

© www.soinside.com 2019 - 2024. All rights reserved.