2012-04-23 21 views
2

グリッド値を保持するためにテクスチャマップを使用するOpenGL ES fluid simulationに取り組んでいます。私は単に私のフラグメントプログラムは、各フラグメントのために呼び出されます四辺形を充填していたグリッドを反復処理するには補間テクスチャ座標

for (int r = 0; r < 128; r++) 
    for (int c = 0; c < 128; c++) 
     process grid element at (c,r) 

:私は、次のループを模倣グリッドを通して反復処理する必要があります。テクスチャ座標(0,0)、(1,0)、(0,1)、(1,1) は頂点(-1、-1)、(+ 1、-1)、( - 1、+ 1)、(+ 1、+ 1)及びIとしてFBOに取り付けられた128×128テクスチャマップに三角形ストリップとしてクワッド()をレンダリングは、以下:

glBindFramebuffer(GL_DRAW_FRAMEBUFFER, texFrameBuffer); 
glViewport(0, 0, TEX_IMAGE_WIDTH, TEX_IMAGE_HEIGHT); // 128 x 128 

glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); 
glEnableVertexAttribArray(positionAttr); 
glVertexAttribPointer(positionAttr, 2, GL_FLOAT, GL_FALSE, 0, 0); 

glBindBuffer(GL_ARRAY_BUFFER, texCoordBuffer); 
glEnableVertexAttribArray(texCoordAttr); 
glVertexAttribPointer(texCoordAttr, 2, GL_FLOAT, GL_FALSE, 0, 0); 

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

頂点シェーダは、単に位置を通過しますテクスチャ座標は変更されずにそのまま使用されます。どのようなテクスチャ座標が生成されているのかを理解するために、テクスチャ座標を画像に取り込むことにしました。フラグメントプログラムは、与えられた2Dテクスチャは、出力色の赤と緑のチャネルに座標を割り当て:私は、バッククライアント空間にテクスチャ画像を読み取るglGetTexImage()を使用

varying vec4 texCoord; 
void main() { 
    gl_FragColor = vec4(texCoord.st,0,1); 
} 

。質問にすぐ

(column, row) = [s, t] -> (128*s, 128*t) 

(0,0) = [0.00392157, 0.00392157] -> (0,0) 
(1,0) = [0.01176471, 0.00392157] -> (1,0) 
(2,0) = [0.01960784, 0.00392157] -> (2,0) 
(3,0) = [0.02745098, 0.00392157] -> (3,0) 
(4,0) = [0.03529412, 0.00392157] -> (4,0) 
(5,0) = [0.04313726, 0.00392157] -> (5,0) 
(6,0) = [0.05098040, 0.00392157] -> (6,0) 
(7,0) = [0.05882353, 0.00392157] -> (7,0) 
(8,0) = [0.06666667, 0.00392157] -> (8,0) 
(9,0) = [0.07450981, 0.00392157] -> (9,0) 
(10,0) = [0.08235294, 0.00392157] -> (10,0) 
<snip> 
(125,0) = [0.98039222, 0.00392157] -> (125,0) 
(126,0) = [0.98823535, 0.00392157] -> (126,0) 
(127,0) = [0.99607849, 0.00392157] -> (127,0) 
(0,1) = [0.00392157, 0.01176471] -> (0,1) 
(1,1) = [0.01176471, 0.01176471] -> (1,1) 
(2,1) = [0.01960784, 0.01176471] -> (2,1) 
<snip> 
(124,127) = [0.97254908, 0.99607849] -> (124,127) 
(125,127) = [0.98039222, 0.99607849] -> (125,127) 
(126,127) = [0.98823535, 0.99607849] -> (126,127) 
(127,127) = [0.99607849, 0.99607849] -> (127,127) 

:以下 は、画像内の各画素について生成されたテクスチャ座標(s、t)のサンプルです。私はこれらの生成された座標を理解しようとしています。 マジック値​​は(0.5 * 1/127.5)です。私は、事前に追加されている丸め値の役割を果たす0.5因子を理解していますが、なぜ127.5ですか? (0.5 * 1/128.0)はもっと理にかなっていますか?誰でもこれらの座標を説明できますか?私は、テクスチャ座標から整数グリッド座標を生成したいだけです(OpenGL ESではsampler2Drect)。

答えて

3

私はいつもこれに苦しんでいます。私はそれを説明できるかどうかを見てみましょう。

グリッドの1行を想像してみてください。次の図では、その行の各フラグメント(0〜127)に番号を付けました。私はピクセルの下にいくつかのテクスチャ座標を入れました。左端が0.0で右端が1.0であることに注意してください。

+-----------+-----------+-----------+-----------+--- ---+-----------+ 
|   |   |   |   |   |   | 
|   |   |   |   |   |   | 
|  0  |  1  |  2  |  3  | . . . | 127 | 
|   |   |   |   |   |   | 
|   |   |   |   |   |   | 
+-----------+-----------+-----------+-----------+--- ---+-----------+ 
^   ^  ^  ^     ^  ^
|   |   |   |      |   | 
|   |   |   |      |   | 
0/128  1/128  2/128  3/128    127/128  128/128 

レンダリングフラグメントをテクスチャしたい場合、それは断片の中心のテクスチャ座標を使用して - 数です。フラグメント0の中心は、0/128(別名0)と1/128(別名.0078125)の中間にあることに注意してください。それは1/256(別名.00390625)です。

ので、私は式が良いように表すことと思います。

coordinate = (pixelId + 0.5)/128 

ここで答えを取得するいくつかのpython あなたに似ています:

for i in range(128): 
    print (0.5 + i)/128 


0.00390625 
0.01171875 
0.01953125 
0.02734375 
0.03515625 
0.04296875 
... 
0.97265625 
0.98046875 
0.98828125 
0.99609375 

私は私の結果の差と思われますあなたの結果は、あなたの値が1つの[8ビット]カラーチャンネルに絞られてシェーダーから戻されるという事実と関係しています。

こちらがお役に立てば幸いです。

+0

"あなたのグリッドの128行を想像してみてください。"お願いします?ありがとう、@ JohnFisher。 –

+0

私は私の歪んだ文章を修正した。 – certainmagic

関連する問題