1

我正在学习在 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。

4

2 回答 2

5

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

于 2011-07-25T15:58:39.290 回答
-1

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

给定 avector a和 a vector 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

这会将theColor 的每个分量乘以1/3(以及第 4 个分量乘以 0),然后将它们相加

于 2011-07-28T15:02:02.137 回答