1

キューブ マップ テクスチャで Render to Texture コンセプトを使用しようとしていますが、描画呼び出しでテクスチャがジオメトリに適用されません。これが私のコードです

#define WIDTH 64
#define HEIGHT 64
glGenTextures(1, &id1);
glBindTexture(GL_TEXTURE_CUBE_MAP, id1);

glGenFramebuffers(1, &Fboid);
for(int i=0;i<6;i++)
{
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);


glTexImage2D(types[i], 0, GL_RGBA,WIDTH, HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE,0);


}
glBindFramebuffer(GL_FRAMEBUFFER, Fboid);


    for(int i=0;i<6;i++)                      
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,types[i],id1,0);


draw_cube();

glBindFramebuffer(GL_FRAMEBUFFER, 0);

draw();

フレームバッファのバインドが完了しているかどうかを確認しました。また、 draw_cube() は、期待どおりにジオメトリを正しく描画します。FBO を削除して glteximage2D() にデータを提供すると、cubemap テクスチャが draw() 呼び出しでジオメトリに正しく適用されます。幅の高さは、draw_cube 呼び出しで設定されたビューポートと同じです。

上記のコードの何が問題になっていますか?

4

1 に答える 1

1

ループの本体に正確に属するものを言うのは難しいですfor(ヒント: 質問の正しい書式設定が役立ちました)。しかし、それにもかかわらず、現在の書き方はあまり意味がありません。

ステートメントの後の 1 行のみの場合for(現在のように)、すべての立方体面を同じ色のアタッチメントにバインドしているため、最後の呼び出し ( types[5]) のみが優先され、奇妙に思えます。一度に 6 つの面すべてをバインドする (したがって、複数のレンダーdraw_cubeターゲットを使用して一度に 6 つの面すべてにレンダリングする) 場合は、. ただし、この場合、ハードウェア/ドライバーによっては、アクティブな複数のレンダー ターゲットの数が 6 というのはかなり多い (つまり、多すぎる) 場合があります。GL_COLOR_ATTACHMENT0 + iGL_COLOR_ATTACHMENT0

しかし、draw_cube呼び出しは -loop にも属している可能性がありforます (したがって、6 つの面を個別にレンダリングします)。この場合、ループに入れる必要があります。

for(int i=0;i<6;i++)
{
    glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,types[i],id1,0);
    draw_cube();
}

編集: Nicol Bolasがコメントで指摘しているように、レイヤード レンダリングを使用してキューブ マップ全体をレンダー ターゲットとしてバインドし、ジオメトリ シェーダー出力変数を使用しgl_Layerて、プリミティブが入るキューブ マップ面を決定することもできます。

この場合、1 回の呼び出しで済みます。

//note: just ...Texture, without ...2D!
glFramebufferTexture(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, id1, 0); 
于 2012-12-06T16:18:26.547 に答える