Интересно пишет 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();
Что ж они маги какие что ли ? ))) Нашаманили и работает ? Хых