如何使用OpenGL正确投影和扭曲3d点

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

我正在对GLSL着色器进行编码,以使用Model,View和Projection矩阵进行3D顶点的投影。

我将This用于投影矩阵。但是我没有得到失真的图像。为了扭曲我使用的观点:

  vec4 distort(vec4 pos){
    // normalize
    float z = pos[2];
    float z_inv = 1 / z;
    float x1 = pos[0] * z_inv;
    float y1 = pos[1] * z_inv;
    // precalculations
    float x1_2 = x1 * x1;
    float y1_2 = y1 * y1;
    float x1_y1 = x1 * y1;
    float r2 = x1_2 + y1_2;
    float r4 = r2 * r2;
    float r6 = r4 * r2;
    // rational distortion factor
    float r_dist = (1 + k1 * r2 + k2 * r4 + k3 * r6)
     / (1 + k4 * r2 + k5 * r4 + k6 * r6);
    // full (rational + tangential) distortion
    float x2 = x1 * r_dist + 2 * p1 * x1_y1 + p2 * (r2 + 2 * x1_2);
    float y2 = y1 * r_dist + 2 * p2 * x1_y1 + p1 * (r2 + 2 * y1_2);
    // denormalize for projection (which is a linear operation)
    return vec4(x2*z, y2*z, z, pos[3]);}

投影如下:

    vec4 view_pos = modelView * vec4(aPos, 1.0);
    vec4 dist_pos = distort(view_pos);
    gl_Position = projection * dist_pos;

问题是,当相机靠近物体时,我得到的3d点投影确实很差。有没有一种方法可以检查该点是否可分离,并且我使用的失真函数有什么问题(我正在尝试使用OpenCV失真)?

opengl glsl projection distortion
1个回答
0
投票

不要扭曲单个顶点,因为正如您提到的那样,它不能很好地工作。原因是,无论您如何扭曲顶点,OpenGL仍会光栅化具有直边的三角形。但是,镜头变形会导致直线出现弯曲。您可以通过将几何细分为较小的三角形来缓解这种情况,但这永远无法完全解决问题。

相反,将场景渲染为屏幕外的纹理,完成后,渲染全屏四边形,以失真的纹理坐标对纹理进行采样。

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