Должен признать, что в моем вопросе было не так ясно. В любом случае, я уточню проблему и представлю решение здесь.
У меня есть много разных видов произвольных форм (пользователь может создать столько их, сколько он хочет, и безумно их деформировать), и я хочу разработать метод, позволяющий определять по цвету пикселя на экране, сколько фигур пользователь выбрал (пользователь только что коснулся этого пикселя).
Итак, я закрашиваю формы с помощью, скажем, неких цветовых идентификаторов. Я работаю на двоичном уровне:
первая фигура на экране имеет идентификатор цвета 00000001, вторая фигура имеет идентификатор 00000010 и так далее. Таким образом, с байтом (скажем, в красном канале) я могу хранить до 8 разных цветовых идентификаторов. Максимальное количество фигур - 32, если я использую формат RGBA8888.
Алгоритм, который я первоначально разработал, заключался в смешении исходного идентификатора цвета с конечным идентификатором цвета с помощью glBlendFunc (GL_ONE, GL_ONE), и все, казалось, работало нормально. Так что если коснулся пиксель с цветом 00010101, то это означало, что были затронуты первая, третья и пятая формы. НО, есть некоторые невыпуклые формы (если это правильное слово для сворачивания фигур), которые могут быть созданы пользователем. В этом случае, если фигура с цветным идентификатором 00000001 сложена пользователем, то перекрывающиеся пиксели получат идентификатор 00000010, потому что форма записывает 00000001, когда она сначала рисуется в буфере кадров, а затем перекрывающиеся пиксели той же формы добавляют еще 00000001 из-за для смешивания.
Итак, если каким-то образом я смогу сделать BITWISE ИЛИ (НЕ логично, как я изначально упоминал в своем вопросе) между идентификаторами цветов, которые были записаны в кадровом буфере, тогда проблема будет решена. Действительно, это имеет место в OpenGL ES 1.1 с использованием функции glLogicOp (GL_OR). К сожалению, это не доступно в OpenGL ES 2.0, и снова должен быть создан один шейдер, еще один проход и т. Д., Который я считаю излишним и сложным в обслуживании.
Решение для OpenGL ES 2.0 таково:
- Очистить цвет RenderTexture B до glClearColor (0,0,0,0)
- ДЛЯ каждой формы
- Очистить цвет Rendertexture A до glClearColor (0,0,0,0)
- Нарисуйте фигуру на Rendertexture A, используя фрагментный шейдер, который в качестве цвета пишет его идентификатор цвета.
- Смешайте с GL_ONE, GL_ONE Rendertexture A с содержимым Rendertexture B
- КОНЕЦ ДЛЯ
- RenderTexture B содержит всю необходимую нам информацию.
- Когда пользователь касается экрана, сэмплируйте соответствующий пиксель из RenderTexture B, используя glReadPixel, и выясните из двоичного кода коснувшиеся формы.
Лучший