Если ваша видеокарта имеет 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));
}