2014-11-06 47 views
2

片段着色器會自動將顏色值限制在其範圍內嗎?片段着色器會自動將顏色值限制在其範圍內嗎?

我是否需要明確地將值賦給shader代碼? 如果我不知道,並且着色器自動進行鉗制,這是否意味着它可以節省一些處理時間?

+0

需要更多信息。你在畫什麼樣的幀緩衝器?如果它是浮點數,可能會保留範圍[0.0,1.0]以外的值。否則,你將需要做一些HDR處理來實現這種事情。 – 2014-11-06 18:28:11

+0

我的問題是要求各種格式的各種情況。 – user1914692 2014-11-06 19:47:24

回答

4

是的,如果顏色緩衝區處於標準化的定點格式,它們會被自動夾緊。從OpenGL 3.3規格複製:

片段着色器寫入的顏色值可能是浮點型,有符號整型或無符號整型。如果顏色緩衝區具有帶符號或無符號的歸一化定點格式,則顏色值被假定爲浮點,並分別按公式2.6或2.4所述轉換爲定點;否則不應用類型轉換。

「從浮點到歸一化定點轉換」被引用的部分表示(強調):

從浮點值f爲相應的無符號的歸一化定點轉化值c通過第一夾緊F到的範圍定義在[0,1],然後...

在片段着色器顯式夾緊將是操作的浪費,如果你的幀緩衝器格式是歸一化的固定ed-point類型(如典型的GL_RGBA8)。着色器中額外的夾持操作很可能非常便宜,但肯定是不必要的。

如果您使用浮點顏色緩衝區,情況會有所不同。正如上面的規格報價所暗示的那樣,在這種情況下不應用夾緊。這是預期的,因爲使用浮點顏色緩衝區的一個主要動機是具有擴展的值範圍。浮點顏色緩衝區通過呈現給具有附件類型GL_RGBA16F,GL_RGBA32F或類似的FBO來創建。

+0

所以你的意思是,如果我設置的類型是浮點數,值將被保存?這很好,因爲我想使用OpenGL來進行圖像處理,對於中間結果,我希望這些值將被保留。因此,如果顏色值超出範圍,屏幕上會顯示什麼? – user1914692 2014-11-06 19:50:57

+0

我添加了一些關於浮點緩衝區的更多細節。我不知道是否有系統支持默認幀緩衝浮點。通常在向FBO渲染時使用它們。所以他們將成爲屏幕外的緩衝區,而不是直接顯示在屏幕上。 – 2014-11-07 05:43:11