Отбрасывание некоторых вокселей в лучевой кастинге

У меня есть реализация рендеринга тома в шейдерах, которая использует технику gpu raycasting. В основном у меня есть куб единичный в центре моей сцены. Я визуализирую вершины куба единицы в моем вершинном шейдере и передаю текстурные координаты в шейдер фрагмента следующим образом:

in vec3 aPosition;
uniform mat4 uMVPMatrix;
smooth out vec3 vUV;
void main() {
 gl_Position = uMVPMatrix * vec4(aPosition.xyz,1);
 vUV = aPosition + vec3(0.5);
}

Поскольку координаты единичного куба идут от -0.5 до 0.5 I, зажимаем координаты текстуры от 0.0 до 1.0, добавляя к ним 0.5.

В шейдере фрагмента я получил координату текстуры, которая интерполируется растеризатором:

...
smooth in vec3 vUV; // Position of the data interpolated by the rasterizer
...
void main() {
 ...
 vec3 dataPos = vUV;
 ...
 for (int i = 0; i < MAX_SAMPLES; i++) {
 dataPos = dataPos + dirStep;
 ...
 float sample = texture(volume, dataPos).r;
 ...//Some more operations on the sampled color
 float prev_alpha = transferedColor.a * (1.0 - fragColor.a);
 fragColor.rgb += prev_alpha * transferedColor.rgb; 
 fragColor.a += prev_alpha; //final color
 if(fragColor.a>0.99)
 break;
 }
}

Мой рендеринг работает хорошо.

Теперь я реализовал алгоритм выбора, который отлично работает с частицами (реальные вершины в мировых координатах).

Мой вопрос: как я могу заставить его работать с объемным набором данных? Потому что только вершины я имеют вершины единичного куба. Поскольку точки данных интерполируются растеризатором, я не знаю реальных (мировых) координат вокселей.

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

1 ответ

Сначала вы должны разработать свою координацию вокселя. (Я предполагаю, что объем - это ваша 3D-текстура). Чтобы найти его, вы должны де-линеаризировать его из dataPos в 3-х осевые компоненты вашей 3D-текстуры (wxhxd). Поэтому, если образец в MAX_SAMPLES имеет индекс, рассчитанный как ((z * d) + y) * h + x, то координата может быть найдена..

z = пол (образец/(w * h))

y = пол ((образец - (z * w * h))/w)

x = sample - (z * w * h) - (y * w)

Операция пол важна для получения целочисленного индекса.

Это координата вашего образца. Теперь вы можете умножить его на инверсию mvp, которую вы использовали для 4 вершин, это дает вам позицию (или центр, возможно, вам нужно добавить vec3 (0.5)) вашего образца в мировом пространстве.

Однако возникает новый вопрос: посмотрите, можете ли вы переписать свой алгоритм выбора, чтобы вам не приходилось перебирать все вычисления и делать выбор в пространстве экрана, а не в пространстве мира.

licensed under cc by-sa 3.0 with attribution.