私は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にレンダリングする必要があります。しかし、それを行い、シェーダを使ってレンダリングするとかなり明るくなります。正しい平均値を得るには、2つではなく3つに分割する必要があります。グレースケールに変換するときによく使用される方法は、カラーコンポーネントの加重和を使用します。適切な重み付けについては、http://www.mathworks.com/help/toolbox/images/ref/rgb2gray.htmlを参照してください。 – Rickard
これを指摘してくれてありがとう。私のコードに誤字がありました。 –
そして、最初に追加したり分割したりするべきではありません。あなたは、 'dot'イントリンシック関数を使うべきです。これは、一つのステップで実行する命令にマップし、はるかに高速です。 – Damon