Подсчет пикселей на цели рендера - PullRequest
0 голосов
/ 28 марта 2019

Используя телефоны OpenGL ES 2.0 и Galaxy S4, у меня есть цель рендеринга 1024x1024 RGBA8888, в которой некоторые текстуры визуализируются в каждом кадре.Мне нужно рассчитать, сколько красных пикселей RGBA (1, 0, 0, 1) было визуализировано на цели рендеринга (дважды в секунду).

Основная проблема заключается в том, что получение текстуры из графического процессора является очень производительным-дорого (~ 300-400 мс), и зависания не применимы для моего приложения.

Я знаю о расширении OES_shader_image_atomic для атомарных счетчиков (просто для увеличения некоторого значения, когда работает шейдер фрагмента), но оно доступно только вOpenGL ES 3.1 (и более поздние версии), я должен придерживаться ES 2.0.

Есть ли какое-то общее решение, которое я пропустил?

1 Ответ

3 голосов
/ 29 марта 2019

То, что вы можете попробовать, это «уменьшить» текстуру до значительно меньшего размера и вернуться к ЦП (что должно быть дешевле с точки зрения производительности). Например, вы можете разбить текстуру на квадраты N на N (где N предпочтительно равно степени двойки), а затем визуализировать квад «весь экран» в текстуру 1024 / N на 1024 / N с помощью фрагментного шейдера, который суммирует число красных пикселей в соответствующем квадрате:

sampler2D texture;

void main(void) {
    vec2 offset = N * gl_FragCoord.xy;
    int cnt = 0;
    for (float x = 0.; x < float(N); x += 1) {
        for(float y = 0.; y < float(N); y += 1) {
            if (texture2D(texture, (offset + vec2(x, y)) / 1024.) == vec4(1, 0, 0, 1)) {
                cnt += 1;
            }
        }
    }
    gl_FragColor = vec4((cnt % 256) / 255., ((cnt / 256) % 256) / 255., /* ... */);
}

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

...