Поиск максимальной и минимальной яркости пикселей на экране / в текстуре без поддержки GLSL

#c #opengl #opengl-es #shader #opengl-sc

#c #opengl #opengl-es #шейдер #opengl-sc

Вопрос:

В моем приложении 2D-карты у меня есть 16-битные текстуры карты высот, содержащие высоты в метрах, связанные с точкой на карте.

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

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

У меня есть доступ к расширению ATI_fragment_shader, которое позволяет использовать базовый фрагментный шейдер для объединения R и G каналов в этих текстурах и получения одного значения яркости в оттенках серого с плавающей точкой.

Тогда я бы смог снова перекрасить эти пиксели внутри шейдера (сопоставить их с диапазоном 0-1) на основе максимальных и минимальных значений яркости пикселей, но я не знаю, каковы они.

Мой вопрос в том, как мне найти пиксели с максимальными и минимальными значениями яркости между пикселями, отображаемыми в данный момент на экране? Или, в качестве альтернативы, как мне найти эти значения внутри текстуры? (Потому что я мог бы выполнить вызов glCopyTexImage2D после рисования текстуры со значениями яркости в оттенках серого на экране и получить данные в виде текстуры).

Материал, о котором я пробовал или читал до сих пор:

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

— Уменьшение выборки текстуры до размера 1×1, пока последний постоянный пиксель не станет минимальным или максимальным значением, а затем использование этой текстуры 1×1 внутри шейдера. Я понятия не имею, как добиться этого без поддержки GLSL и texel, поскольку мне пришлось бы искать пиксель, который находится справа, вверх и вправо от текущего, и находить минимальное / максимальное значение между ними.

Комментарии:

1. @Rabbid76 «Шейдер», о котором я упоминаю здесь, — это базовый фрагментный шейдер, предоставляемый с расширением ATI_fragment_shader. Это не записано на GLSL.

2. Итак, на самом деле вы используете OpenGL 1.0 ATI_fragment_shader ?

3. На самом деле это OpenGL SC 1.0.1 несколько расширений…

4. Мне так жаль тебя.