2013-05-08 113 views
0

請問glDrawArrays修改glVertexAttribPointer地址嗎?glDrawArrays修改屬性地址

我偶然發現了這個問題,當我試圖緩存glVertexAttribPointer調用,並且如果我沒有在每個glDrawArrays之後重新應用glVertexAttribPointer調用時出現訪問衝突異常。這是正常行爲還是驅動程序錯誤?

回答

3

請問glDrawArrays修改glVertexAttribPointer地址嗎?

我搖搖晃晃地到這個問題時,我試圖緩存glVertexAttribPointer調用

請解釋(理想情況下顯示源代碼)你是怎麼做到實現這個「緩存」。

+0

緩存非常簡單,它只是檢查上次使用的「頂點聲明」是否是他自己,代碼如下:https://gist.github.com/greenboxal/e2872b85160bd286cd78 如果我重新應用此註釋如果)它在glDrawArrays之前的每一幀。 我使用VBOs時,baseAddress始終爲0。 – greenboxal 2013-05-08 21:58:35

+0

@greenboxal:您能保證程序的其他部分不會更改glVertexAttribPointer嗎?誠實:這種「優化」是一種微不足道的努力。更重要的是,寫得很好的OpenGL驅動程序與您執行的檢查完全相同,因此您什麼也沒有得到,但由於您的程序和OpenGL驅動程序被嚴格的API隔開,驅動程序可以保證此檢查是有效的。 – datenwolf 2013-05-08 22:10:56

+0

我看到了,我會接受你的回答,並刪除,如果只有一件事,在OpenGL上有什麼地方這種優化是值得的?紋理,緩衝區等...... – greenboxal 2013-05-08 22:39:54

0

當您的頂點屬性指針超出您正在讀取的緩衝區的內存範圍時,會發生訪問衝突。

你是如何緩存這些調用的?如果您不禁用頂點attrib數組,則以前設置的信息將仍然存在,並且仍會嘗試從新的VBO讀取。