2016-09-14 3 views
1

с использованием OpenGL 4.5 и карты NVidia, я заметил, что при переключении объектов обратной связи преобразования через glBindTransformFeedback() привязки привязанных массивов, установленные с glBindBufferBase(), не изменяются.Буферные привязки объектов обратной связи преобразования

Посмотрите на следующие фрагменты:

Пусть имеется пара преобразующих обратной связи и буфера вершин объектов:

GLuint tfo1, vbo1; 
glGenTransformFeedbacks(1, &tfo1); 
glGenBuffers(1, &vbo1); 
glBindBuffer(GL_ARRAY_BUFFER, vbo1); 
glBufferData(GL_ARRAY_BUFFER, 123 * sizeof(float), nullptr, GL_DYNAMIC_DRAW); 

glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfo1); 
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, vbo1); 

Результат запроса с использованием glGetIntegerv():

GL_TRANSFORM_FEEDBACK_BINDING: 1 
GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: 1 

Пусть быть другой парой таких объектов:

GLuint tfo2, vbo2; 
glGenTransformFeedbacks(1, &tfo2); 
glGenBuffers(1, &vbo2); 
glBindBuffer(GL_ARRAY_BUFFER, vbo2); 
glBufferData(GL_ARRAY_BUFFER, 123 * sizeof(float), nullptr, GL_DYNAMIC_DRAW); 

glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfo2); 
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, vbo2); 

Результат запроса с использованием glGetIntegerv():

GL_TRANSFORM_FEEDBACK_BINDING: 2 
GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: 2 

И теперь встает вопрос: После создания второй пары, связывание предыдущего преобразования буфера объекта tfo1 ...

glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfo1); 

... приводит к следующий запрос:

GL_TRANSFORM_FEEDBACK_BINDING: 1 
GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: 2 <--- WHY NOT 1? 

Связанный TFO теперь tfo1, но привязка буфера массива не была изменена. Похоже, что привязка буфера не является частью состояния TFO, но может ли это быть? Не управляет привязками буфера основной причиной существования TFOs?

+0

«* Не управляет привязками буфера, основная причина существования TFOs? *« Нет; основной причиной, по которой обращаются объекты обратной связи, является возможность приостановки и возобновления операций обратной связи. Конечно, они содержат привязки объектов буфера. Но вы должны показать нам * действительный код *, где вы запрашиваете этот материал. Потому что я сильно подозреваю, что вы неправильно запрашиваете буфер. –

+0

Тест-сценарий для выбора источника обратной связи источника/целевого буфера [ссылка] (http://balkanassault.com/misc/tfo_testcase.cpp) – dau

ответ

1

Согласно OpenGL 4.5 core profile specification, как родовое GL_TRANSFORM_FEEDBACK_BUFFER_BINDING (который должен быть запрошен с glGetIntegerv, а также индексированными привязками (будет запрошен с glGetIntegeri_v) является частью преобразования обратной связи состояний объекта. Раздел 13.2.1 «Transform Обратной связи Объекты»государства (курсив мой)

Спектрально создается объект обратной связи путем связывания имя, возвращенное GenTransformFeedbacks с командой void BindTransformFeedback(enum target, uint id); в результате преобразования объекта обратной связи представляет собой новый вектор состояния, включающий в себя все государственные и те же начальные значения перечисленные в таблице 23.48.

со столом 23.48, содержащий как:

TRANSFORM_FEEDBACK_BUFFER_BINDING | Z+ | GetIntegerv | 0 | Buffer object bound to generic bind point for transform feedback 
TRANSFORM_FEEDBACK_BUFFER_BINDING |n x Z+| GetIntegeri_v | 0 | Buffer object bound to each transform feedback attribute stream 
[...] 

Таким образом, в вашем примере, переключение обратно tfo1 также должен восстановить родовое преобразование обратной связи буфера связывания обратно vbo1. Я попробовал ваш пример. В реализации AMD (Windows 7, Firepro 15.201.2401), она ведет себя, как говорит спецификация. Однако с NVidia (Linux, 370.28) я получил тот же результат, который вы описываете. Что смешно, так это то, что даже версия Nvidia для трансфромных объектов обратной связи от GL_NV_transform_feedback2 использует похожий язык и явно определяет общую привязку как часть состояния объекта обратной связи преобразования. Поэтому я бы сказал, что вы просто попали в ошибку Nvidia.