2012-01-14 70 views
0

我使用我的alpha通道作爲8位整數索引來處理與混合無關的事情,所以我想仔細控制位值。特別是,我需要一個具有特定Alpha值的FBO渲染紋理中的所有像素來匹配着色器中具有相同Alpha值的所有像素。經驗教會我在比較浮點值的時候要格外小心......片段着色器輸出值

雖然使用浮點數設置顏色值vec4可能不會引起我的問​​題,我的理解是即使是半精度的16位浮點數也會能夠區分所有8位整數(0-255)值。但我寧願在片段着色器中執行整數運算,所以我確定了這些值。

我可能通過在片段着色器中執行整型運算來產生性能命中嗎?

輸出如何縮放?我在某處讀到將整數向量作爲片段的顏色輸出發送是有效的。但它是如何縮放的?如果我用0-255的整數發送一個uvec4,它是否可以適當調整呢?我希望它可以直接將整數值寫入像素格式,對於整數格式我不希望它進行任何縮放。也許對於RGBA8,發送大於255的整數值會將其限制爲255,並將負整數限制爲零,依此類推。

由於我無法通過打印出顏色值進行調試,因此難以實現此問題,除非我抓取渲染圖像並仔細檢查它們。也許我可以畫出一個明亮的顏色,如果有什麼不匹配的話。

Here是我在該主題中找到的相關主題。它比以前更讓我困惑。

+0

請注意,該線程是從2004年開始的。從那時起,很多開發工作都在GPU領域完成。即現在支持整數(圖像)緩衝區和按位操作。所以你在使用這些時清楚。 – datenwolf 2012-01-14 18:00:22

+0

啊我沒有注意到這一點。謝謝,這當然是一個非常**的舊討論...所以我該怎麼做?我可以在整個管道中使用整數,還是在設置最終碎片顏色之前仍然需要轉換爲浮點數?我只是特別感興趣的是將我的FBO顏色緩衝區上的alpha通道設置爲我的color屬性中指定的具有無符號字節的特定整數值。 – 2012-01-14 18:10:41

回答

1

我建議不要使用顏色附件的alpha通道,而是使用顯式整數格式的額外渲染目標。至少OpenGL-3.1(我看過的最古老的規範,用於這個答案)可用。請參閱OpenGL函數glBindFragDataLocation,其中綁定了片段着色器變量out。在你的情況下,一個int out $VARIABLENAME。要輸入到下一個狀態,請使用整數採樣器。詳情請參閱OpenGL-3.1和GLSL-1.30的規格。

+0

你認爲這會在OpenGL 2.0/2.1硬件上災難性地失敗嗎? (可以做3.0+的唯一硬件是Sandy Bridge HD2/3000以及Nvidia/AMD最後3代左右) – 2012-01-14 20:25:02

+0

@StevenLu:由於整數運算僅在OpenGL-3中引入,所以我會說你是使用OpenGL-2硬件失敗。 – datenwolf 2012-01-14 22:07:35

+0

好的。讓我們看看這與浮點相等性檢查有什麼關係。 – 2012-01-14 23:47:43