2016-09-14 60 views
1

我注意到,在通過glBindTransformFeedback()切換變換反饋對象時,與glBindBufferBase()建立的關聯數組緩衝區綁定不會被更改。使用OpenGL 4.5和NVidia卡的變換反饋對象的緩衝區綁定

看一看下面的代碼片段:

要有一雙變換反饋和頂點緩衝對象:

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); 
0使用

查詢結果:

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狀態的一部分,但可以這樣嗎?是否管理緩衝區綁定是TFO存在的主要原因?

+0

「*不是管理緩衝區綁定TFO存在的主要原因嗎?*」否;反饋對象存在的主要原因是能夠暫停和恢復反饋操作。當然,它們確實包含緩衝區對象綁定。但是你應該向我們展示*實際代碼*你在哪裏查詢這些東西。因爲我強烈懷疑你沒有正確查詢緩衝區。 –

+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節「變換反饋的一部分對象」狀態(重點煤礦)

甲變換反饋對象被創建通過結合由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的transfrom反饋對象也使用相似的語言,並且明確地將通用綁定定義爲變換反饋對象狀態的一部分。所以我會說你只是碰到了一些Nvidia的bug。