3D объем рендеринга и окклюзия нескольких точек зрения

У меня есть объемные данные `W x H x D ‘, которые везде равны нулю, за исключением маленьких сферических томов, содержащих 1.

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

Вершинный шейдер

varying vec3 textureCoordinates;
uniform float objectSize;
uniform vec3 objectTranslation;

void main()
{
vec4 v=gl_Vertex;
textureCoordinates= vec3(   ((v.xz-objectTranslation.xz)/objectSize+1.0)*0.5,    ((v.y-objectTranslation.y)/objectSize+1.0)*0.5);
gl_Position = gl_ModelViewProjectionMatrix*v;
}

Фрагмент шейдера

varying vec3 textureCoordinates;
uniform sampler3D volumeSampler;
void main()
{
vec4 uniformColor = vec4(1.0,1.0,0.0,1.0); //it's white
if ( textureCoordinates.x <=0.0 || textureCoordinates.x >= 1.0 || textureCoordinates.z <= 0.0 || textureCoordinates.z >= 1.0)
gl_FragColor =vec4(0.0,0.0,0.0,1.0); //Can be uniformColor to color again the thing
else
gl_FragColor = uniformColor*texture3D(volumeSampler, textureCoordinates);
}

В программе OpenGL я смотрю центрированный объект с этими почти сферическими пятнами белого на нем из (0,100,0) координат глаза, но я хочу, чтобы для другого зрителя (0,0,0) сферы, которые лежат на одна и та же линия прямой видимости правильно закрыта, поэтому излучаются только те части, которые я подчеркнул красным на рисунке.

Идеальная окклюзия для (0,0,0) зрителя как вид сверху

Это приложение Raycasting или подобное?

8

Решение

Кажется, что вы хотите, это отбор окклюзии, у вас есть два основных варианта для осуществления отбор окклюзии

Использование запросов окклюзии графического процессора

По сути, речь идет о том, чтобы спросить аппаратное обеспечение, будет ли нарисован определенный фрагмент или нет, если вы не можете отбросить объект.

Запросы окклюзии подсчитывают количество фрагментов (или образцов), которые проходят тест глубины, что полезно для определения видимости объектов.

Этот алгоритм является более сложным, чем можно объяснить здесь, здесь отличный Nvidia статья на эту тему.

Использование CPU лучей

Это просто проверка каждого объекта (или, возможно, его ограничивающего объема), если луч попадает на объект, то он, возможно, скрывает другие объекты за ним. Объекты должны быть пространственно отсортированы с использованием Octree или BSP Tree, поэтому вам не нужно проверять каждый объект, а только объекты рядом с камерой.

Подробнее о методах выбраковки проверьте мой ответ Вот.

3

Другие решения

Это приложение Raycasting или подобное?

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

2

По вопросам рекламы [email protected]