2011-01-27 2 views
0

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

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

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

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

Приветствия Tim

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

+0

Нет ничего, что называлось «пикселем» в 3D-пространстве opengl, оно без видимых. только экран имеет прямоугольные пиксели. – jondinham

ответ

1

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

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

4

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

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

+0

Спасибо, это то, чего я боялся. Могу попробовать Java3D, поскольку он использует графический анализ. Больше учиться делать! –

+0

Просто наличие графика сцены поможет вам, поскольку граф сцены является чисто абстрактным представлением, где «цвет» - это просто некоторое числовое значение. Для этого Java3D еще менее полезен, чем OpenGL. То, что вам нужно сделать, - это очистить сцену от глубинных слоев. По сути, вы должны бросить луч в сцену, посмотреть, с какими объектами она пересекается, и определить свойства поверхности точки пересечения каждого объекта. Определение внутри/снаружи еще сложнее на триангулированных сетках, для этого вам нужно будет сделать некоторое пространственное подразделение. Как построить BSP-дерево. – datenwolf

+0

Извинения за мое невежество, но как мне заняться построением графика сцены? Поддерживает ли OpenGL это на каком-то уровне или мне нужен другой подход? –