片段着色器如何使用先前渲染帧的颜色值?

时间:2011-07-25 13:45:38

标签: opengl-es glsl shader opengl-es-2.0 fragment-shader

我正在学习在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代表当前像素。在同一坐标上访问前一个像素也很酷。

为了好奇,我想将当前像素的颜色添加或乘以前一个渲染帧中的像素颜色。

我如何保留前面的像素并将它们传递到我的片段着色器以便对它们执行某些操作?

注意:它是iPhone上的OpenGL ES 2.0。

2 个答案:

答案 0 :(得分:4)

您需要使用帧缓冲对象(FBO)将前一帧渲染到纹理,然后您可以在片段着色器中读取此纹理。

答案 1 :(得分:-1)

Damon 所指的点内在函数是数学点积的代码实现。我对OpenGL并不十分熟悉,所以我不确定函数的确切函数是什么,但数学上的点积是这样的:

鉴于vector avector b'dot' product a 'dot' b会产生标量结果c

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

大多数现代图形硬件(以及CPU)都能够一次完成这种操作。在您的特定情况下,您可以使用点积来轻松计算平均值:

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

由于某种原因,我总是将齐次向量和矩阵中的第4个分量混合起来。

highp float avg = theColor DOT vec4

这将多个组件的多个1/3(和第四个组件加0),然后将它们加在一起