Какая стратегия выбора мыши для миллионов примитивов? - PullRequest
2 голосов
/ 01 марта 2012

Я выполняю рендеринг моделей, основанных на миллионах (до десяти) треугольников, используя VBO, и мне нужно определить, на какой из этих треугольников может щелкнуть пользователь.

Я пытаюсь прочитать и понять, как работают «стек имен» и «уникальный цвет». Я обнаружил, что стек имен может содержать максимум 128 имен, в то время как уникальный цвет может иметь до 2 ^ (8 + 8 + 8) = 16777216 возможных различных цветов, но иногда могут быть некоторые приближения, поэтому он может получить изменен ..

Какая стратегия лучше всего подходит для моего случая?

Ответы [ 2 ]

9 голосов
/ 01 марта 2012

По сути, у вас есть 2 класса опций:

  1. «Уникальный путь цвета на треугольник», что означает, что вы прикрепляете идентификатор к каждому треугольнику и выводите идентификаторыотдельная цель рендеринга.Это может быть 32 бита (8 для rgb, 8 для a), но вы можете добавить второй для еще большего количества идей.Будет сложно получить идентификатор для каждого треугольника, но его относительно легко реализовать.Хотя это может быть очень вредно для производительности (fillrate).

  2. Правильная трассировка лучей.Вы почти наверняка хотите иметь ускоряющую структуру (octree, kd, ...), но, вероятно, у вас уже есть такая для отбраковки усеченного конуса.Один луч на самом деле не много, этот метод должен быть очень быстрым.

  3. Гибрид.вероятно, самый простой в реализации.Визуализируйте идентификатор буфера вершин («уникальный цвет для буфера :) и, когда вы знаете, какой буфер вершин был выбран», просто проведите луч против всех треугольников.

В общемдело, я бы сказал 2) это лучший вариант.Если вы хотите, чтобы что-то сработало быстро, перейдите на 3).1), вероятно, довольно бесполезно.

6 голосов
/ 31 июля 2012

Если ваша видеокарта имеет OpenGL 4.2, вы можете использовать функцию imageStore() в GLSL, чтобы отметить Id треугольника на изображении. В моем случае мне нужно обнаружить все треугольники за предопределенным окном на экране. Выбор (выбор визуализированных треугольников в окне) работает аналогично. Выбор выполняется в реальном времени для меня.

Максимальный размер изображения (или текстуры) должен> = 8192x8192 = 64 м. Таким образом, можно использовать до 64 М примитивов (и даже больше, если мы используем 2, 3 изображения).

Сохранение всех идентификаторов треугольников за экраном можно выполнить с помощью этого фрагментного шейдера:

uniform  uimage2D id_image;

void main() 
{
    color_f = vec4(0)
    ivec2 p;
    p.x = gl_PrimitiveID % 2048;
    p.y = gl_PrimitiveID / 2048;
    imageStore(id_image, p, uvec4(255));
}

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

uniform  uimage2D id_image;

**layout(early_fragment_tests) in;** //the shader does not run for fragment > depth

void main() 
{
    color_f = vec4(0)
    ivec2 p;
    p.x = gl_PrimitiveID % 2048;
    p.y = gl_PrimitiveID / 2048;
    imageStore(id_image, p, uvec4(255));
}
...