2

GPU で計算を行った後、FBO に保存されている結果を VBO にコピーしてレンダリングしたいと考えています。

問題: コピーを実行すると、一部のデータが破損しているように見えます。バッファのフォーマットとサイズの両方を確認済みで、FBO に保存されているデータが正しいことも確認済みです。

FBO を初期化する次のコードを検討してください。

unsigned int verticesTextureId = AllocateTexture(GL_TEXTURE_RECTANGLE, mVBOSize, 1, GL_RGBA32F, GL_RGBA);
CHECK_FOR_OPENGL_ERRORS();

unsigned int normalsTextureId = AllocateTexture(GL_TEXTURE_RECTANGLE, mVBOSize, 1, GL_RGBA32F, GL_RGBA);
CHECK_FOR_OPENGL_ERRORS();

SetUpViewport(mVBOSize, 1);

glBindFramebuffer(GL_FRAMEBUFFER, mFBOId);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_RECTANGLE, verticesTextureId, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_RECTANGLE, normalsTextureId, 0);

また、VBO を初期化し、FBO から VBO にデータをコピーする次のコード:

mVerticesBufferId = AllocateVBO();
CHECK_FOR_OPENGL_ERRORS();

glBindBuffer(GL_PIXEL_PACK_BUFFER, mVerticesBufferId);
glBufferData(GL_PIXEL_PACK_BUFFER, mVBOSize * 4 * sizeof(float), 0, GL_STATIC_DRAW);

mNormalsBufferId = AllocateVBO();
CHECK_FOR_OPENGL_ERRORS();

glBindBuffer(GL_PIXEL_PACK_BUFFER, mNormalsBufferId);
glBufferData(GL_PIXEL_PACK_BUFFER, mVBOSize * 4 * sizeof(float), 0, GL_STATIC_DRAW);

glReadBuffer(GL_COLOR_ATTACHMENT0);
glBindBuffer(GL_PIXEL_PACK_BUFFER, mVerticesBufferId);
glReadPixels(0, 0, mVBOSize, 1, GL_RGBA, GL_FLOAT, 0);

glReadBuffer(GL_COLOR_ATTACHMENT1);
glBindBuffer(GL_PIXEL_PACK_BUFFER, mNormalsBufferId);
glReadPixels(0, 0, mVBOSize, 1, GL_RGBA, GL_FLOAT, 0);

ここでは、VBO を頂点/法線属性としてバインドし、描画を呼び出します。

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);

glBindBuffer(GL_ARRAY_BUFFER, mVerticesBufferId);
glVertexPointer(4, GL_FLOAT, 4 * sizeof(float), 0);

glBindBuffer(GL_ARRAY_BUFFER, mNormalsBufferId);
glNormalPointer(GL_FLOAT, 4 * sizeof(float), 0);

glDrawArrays(GL_POINTS, 0, mVBOSize);

glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);

この呼び出しの後、ほとんどの点が画面上に正しく表示されますが、一部の点は奇妙にずれて表示されます。負の成分または 1 より大きい成分を持つ頂点が正しく表示されているため、これは信号やクランプとは無関係のようです。

正しくレンダリングされていないkosh スノーフレーク(カーブ)の写真を添付し​​ます。

1) ポイントとしてレンダリングされた頂点:

Kosh Snowflake (間違った頂点が赤い丸で囲まれています)

2) 単純なジオメトリ シェーダーを使用して、ライン ストリップとしてレンダリングされた頂点:

Kosh Snowflake (赤い丸で囲まれた間違った頂点)

参考画像:

正しいコッシュ スノーフレーク

4

1 に答える 1

3

gDEBugger を使用すると、VBO のデータも正しいことがわかりました。問題は、フラグメント シェーダーの計算後、ベクトル (w) の均一なコンポーネントにガベージがあり、トランスフォームに望ましくない影響を与えることでした。

于 2012-11-26T18:02:47.430 に答える