このサンプルをg-trucから joglに移植したところ、うまくいきました。
しかし今、私は of が何stream
をglDrawTransformFeedbackStream
指しているのかを正確に理解しようとしています。
基本的に、vec4 position
入力は次のように変換されます
String[] strings = {"gl_Position", "Block.color"};
gl4.glTransformFeedbackVaryings(transformProgramName, 2, strings, GL_INTERLEAVED_ATTRIBS);
次のように:
void main()
{
gl_Position = mvp * position;
outBlock.color = vec4(clamp(vec2(position), 0.0, 1.0), 0.0, 1.0);
}
transform-stream.vert、transform-stream.geom
そして、変換されたオブジェクトを単純にレンダリングしますglDrawTransformFeedbackStream
feedback-stream.vert、feedback-stream.frag
今、彼らが言うドキュメントに基づいて:
プリミティブ カウントを取得する変換フィードバック ストリームのインデックスを指定します。
かっこいいので、ここfeedbackArrayBufferName
にバインドすると0
gl4.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, feedbackName[0]);
gl4.glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, feedbackArrayBufferName[0]);
gl4.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
そうあるべきだと思います。
また、ジオメトリ シェーダーは(のみ) 色をインデックス 0 に出力します。位置についてはどうでしょうか。それらはすでにストリーム 0 にあると想定されていますか? どのように?からglTransformFeedbackVaryings
?
したがって、このストリームへのすべての参照を 1 に切り替えて、それらがすべて一貫しているかどうか、およびそれらが同じインデックスを参照しているかどうかを確認しようとしました。
だから私は修正しました
gl4.glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 1, feedbackArrayBufferName[0]);
と
gl4.glDrawTransformFeedbackStream(GL_TRIANGLES, feedbackName[0], 1);
また、ジオメトリ シェーダー内
out Block
{
layout(stream = 1) vec4 color;
} outBlock;
しかし、実行すると、次のようになります。
Program link failed: 1
Link info
---------
error: Transform feedback can't capture varyings belonging to different vertex streams in a single buffer.
OpenGL Error(GL_INVALID_OPERATION): initProgram
GlDebugOutput.messageSent(): GLDebugEvent[ id 0x502
type Error
severity High: dangerous undefined behavior
source GL API
msg GL_INVALID_OPERATION error generated. <program> object is not successfully linked, or is not a program object.
when 1455183474230
source 4.5 (Core profile, arb, debug, compat[ES2, ES3, ES31, ES32], FBO, hardware) - 4.5.0 NVIDIA 361.43 - hash 0x225c78a9]
GlDebugOutput.messageSent(): GLDebugEvent[ id 0x502
type Error
severity High: dangerous undefined behavior
source GL API
msg GL_INVALID_OPERATION error generated. <program> has not been linked, or is not a program object.
when 1455183474232
source 4.5 (Core profile, arb, debug, compat[ES2, ES3, ES31, ES32], FBO, hardware) - 4.5.0 NVIDIA 361.43 - hash 0x225c78a9]
何が起こっているのか知りたいと思ったら、ここでこれを見つけました
Output variables in the Geometry Shader can be declared to go to a particular stream. This is controlled via an in-shader specification, but there are certain limitations that affect advanced component interleaving.
No two outputs that go to different streams can be captured by the same buffer. Attempting to do so will result in a linker error. So using multiple streams with interleaved writing requires using advanced interleaving to route attributes to different buffers.
それは私に何が起こるのですか?position
インデックス 0 に、色をインデックス 1 にしますか?
私の仮説が正しいかどうか知りたいだけです。はいの場合は、ストリーム インデックスを変更して証明したいと思います。position
したがって、変更後にオン ストリーム 1 を色と一緒に設定する方法も知りたいです。この方法でジオメトリ シェーダーの出力を変更しますlayout(triangle_strip, max_vertices = 3, xfb_buffer = 1) out;
か?
文句を言うから
Shader status invalid: 0(11) : error C7548: 'layout(xfb_buffer)' requires "#extension GL_ARB_enhanced_layouts : enable" before use
それから私はそれを追加し、私は得る
error: Transform feedback can't capture varyings belonging to different vertex streams in a single buffer.
しかし、今では両方ともストリーム 1 にあるはずですが、何が欠けていますか?
また、ストリームの定義は何ですか?