Компьютерная графика

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Transform Feedback

Сообщений 1 страница 5 из 5

1

Интересно пишет pbrown из Нвидии в спеце к TF в одной и той же главе:

When neither a vertex nor geometry shader is active, the vertex attributes
produced by fixed-function vertex processing or an assembly vertex or
geometry program can be recorded in transform feedback mode. The set of
attributes to record is specified by
void TransformFeedbackAttribsNV(sizei count, const int *attribs,
enum bufferMode)
...
The TransformFeedbackAttribsNV() command sets transform feedback state
which is used both when the GL is in fixed-function vertex processing
mode, as well as when an assembly vertex and/or geometry program is
active.

Я еще пока не ругаюсь на это, но некоторое недопонимание уже возникает:)
И это недопонимание выливается в следующий код: что же использовать - varyings
или attribs ? ;)
Для fixed pipeline все работает, с шейдером - нини. Будем читать спек дальше ))

Код:
    GLint attribs[] = { GL_POSITION, compCount, 0 };
    glTransformFeedbackAttribs ( 1, attribs, GL_SEPARATE_ATTRIBS_NV );
    ...
    // для prog установлен только вершинный шейдер "gl_Position = gl_Vertex;"
    glUseProgram ( prog );

    glBindBufferOffset ( GL_TRANSFORM_FEEDBACK_BUFFER_NV, 0, buffers[1 - currentBuffer], 0 );

    glBeginTransformFeedback ( GL_POINTS );
    glEnable ( GL_RASTERIZER_DISCARD_NV );

    glBeginQuery ( GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV, query );
    
    DrawBuffer ( GL_POINTS );
    
    glEndQuery ( GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV );

    glDisable ( GL_RASTERIZER_DISCARD_NV );
    glEndTransformFeedback ();

    glGetQueryObjectuiv ( query, GL_QUERY_RESULT, &primWritten );

    currentBuffer = 1 - currentBuffer;

    glUseProgram ( 0 );

PS: Еще больше неудовольствия вызывает тут из NV SDK. Сравните:

It is an invalid operation error to call BeginTransformFeedbackNV,
TransformFeedbackBufferNV, TransformFeedbackVaryingsNV,
TransformFeedbackAttribsNV, or UseProgram or LinkProgram on the currently
active program object while transform feedback is active.

и

Код:
glBindBufferOffsetNV(GL_TRANSFORM_FEEDBACK_BUFFER_NV, 0, vbo[1-current_buffer], 0);

    glBeginTransformFeedbackNV(feedback_prim);
    glEnable(GL_RASTERIZER_DISCARD_NV);    // disable rasterization

    glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV, query);

    // какого бл*** вы тут ставите шейдер, если сами написали, что INVALID_OPERATION???!!!!

    cgGLBindProgram(passthru_vprog);
    cgGLEnableProfile(cg_vprofile);

    cgGLBindProgram(subdivide_gprog);
    cgGLEnableProfile(cg_gprofile);
    cgGLSetParameter1f(terrain_rand_scale, rand_scale);
    cgGLSetParameter2f(terrain_rand_xform, rand_xform_scale, rand_xform_offset);

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, rand_tex);

    draw_buffer_geom(vbo[current_buffer], input_prim, primitives_written*verts_per_prim/prim_output_div);

    cgGLDisableProfile(cg_vprofile);
    cgGLDisableProfile(cg_gprofile);

    glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV);
  
    glDisable(GL_RASTERIZER_DISCARD_NV);
    glEndTransformFeedbackNV();

Что ж они маги какие что ли ? ))) Нашаманили и работает ? Хых

0

2

Так дял fixed pipelne и шейдеров соврешенно разный способ задания атрибутов для transform feedback - даже через разные функции

0

3

Я привел пример из спека: черным по-белому написано, что "TransformFeedbackAttribsNV() устанавливает стейт в обоих режимах как для фикспайпа, так и для активного вершинного (+геом) шейдера"!!
В то же время, в первом абзаце говорится, что для случая с шейдерами нужно ставить стейт с помощью вариингов!!!
Ну и черт с ним, пусть так, но я что же должен устанавливать в качестве активного вариинга gl_Position?!!! Он и так активный!!! Попробую конечно, но что-то этот вариант мне не кажется логичным.

Кстати говоря, в туте нвидии шейдеры используются и ставится стейт как раз через TransformFeedbackAttribsNV() !!!! Хотя при отключении геометрического шейдера все перестает работать. Вот незадача ))

0

4

Решил проблему, действительно, через glTransformFeedbackVaryings (). Единственное, что казалось непонятным, это то, как задавать размерность записываемых данных. Очень просто: через тип варианга )). Но все же, как в NvSDK TF работает через функцию аттрибутов с использованием шейдеров, мне не понятно. Так же кажется недоразумением существование двух, по сути, противоречивых абзаца в главе Section 2.Y, Transform Feedback спецификации GL_NV_transform_feedback, указанных ранее.

ПС: (не в тему конечно, но все же)
1. Статья про ТФ лежит в какой-то непонятной директории tutorials, хотя по идее должна быть в артиклах, вследствие чего недоступна для просмотра через последние (и только через главную страницу/или мб я ее не нашел там просто :)) .
2. На той же странице, что и статья ТФ, нет ссылки на форум через панель ссылок (вернее ее нигде нет на данной странице:))

Отредактировано stea1th (2009-05-29 12:50:48)

0

5

На самом деле все статьи лежат в tutorials, просто она скорее всего не вписана в articels.html
Вечером исправлю

0



создать форум