Выбор с помощью языка затенения OpenGL - PullRequest
2 голосов
/ 05 февраля 2010

Я пытаюсь найти лучший способ выбрать информацию, отображаемую с помощью шейдеров. Буфер оконного менеджера (окно) используется для вывода рендеринга. На пользовательском событии я должен выбрать геометрию визуализации. Использовать gluPick легко, но я пытаюсь выбирать, используя только шейдеры.

Гибкость шейдеров не помогает мне найти правильное решение. Я нашел следующие решения:

  • Рендеринг с использованием системного буфера (в действительности, с использованием цветов). Используйте glScissor для ограничения рендеринга в определенном регионе и используйте glReadPixels для выборки цветов, сопоставленных с геометрическими идентификаторами
  • Рендеринг с использованием отдельного объекта кадрового буфера. Форматы Renderbuffer должны быть определены. Может быть, я могу использовать простые целые числа для ввода имен?
  • Рендеринг с использованием объекта кадрового буфера, как для рендеринга, так и для выбора. Дополнительно объект renderbuffer, содержащий отображаемые имена.

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

Есть предложения?

P.S:

Так как в фрагментном шейдере я объявляю массив vec4 для определения данных фрагмента, как я могу настроить кадровый буфер, содержащий буфер рендеринга, имеющий только компонент R, хранящийся во внутреннем целочисленном формате размера?

Можно ли связать выходную переменную фрагментного шейдера с конкретным прикрепленным буфером рендеринга?

1 Ответ

2 голосов
/ 06 февраля 2010

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

Если вы делаете выбор с использованием растеризации, вы всегда будете зависать от вызова glReadPixels () или его эквивалента, и вы всегда будете в основном рисовать свою сцену в каком-то буфере с определенными значениями выбора.

Если вы действительно хотите проявить творческий подход и отклониться от нормы, вы можете попробовать использовать шейдеры для пересечения лучей с фигурами в вашей сцене. Для этого потребовалось бы немало специализированной разработки шейдеров, и трудно увидеть выгоду, если вы не делаете МНОГО выбора (возможно, raytracer?).

...