OpenGL - цвет пикселей на определенной глубине - PullRequest
0 голосов
/ 27 января 2011

Я визуализировал 3D-сцену в OpenGL, если смотреть с перспективы gluOrtho.В моем приложении я смотрю на переднюю грань куба размером 100x70x60 мм (который у меня есть как 1000x700x600 пикселей).Внутри этого куба я нарисовал простую синюю сферу, которая находится точно посередине и «заполняет» куб (радиус 300 пикселей).

Теперь я хочу прочитать значение цвета пикселей (в 3D) на определенном уровне.точки внутри куба;т.е. я хочу знать, если скажите, точка (100,100, -200) синий или пустой (черный).

glReadPixels позволяет только двухмерное извлечение цвета, и я пробовал это с DEPTH_COMPONENT, но не уверен, что это должно возвращаться в байтовой форме?Есть ли способ объединить два?Я что-то упускаю?

Любая помощь или совет приветствуются

Приветствия Тим

Я использую Eclipse с Java и JOGL.

Ответы [ 2 ]

4 голосов
/ 27 января 2011

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

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

1 голос
/ 27 января 2011

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

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

...