Как фрагментный шейдер может использовать значения цвета ранее визуализированного кадра? - PullRequest
1 голос
/ 25 июля 2011

Я учусь использовать шейдеры в OpenGL ES.

В качестве примера: Вот мой фрагментный шейдер игровой площадки, который берет текущий видеокадр и делает его в градациях серого:

varying highp vec2 textureCoordinate;

uniform sampler2D videoFrame;

void main() {
    highp vec4 theColor = texture2D(videoFrame, textureCoordinate);
    highp float avrg = (theColor[0] + theColor[1] + theColor[2]) / 3.0;
    theColor[0] = avrg; // r
    theColor[1] = avrg; // g
    theColor[2] = avrg; // b
    gl_FragColor = theColor;
}

theColor представляет текущий пиксель.Было бы здорово также получить доступ к предыдущему пикселю по этой же координате.

Ради любопытства я хотел бы добавить или умножить цвет текущего пикселя на цвет пикселя в предыдущемвизуализировать кадр.

Как можно сохранить предыдущие пиксели вокруг и передать их фрагментному шейдеру, чтобы что-то с ними сделать?

Примечание. Это OpenGL ES 2.0 на iPhone.

Ответы [ 2 ]

4 голосов
/ 25 июля 2011

Вам необходимо визуализировать предыдущий кадр в текстуру, используя объект Framebuffer (FBO), затем вы можете прочитать эту текстуру в своем фрагментном шейдере.

0 голосов
/ 28 июля 2011

Внутренняя функция dot , на которую ссылается Damon , является реализацией кода математического точечного произведения.Я не очень хорошо знаком с OpenGL, поэтому я не уверен, каков точный вызов функции, но математически точечный продукт выглядит следующим образом:

С учетом vector a и vector b, 'dot' product a 'dot' b дает скалярный результат c:

c = a.x * b.x + a.y * b.y + a.z * b.z

Большинство современного графического оборудования (и, в данном случае, процессоров) способны выполнять операции такого рода за один проход.В вашем конкретном случае вы можете легко вычислить среднее значение с помощью точечного произведения, например, так:

highp vec4 = (1/3, 1/3, 1/3, 0) //or zero

Я всегда получаю 4-й компонент в однородных векторах и матрицах, по некоторым причинам перепутанных.

Это умножит каждый компонент theColor на 1/3 (а 4-й компонент на 0), а затем сложит их вместе .

...