2011-07-25 3 views
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です。

+0

Matias Valdenegroは以下のようにFBOにレンダリングする必要があります。しかし、それを行い、シェーダを使ってレンダリングするとかなり明るくなります。正しい平均値を得るには、2つではなく3つに分割する必要があります。グレースケールに変換するときによく使用される方法は、カラーコンポーネントの加重和を使用します。適切な重み付けについては、http://www.mathworks.com/help/toolbox/images/ref/rgb2gray.htmlを参照してください。 – Rickard

+0

これを指摘してくれてありがとう。私のコードに誤字がありました。 –

+0

そして、最初に追加したり分割したりするべきではありません。あなたは、 'dot'イントリンシック関数を使うべきです。これは、一つのステップで実行する命令にマップし、はるかに高速です。 – Damon

答えて

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)は、この種の操作を1回のパスで実行することができます。私は常になんらかの理由により混合、均質ベクトルや行列で4番目のコンポーネントを取得

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

:あなたの特定のケースでは、あなたはとてもような内積で簡単にあなたの平均を計算することができます。

highp float avg = theColor DOT vec4 

これは複数1/3によってtheColorの各成分(0による第4成分)、その後が一緒それらを追加します。

関連する問題