2016-05-14 44 views
2

NVIDIA's OpenGL 4.5 Update presentation 23滑動符合下列條件:glBindBuffer和直接狀態訪問?

非DSA:glGenBuffers + glBindBuffer

DSA:glCreateBuffers

我試着寫一個唯一的DSA程序。在使用glDrawArraysIndirect畫我被迫使用glBindBuffer沿glCreateBuffers


這裏的工作代碼片段:

glCreateBuffers(1, &bufObj); 

glBindBuffer(GL_DRAW_INDIRECT_BUFFER, bufObj); //If deleted creates SEGFAULT crash 

glNamedBufferData(bufObj, sizeof(mydrawcall), mydrawcall, GL_STATIC_DRAW); 
... 
glDrawArraysIndirect(GL_TRIANGLES, 0); 

  • glBindBuffer非DSA?
  • 我錯過了另一個更新的DSA功能,或者這是唯一的方法嗎?
+0

」*如果刪除創建SEGFAULT崩潰*「您究竟在哪裏得到這個崩潰?因爲如果你在'glDrawArraysIndirect'中得到它,你就沒事。 –

回答

4

直接狀態訪問的目的不是從您的應用程序中完全刪除對象綁定(這將是各種「無綁定」擴展的目的)。的直接狀態訪問的目的是爲了讓你訪問狀態的對象的而不具有結合它(即:直接 LY)。

Pre-DSA,你必須綁定一個緩衝區來分配存儲空間,上傳數據等等。有了DSA功能,你就不必這樣做了。您直接將緩衝區傳遞給您用來操縱其狀態的函數。

但實際上在渲染過程中使用緩衝區,您仍必須將其綁定到上下文或將其附加到本身綁定到上下文的其他對象。

要使用緩衝區的存儲爲uniform data,它必須與glBindBufferRange(GL_UNIFORM_BUFFER(或等效的調用)綁定到上下文。要使用緩衝區來存儲頂點數據,您必須attach it to a VAO through glVertexArrayVertexBuffer,然後將該VAO綁定到上下文。要使用pixel transfer operations的緩衝區,必須使用glBindBuffer將緩衝區綁定到適當的位置。等等。

使用緩衝區作爲間接命令執行源也是如此。這是一個渲染操作,因此在發出間接命令之前,必須將緩衝區綁定到間接目標。

但它只需要在發出該命令時綁定。您不必在創建後立即將其綁定。在您實際撥打glDrawArraysIndirect之前。 「