-1

GL_INTERLEAVED_ATTRIBS のように 1 つだけではなく GL_SEPARATE_ATTRIBS を使用する場合、複数の変換フィードバック バッファを読み戻すにはどうすればよいですか? この例では、2 つのバッファーをセットアップし、それらを変換フィードバック用にセットアップします。

//gen,bind,buffer GL_ARRAY_BUFFER buffer0
//gen,bind,buffer GL_ARRAY_BUFFER buffer1
//gen,bind GL_TRANSFORM_FEEDBACK feedback
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buffer0);
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 1, buffer1);

const GLchar* _varyings[] = { "pos", "color" };
glTransformFeedbackVaryings(program, 2, _varyings, GL_SEPARATE_ATTRIBS);
glLinkProgram(program);

//bind VAO and draw with TF enabled
glBeginTransformFeedback(GL_TRIANGLES);
glDrawArrays(GL_TRIANGLES, 0, numberOfVertices);
glEndTransformFeedback();

単一のバッファを使用すると、 onGL_INTERLEAVED_ATTRIBSを呼び出すことで単一のバッファを読み戻すことができます。glGetBufferSubDataGL_TRANSFORM_FEEDBACK_BUFFER

std::vector<float> fb;
fb.resize(3*numberOfVertices);
glGetBufferSubData(GL_TRANSFORM_FEEDBACK_BUFFER, 0, fb.size() * sizeof(float), fb.data());

buffer0ただし、両方のバッファを読み戻し、 ofでbuffer1インデックス付け(0,1)し たいことを OpenGL に伝えるにはどうすればよいですか?glBindBufferBaseGL_TRANSFORM_FEEDBACK_BUFFER

私が見つけたすべてのチュートリアルでは、常にこれを単一のバッファーに単純化GL_INTERLEAVED_ATTRIBSし、VAO 入力レイアウトに従って TF 出力を一致させるために個別のバッファーを使用するか、単にバッファー データをまったく読み戻さないことが可能であることを説明しています。

4

1 に答える 1

1

変換フィードバックを使用して複数のバッファーを読み戻すことは、一般的に複数のバッファーを読み戻すことと変わらないため、尋ねられた特定の質問に使用できる例はありませんでした。あなたはバッファをバインドします - あなたはそれを読みます。変換フィードバック オブジェクトとそのバッファー ベースは、キャプチャした出力を格納する方法を OpenGL に通知するだけです。

std::vector<float> _bufferfeedback0;
_bufferfeedback0.resize(3*numberOfVertices);//e.g. x,y,z per vertex
glBindBuffer(GL_ARRAY_BUFFER, buffer0);         
glGetBufferSubData(GL_ARRAY_BUFFER, 0, 3*numberOfVertices*sizeof(float), _bufferfeedback0.data());

std::vector<float> _bufferfeedback1;
_bufferfeedback1.resize(3*numberOfVertices);//e.g. r,g,b per vertex
glBindBuffer(GL_ARRAY_BUFFER, buffer1);         
glGetBufferSubData(GL_ARRAY_BUFFER, 0, 3*numberOfVertices*sizeof(float), _bufferfeedback1.data());
于 2016-06-23T09:51:26.507 に答える