У меня есть сетка Point Array (вершины с нормалями и цветами, но без треугольников), и я пытаюсь создать небольшие квадратные щиты с биллбордом в каждой точке вершины, чтобы создать своего рода форму вокселя с билбордовым квадратом.
Работает нормально, но проблемы:
- У меня есть магическое число 22, которое работает визуально, но я не знаю, как и почему это значение
- Мне нужно, чтобы это работало на всех формах / размерах экрана, и любые поля зрения FOV
- кажутся немного меньше, чем они должны создавать разрывы линий. Так что я бы хотел «откармливать» эти края экрана.
- Это не сработает в ортографической проекции
Я уже проделал большую часть работы. Разве это не сложный код, просто не идеален. В движке, который я использую (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 передается извне, чтобы избежать расчетов. Мне просто нужно понять, как это работает и как это исправить. Спасибо, что прочитали:)