Как правильно проецировать и искажать 3D-точки с помощью OpenGL

Я кодирую шейдер GLSL для проекции трехмерных вершин с использованием матриц Model, View и Projection.

Я использовал Это для проекционной матрицы. Однако я не получаю искаженное изображение. Для искажения точек я использовал:

  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)?


person Houssem    schedule 21.04.2020    source источник
comment
Отвечает ли это на ваш вопрос? Искажение объектива камеры в OpenGL   -  person Yakov Galka    schedule 21.04.2020
comment
Именно оттуда я получил уравнения. Проблема в том, что когда я подхожу слишком близко к объекту, его статистика становится очень плохой. Таким образом, у этих уравнений есть некоторые ограничения, и мне было интересно, смогу ли я предсказать, когда будет неправильно удалить вершины перед проецированием.   -  person Houssem    schedule 22.04.2020


Ответы (1)


Не искажайте отдельные вершины, так как, как вы упомянули, это не очень хорошо работает. Причина в том, что независимо от того, как вы искажаете свои вершины, OpenGL все равно растрирует треугольники с прямыми краями. Однако искажение объектива приводит к тому, что прямые линии кажутся изогнутыми. Вы можете смягчить это, разделив свою геометрию на меньшие треугольники... но это никогда не решит проблему полностью.

Вместо этого визуализируйте свою сцену в текстуру за пределами экрана, а когда закончите, визуализируйте полноэкранный четырехугольник, который сэмплирует эту текстуру с искаженными координатами текстуры. Этот шаг искажения можно комбинировать с другими эффектами постобработки (например, тональным отображением), что делает его довольно дешевым вариантом.

person Yakov Galka    schedule 21.04.2020
comment
Это не работает не из-за OpenGL, это не работает, потому что модель искажения, которую я реализовал, не работает, когда камера слишком близко (некоторые вершины находятся далеко за пределами области искажения, если я могу так сказать) - person Houssem; 21.04.2020