簡體   English   中英

使用帶有多個目標的OpenGL緩沖區對象的潛在問題?

[英]Potential problems using OpenGL buffer object with multiple targets?

我正在為Qt開發一個庫,以擴展其OpenGL功能以支持現代OpenGL(3+)功能,例如紋理緩沖區,圖像加載存儲紋理,着色器存儲緩沖區,原子計數器緩沖區等。為了完全支持諸如transform的功能反饋,我允許用戶在不同的時間將緩沖區對象綁定到不同的目標(無論他們分配緩沖區使用了什么數據)。 考慮以下情形,在該情形下,我將使用變換反饋來推進頂點數據一次,然后將其綁定到單獨的程序進行渲染(用於其余的應用程序運行時):

// I attach a (previously allocated) buffer to the transform feedback target so that I 
// can capture data advanced in a shader program. 
glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, someBufferID);

// Then I execute the shader program...

// and release the buffer from the transform feedback target.
glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, 0);

// Then, I bind the same buffer containing data advanced via transform feedback 
// to the array buffer target for use in a separate shader program.
glBindBuffer(GL_ARRAY_BUFFER, someBufferID);

// Then, I render something using this buffer as the data source for a vertex attrib.

// After, I release this buffer from the array buffer target.
glBindBuffer(GL_ARRAY_BUFFER, 0);

在這種情況下,將緩沖區對象綁定到多個目標很有用。 但是,我不確定在給定OpenGL規范的情況下該功能是否會引起問題。 本質上,我應該在實例化過程中允許單個緩沖區對象綁定到多個目標還是強制一個目標(例如標准Qt緩沖區包裝器)?

編輯 :我發現混合創建/綁定目標與TEXTURE對象作為glBindTexture狀態的OpenGL文檔時glBindTexture

如果先前使用與目標不匹配的目標創建紋理,則會生成GL_INVALID_OPERATION。

但是, glBindBuffer的文檔中沒有這樣的問題。

好吧,總是有故障的驅動程序(如果您沒有“綠色”硬件,則無法保證任何東西)。 但是請放心,將緩沖區綁定到所需的任何目標都是完全合法的,而無需考慮創建緩沖區的目標。

可能存在某些微妙之處,例如某些目標需要使用glBindBufferRange/Base以索引方式使用(例如統一緩沖區或變換反饋緩沖區)。 但是,就像Qt一樣,強制僅將緩沖區與單個目標一起使用是非常嚴格的,無法在現代OpenGL中使用,正如您的非常常見的示例已經顯示的那樣。 也許一個不錯的折衷辦法是使用每個類(如Qt一樣)或每個緩沖區的默認目標(在大多數簡單情況下,當緩沖區始終與單個目標一起使用時,這可以滿足要求)類內部綁定操作(如有必要),但提供了將其綁定到其他對象的選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM