glDrawTransformFeedbackStream, на что ссылается поток?

Я перенес этот пример на jogl из g-truc, и он работает, все хорошо, все хорошо.

Но сейчас я пытаюсь понять, что именно 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, чего мне не хватает?

Кроме того, каково определение потока?

0 ответов

Другие вопросы по тегам