Нужна помощь в создании «воксельного шейдера с билбордом с квадратами для точечной сетки», который адаптируется к различным полям зрения или форматным соотношениям экрана - PullRequest
0 голосов
/ 27 октября 2019

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

Работает нормально, но проблемы:

  1. У меня есть магическое число 22, которое работает визуально, но я не знаю, как и почему это значение
  2. Мне нужно, чтобы это работало на всех формах / размерах экрана, и любые поля зрения FOV
  3. кажутся немного меньше, чем они должны создавать разрывы линий. Так что я бы хотел «откармливать» эти края экрана.
  4. Это не сработает в ортографической проекции

Я уже проделал большую часть работы. Разве это не сложный код, просто не идеален. В движке, который я использую (Godot), я просто вычисляю позицию обзора, затем использую -z в качестве расстояния от камеры и устанавливаю POINT_SIZE.

uniform float fov;
varying float dist;

void vertex() {
    vec4 pos = MODELVIEW_MATRIX * vec4(VERTEX, 1.0);
    //make sure distance accounts for FOV and screen size   
    dist = -pos.z * (fov / 70.0);
    POINT_SIZE = 22.0 / dist;
}

void fragment() {
    if (dist > 128.0) {
        discard;
    }

    // conversion to srgb
    bvec3 cutoffc = lessThan(COLOR.rgb, vec3(0.04045));
    vec3 higher = pow((COLOR.rgb + vec3(0.055))/vec3(1.055), vec3(2.4));
    vec3 lower = COLOR.rgb/vec3(12.92);

    ALBEDO =  mix(higher, lower, cutoffc);
}

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

Я не против делать вычисления в коде и передавать его в шейдер. Фактически FOV передается извне, чтобы избежать расчетов. Мне просто нужно понять, как это работает и как это исправить. Спасибо, что прочитали:)

...