#android #opengl-es #glsl #opengl-es-2.0 #fragment-shader
#Android #opengl-es #glsl #opengl-es-2.0 #фрагмент-шейдер
Вопрос:
Мой код рисует фоновое изображение и рисует некоторые другие изображения (частицы) поверх этого изображения. Я хочу, чтобы частицы имели некоторые эффекты смешивания, такие как затемнение, осветление, сжигание… то же самое, что делает Canvas globalcompositeoperation . Итак, в шейдере фрагмента мне нужно получить предыдущий цвет фрагмента и смешать его с новым цветом. Но я не смог найти способ сделать это.
Комментарии:
1. httpdigest, можете ли вы помочь мне, как выполнить аппаратное смешивание?
Ответ №1:
Нет, в стандарте нет такой возможности. Однако с расширениями EXT_shader_framebuffer_fetch (устройства, отличные от Mali) и ARM_shader_framebuffer_fetch (устройства Mali) может быть считано значение из фреймбуфера (начиная с OpenGL 2.0 и для OpenGL ES 2.0 / 3.0):
Это расширение предоставляет механизм, посредством которого фрагментный шейдер может считывать существующие данные фреймбуфера в качестве входных данных. Это можно использовать для реализации операций компоновки, которые были бы неудобны или невозможны при смешивании с фиксированной функцией. Его также можно использовать для применения функции к цвету фреймбуфера, написав шейдер, который использует существующий цвет фреймбуфера в качестве единственного входного сигнала.
Обратите внимание, что нет никакой гарантии, что аппаратное обеспечение будет поддерживать расширение. Вам нужно проверить, поддерживается ли расширение или нет во время выполнения.
Если вы хотите прочитать фрагменты из предыдущего рендеринга, обычным способом является реализация нескольких проходов рендеринга и рендеринг в текстуру. Смотрите также LearnOpenGL — Отложенное затенение.
Во многих случаях нет необходимости читать фрагменты в фрагментном шейдере. Множество эффектов рендеринга могут быть реализованы с использованием стандартных функций наложения. Функция смешивания может быть изменена с glBlendFunc
помощью и уравнение смешивания может быть изменено с glBlendEquation
помощью.
Ответ №2:
Да, это возможно. Сначала отобразите результат в texturebuffer. Затем отправьте texturebuffer второму шейдеру для применения эффектов.
чтобы узнать, как это сделать, найдите ключевые слова GLES20.glBindFramebuffer (GL_FRAMEBUFFER, mFramebuff);