2014-01-19 62 views
0

有沒有辦法用純色初始化或重置OpenGL紋理?我可以使用功能高達OpenGL 4.0,因爲我想支持筆記本的英特爾高清顯卡4000.是否有OpenGL函數將紋理重置爲純色?

+0

目標是什麼? – fedab

+0

@fedab我創建了一個非常靈活的渲染管線。渲染過程可以動態切換或修改。因此,每個渲染過程都可以指定禁用過程時執行的回退,以便整個管道仍然有效。這些退步包括用純色填充紋理並複製另一個紋理而不進行修改。 – danijar

回答

1

也許你可以使用幀緩衝。您可以將它與紋理鏈接,並在幀緩衝區上繪製所需的圖像。如果回退處於運行狀態,則將幀緩衝區清除爲所需的顏色。

然後您將framebuffer繪製爲紋理。

+0

在過去的幾個小時中,我使用簡單的着色器以相同的方式實現了清除和複製。它現在有效。你認爲清理比使用簡單的片段着色器快得多嗎? – danijar

+0

@danijar不確定。您必須創建並運行着色器。我將使用[OpenGL Wiki](https://www.opengl.org/wiki/Framebuffer#Buffer_clearing)中描述的清除。 – fedab

0

您可以通過使用glTexSubImage2D將顏色數據複製到已創建的紋理中,併爲其提供完整紋理尺寸來實現。不同的是,這不會創建新的緩衝區,而只是更新它。

+0

因此,我會爲每個像素創建一個相同顏色的長陣列並將其發送到視頻卡,對嗎? – danijar

+0

@danijar是的,就像一個普通的圖像。是什麼使得這個要求是問題是,爲了清除緩衝區(例如幀緩衝區),你需要鎖定緩衝區並循環並重置每個像素。這個操作很慢,這就是它在硬件中實現的原因。在你的情況下,你沒有這個權限。除非您可以使用着色器快速修改紋理對象。檢查紋理緩衝區對象,但我不確定這一點。 – concept3d

+0

@danijar你可以用FBO這樣做,你可以減少數據傳輸到GPU。但是這需要更多的工作。 – concept3d

1

如果從其單元/採樣器對象中取消綁定紋理,紋理訪問將全部變白。所以我建議你只需添加一個統一的顏色調製。如果您需要純色,請取消綁定紋理並將該顏色設置爲任何您想要的顏色。

但坦率地說,聽起來對我來說,就像你想重新實現OpenGL固定功能管道,你有一大堆開關來獲得你想要的效果。我們終於擺脫了這一點,現在你想轉世這個禍根?

+0

我認爲我的渲染管道設計得非常好。不過,我很想聽聽你的想法。渲染過程在腳本文件中定義,並且可以在運行時根據發生的回退進行切換。這是我的[當前管道腳本](https://github.com/ComputerGame/GraphicsApplication/blob/master/module/renderer/pipeline.js)。也可以從腳本中設置制服。你看到我的管道設計中的錯誤可以改進嗎? – danijar

+0

固定功能管道的問題在於許多用例不適合它。但是,如果提問者的程序需求與固定功能管道的功能完全匹配呢? – immibis

2

儘管你說你可以使用高達GL 4.0(並且你有一些答案),但我仍想指出,從GL 4.4開始,還有glClearTexImage()

對此的相關OpenGL擴展是ARB_clear_texture。據稱,英特爾HD 4000支持GL4.0,但對於更新的驅動程序,許多擴展實現了4.1,4.2和4.3級擴展功能。不過,我還沒有發現有消息稱英特爾已經開始實施4.4級功能。我發現的最新來源是OpenGL feature matrix from february 2014,表明Intel尚未支持該功能。但我發現很有可能在未來的驅動程序版本中支持此擴展。

+0

您不知道這是否被英特爾的高清顯卡驅動程序作爲擴展支持,是嗎? – danijar

+0

@danijar:我更新了我的答案。 – derhass

+0

感謝您的回答和有用的資源。 – danijar