Проецировать видимые пиксели в одном виде на другой - PullRequest
0 голосов
/ 04 июля 2018

В WebGL или в чисто матричной математике я хотел бы сопоставить пиксели в одном представлении с другим представлением. То есть, представьте, что я беру пиксель с x, y = 0,0. Этот пиксель лежит на поверхности трехмерного объекта в моем мире. Затем я слегка вращаюсь вокруг объекта. Где этот пиксель, который был в 0,0, теперь лежит в моем новом виде?

Как бы я вычислил соответствие между каждым пикселем в первом виде и каждым пикселем во втором виде?

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

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

1 Ответ

0 голосов
/ 04 июля 2018

Чтобы преобразовать точку из координат мира в экран, вы умножаете ее на матрицы вида и проекции. Поэтому, если у вас есть пиксель на экране, вы можете умножить его координаты (в диапазоне -1..1 для всех трех осей) на обратные преобразования, чтобы найти соответствующую точку в мировом пространстве, а затем умножить его на новые матрицы вида / проекции для следующий кадр.

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

Аналогичная методика используется для размытия движения, где скорость каждого пикселя вычисляется в фрагментном шейдере. Подробное объяснение можно найти в GeForce GPU 3 ch27 .

Я сделал jsfiddle с помощью этой техники: http://jsfiddle.net/Rivvy/f9kpxeaw/126/

Вот соответствующий фрагмент кода:

// reconstruct normalized device coordinates
ivec2 coord = ivec2(gl_FragCoord.xy);
vec4 pos = vec4(v_Position, texelFetch(u_Depth, coord, 0).x * 2.0 - 1.0, 1.0);
// convert to previous frame
pos = u_ToPrevFrame * pos;
vec2 prevCoord = pos.xy / pos.w;
// calculate velocity
vec2 velocity = -(v_Position - prevCoord) / 8.0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...