簡體   English   中英

OpenGL-附加到紋理

[英]Opengl - appending to a texture

我想創建一個紋理系統,在其中添加紋理, 而不是覆蓋它。 我的紋理具有整數值(32位)。 我想要的是: 我有一個位為100的整數像素,我想對其添加10,使其變為110。

我當前的實現有兩個紋理,一個具有先前的紋理,另一個是要寫入的紋理。 讀取先前的紋理值,然后用新數據重寫。 是否有更好的方法,因為使用兩個紋理感覺效率很低?

根據您“附加”的意思,可以使用添加混合

glEnable(GL_BLEND);
glBlendEquation(GL_FUNC_ADD);
glBlendFunc(GL_ONE, GL_ONE);

然后,片段着色器的輸出將添加到顏色緩沖區的當前內容中。 如果使用FBO渲染到紋理中,則可以直接添加到該紋理中。

您應該小心不要創建任何反饋循環,因此片段着色器的結果不應依賴於渲染到的紋理相同的任何樣本。

更新

如評論中所述,所討論的紋理具有GL_RED_INTEGER格式。 不幸的是,混合僅應用於浮點顏色緩沖區(包括歸一化的整數),而不應用於未歸一化的整數。

但是,還有另一種可能的方法。 我最近提到的“反饋循環”規則在最近的OpenGL中已經放寬了。 擴展名GL_ARB_texture_barrier明確允許片段着色器從其寫入的相同紋理讀取像素:

具體來說,如果有任何着色器階段獲取紋理像素,並且通過片段着色器輸出寫入相同的紋理像素,則渲染的片段的值是不確定的,即使讀寫不在同一個Draw調用中, 除非以下任何例外情況都適用

  • 讀寫來自不相交的紋素集(考慮紋理過濾規則之后)。

  • 每個紋理元素只有一個讀和寫操作,並且在片段着色器調用中寫入相同的紋理元素(例如,使用“ texelFetch2D(sampler,ivec2(gl_FragCoord.xy),0);”)。

  • [...]

此擴展已提升為OpenGL 4.5的核心功能。 這是相當新的東西,在許多平台上都不可用,因此尚不清楚是否可以使用它。

暫無
暫無

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

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