【发布时间】:2011-07-29 19:25:54
【问题描述】:
我正在学习在 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。
【问题讨论】:
-
正如 Matias Valdenegro 下面所述,您需要渲染到 FBO。但是当你这样做并使用你的着色器渲染时,它会很亮,你应该除以三而不是二以获得正确的平均值。转换为灰度时更常用的方法是使用颜色分量的加权和。请参阅mathworks.com/help/toolbox/images/ref/rgb2gray.html 了解哪些权重是好的。
-
感谢您指出这一点。是我的代码中的错字。
-
而且你一开始就不应该加和除。您应该使用
dotinstrinsic 函数,该函数映射到一个指令,该指令可以一步完成,而且速度要快得多。 -
我的意思是
dot(theColor.xyz, vec3(0.3333))。点积将两个向量相乘,然后将分量相加。这正是您正在做的事情,除了它是一个单一的 1 周期指令。见dot -
@Damon:它可能是“单 1 周期指令”。它也可能是 3 条指令(一个向量乘法,两个从属相加)。但是,不管它是什么,它仍然会优于他的代码。或者在最坏的情况下,它不会慢,所以他仍然应该这样做。
标签: opengl-es glsl shader opengl-es-2.0 fragment-shader