我想創建一個紋理系統,其中我將添加到紋理,而不是覆蓋它。我的紋理有整數值(32位)。我想要的是:例如。我有一個100位的整數像素,我想添加10到它,所以它變爲110.Opengl - 添加到紋理
我目前的實現有兩個紋理,一個具有以前的紋理,和一個紋理來寫。讀取先前紋理的值,然後用新數據重寫。有沒有更好的方法去做,因爲使用兩種紋理感覺效率很低?
我想創建一個紋理系統,其中我將添加到紋理,而不是覆蓋它。我的紋理有整數值(32位)。我想要的是:例如。我有一個100位的整數像素,我想添加10到它,所以它變爲110.Opengl - 添加到紋理
我目前的實現有兩個紋理,一個具有以前的紋理,和一個紋理來寫。讀取先前紋理的值,然後用新數據重寫。有沒有更好的方法去做,因爲使用兩種紋理感覺效率很低?
根據你所說的「追加」什麼,你可以使用添加劑調合:
glEnable(GL_BLEND);
glBlendEquation(GL_FUNC_ADD);
glBlendFunc(GL_ONE, GL_ONE);
那麼,你的片段着色器的r輸出會被添加到顏色緩衝區的當前內容。如果您使用FBO渲染紋理,則可以直接添加到該紋理。
你應該小心不要創建任何反饋循環,所以你的片段着色器的結果不應該取決於你渲染的紋理相同的任何樣本。
UPDATE
正如評論所指出的,有問題的紋理具有GL_RED_INTEGER
格式。不幸的是,混合僅適用於浮點顏色緩衝區(包括標準化整數),並且從不處理非標準化整數。
但是,還有另一種可能的方法。使用最近的OpenGL,我之前提到的「反饋循環」規則已經放寬。延伸GL_ARB_texture_barrier明確地allowes片段着色器,以讀取來自相同的紋理它被寫入到像素:
具體地,渲染的片段的值是不確定的,如果任何 着色器級取出的紋理像素和相同紋理像素經由片段寫入 着色器的輸出,即使在讀取和寫入是不是在同一個抽獎 電話,除非下列任何例外的適用:
讀取和寫入來自/到分離集(紋理過濾規則的 之後)。
只有單個讀和每一紋理像素的寫入,和讀出是在 片段着色器調用寫入相同的紋素(例如,使用 「texelFetch2D(取樣器,ivec2(gl_FragCoord.xy),0 );「)。
- [...]
這個擴展已經晉升爲OpenGL的4.5的核心功能。這是相當新的,並沒有在很多平臺上使用,所以目前還不清楚您是否可以使用它...
「追加」在這裏是一個非常糟糕的選擇;追加意味着增加一些集合,但這只是將texel值相加。雙紋理方法可能很好;您可能能夠從圖像加載/存儲中獲得更高的效率,但這是相當新的,我對它的幫助不夠了解。 –
我改變了我的問題,考慮到這一點,謝謝 – Jas