Почему я вижу эти странные артефакты отсечения с WebGL?

Я использую TWGL для создания буфера плоскости NxN, который затем использую как сетку (twgl.primitives.createPlaneBufferInfo) с выдавливанием по оси Z относительно значений яркости в видео. Все выглядит неплохо, за исключением того, что я получаю странные артефакты отсечения в квадрантах (-X, -Y) и (X, Y). Смотрите прикрепленное изображение для примера...

Я видел этот пост, который поднимает аналогичные вопросы и предлагает сортировку по глубине, но не очевидно, как я бы даже сделал эту сортировку, учитывая, что относительная глубина определяется на лету в шейдере. Также предлагается отключить проверку глубины и включить отбраковку лиц, но это не работает. Я предполагаю, что должна быть какая-то альтернатива, поскольку то, что я делаю, не является чем-то необычным. Возможно, мне нужно создать сетку по-другому? Мне также не очевидно, почему это могло произойти только в двух из четырех квадрантов. Заранее спасибо!

1 ответ

После долгих экспериментов я наконец нашел проблему. Матрица перспективы, которую я генерировал, имела ноль в качестве 16-го элемента массива (другими словами, позиция [4,4] в матрице X,Y,Z,W), что приводило к сглаживанию значений глубины.

Я создавал свою перспективную матрицу с помощью twgl. Не уверен, почему реализация работает так (мне кажется ошибкой):

_public.perspectiveMatrix = twgl.m4.perspective(_public.POV, width/height, 0.0, 100);

Это было проблемой, так как я устанавливал позицию в вершинном шейдере следующим образом:

gl_Position = perspectiveMatrixUniform * viewMatrixUniform * vec4((matrixUniform * vec3(position.xy, 1.0)).xy, (intensity.r + intensity.g + intensity.b)/3.0 + 0.01, 1.0); 

Если я добавлю следующую строку сразу после инициализации матрицы перспективы, все будет работать должным образом:

_public.perspectiveMatrix[15] = 1.0;
Другие вопросы по тегам