2

OpenGL の 3D テクスチャに問題があります。

テクスチャを設定します

glTexImage3D(GL_TEXTURE_3D, 0, GL_LUMINANCE, 640, 480, 8, 0, GL_RED, GL_UNSIGNED_BYTE, tex3Ddata);

tex3Ddata は 640x480 ビットマップの合計 8 スライスです。テクスチャ座標でさまざまなスライスにアクセスしようとすると、何らかの理由で画像が互いに溶け合ってしまい、座標を適切に設定できませんが、その理由はわかりません。テクスチャ スライス自体は 8 ビット モノクロです。

表示用のコード:

for(unsigned int i = 0; i < g_numCameras; i++) {
    float tx = ((float)i) / ((float)g_numCameras - 1);
    //tx = 0.5f; //this is for testing only
    float fI = ((float)i) / ((float)g_numCameras);
    if( i < (g_numCameras >> 1)) {
        glTexCoord3f(0.0f, 1.0f, tx); 
        glVertex3f( -1.0f + fI * 4.0f, 0.0f,  0.5f);

        glTexCoord3f(1.0f, 1.0f, tx); 
        glVertex3f( -1.0f + (fI + 1.0f / ((float)g_numCameras)) * 4.0f, 0.0f,  0.5f);

        glTexCoord3f(1.0f, 0.0f, tx); 
        glVertex3f( -1.0f + (fI + 1.0f / ((float)g_numCameras)) * 4.0f,  1.0f,  0.5f);

        glTexCoord3f(0.0f, 0.0f, tx); 
        glVertex3f( -1.0f + fI * 4.0f,  1.0f,  0.5f);
    }
    else {
        fI -= 0.5f;
        glTexCoord3f(0.0f, 1.0f, tx); 
        glVertex3f( -1.0f + fI * 4.0f, -1.0f,  0.5f);

        glTexCoord3f(1.0f, 1.0f, tx); 
        glVertex3f( -1.0f + (fI + 1.0f / ((float)g_numCameras)) * 4.0f, -1.0f,  0.5f);

        glTexCoord3f(1.0f, 0.0f, tx); 
        glVertex3f( -1.0f + (fI + 1.0f / ((float)g_numCameras)) * 4.0f,  0.0f,  0.5f);

        glTexCoord3f(0.0f, 0.0f, tx); 
        glVertex3f( -1.0f + fI * 4.0f,  0.0f,  0.5f);
    }
}

g_numCameras は 8 なので、Z 座標 0.0f、1/7、2/7、...、1.0f を介してスライスにアクセスできると思います。それでも、常に補間されます。私は tx=0.5f; でテストしました。も同様ですが、これも画像の組み合わせです。x/y 座標は適切に機能し、8 つのクワッドは期待どおりに配置されていますが、立方体をスライスするだけでは、期待どおりに機能しません。

ここで私が間違っていることはありますか?(3d テクスチャに関する同等の回答/例を見つけることができませんでした)。

また、同じ画像を 8 回アップロードしてデータが適切かどうかをテストしましたが、問題なく動作しました (補間により元の画像が得られるため、元の画像を取得しました)。

4

3 に答える 3

12

何が起こるかというと、これらのテクスチャ座標はテクセルの中心ではなく、テクセル間のエッジに対応しています。次元 8 の 1D テクスチャがあるとします。

| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |

次に、最初|はテクスチャ座標 0.0 で、最後|はテクスチャ座標 1.0 です。

0.0                             1.0
0/8                             8/8
 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |

分数のセット全体を書きましょう。

0/8 1/8 2/8 3/8 4/8 5/8 6/8 7/8 8/8
 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |

ヒットしたいのは、テクセルの中心、つまり棒の間の数字です。|1| 0/8 から 1/8 の中間、つまり (0/8+1/8)/2 = 1/16、|2| は 1/8 と 2/8 の間 = (1/8 + 2/8)/3 = 3/16 などです。

したがって、対処するテクスチャ座標は 1/16 3/16 5/16 7/16 9/16 11/16 13/16 15/16 です。

またはより一般的な形式で:(1 + 2*t) / 2*dim

于 2011-03-30T15:27:46.453 に答える
3

あなたの期待はずれです。

各スライスi(0 からのインデックス) は で入手できます(i+0.5) / num_slices

0.f は最初のスライスと境界線の中間で補間することを意味し、1.f は最後のスライスと境界線の中間で補間することを意味します (クランプを想定)。

0.5 はちょうど真ん中にあり、スライス 3 と 4 の間にあります (カウントが 0 から始まる場合)。したがって、2 つのスライスの間でブレンドが得られます。

于 2011-03-30T15:26:16.927 に答える
2

次のように呼び出しても問題ありませんか。

glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

それは補間をオフにするはずです。

于 2011-03-30T15:25:50.920 に答える