2012-05-31 33 views
1

我正在編寫一個簡單的圖像查看器,用於在Android上的OpenGL ES 2.0中的幾個三角形上顯示圖像。這些圖像中有一種特定的顏色,必須用某種方式替換爲黑色。問題是,如果GL_LINEAR用於我的最小和最大化過濾器,則需要更換的顏色輪廓仍然可見。如果我使用GL_NEAREST作爲我的濾鏡,着色器可以在不太困難的情況下替換顏色,但是它不會使圖像呈現平滑,當然在放大和縮小時看起來像素化。如何從我的着色器代碼中替換紋理中的顏色?

我不知道是否有更好的方法來執行這種類型的任務。我曾經有過的一些想法是:

  • 構建另一個着色器,它只在紋理像素上運行一次,並在我的片段着色器中實際使用紋理之前替換顏色?
  • 重寫我的着色器,使其即使在使用GL_LINEAR時也能正常工作。

任何人都可以給我任何線索,通常如何做到這一點?我更願意在着色器中執行此操作的原因是,我可以確保蒙版像素顏色始終保持黑色。

我對OpenGL ES 2.0相當陌生,但我試圖學習如何工作。請記住這一點,並幫助我學習。提前致謝。

+0

您目前使用的是Alpha通道,並且正在編輯源圖像的一個選項?與alpha通道相比,使用color keying可能更合適。否則我想不出有什麼更好的辦法,我想你已經勾畫出了很好的侷限性。 – Tim

+0

編輯源圖像在Dalvik中非常耗時,我寧願沒有那種開銷。目前代碼對alpha通道沒有任何作用,但是我們顯示的圖像實際上是16位灰度,我將它編碼爲RGB_565並對着色器中的位進行解碼。這有點難看,但似乎工作。我們看到的最好結果似乎是在服務器上預處理我們的圖像,而不是試圖在客戶端上進行色彩鍵控。我們可能不得不求助於這個解決方案。 – Thorinside

+0

我想我還可以補充說,蒙版像素不會在圖像中移動。他們都在同一個地方。我想我也可以嘗試創建一個alpha紋理,並使用它來設置輸出像素的alpha值?或者我也會在這種情況下看到這個大綱問題? – Thorinside

回答

1

在這種情況下(掩蓋總是相同的地方),我認爲你有更多的選擇。

我會創建一個面具區域的單個通道圖像爲1和掩蔽區域以0

然後在着色器,你品嚐原有的質感和質地面膜,你可以用更換蒙面顏色的如果掩碼值大於某個閾值,則爲擁有者。

這有點緩解了使用GL_LINEAR的問題,因爲您可以調整您拒絕該像素的值。例如,如果您在遮罩和未遮罩像素之間進行右取樣,則遮罩值將爲0.5,顏色將爲(0.5 * color_key + 0.5 * unmasked_color)。如果您發現這種不可接受的顏色流血,您可以設置爲0.1,0.001等的阿爾法拒絕,以掩蓋任何像素,甚至有輕微的面具痕跡。這會稍微擴大您的蒙面區域,但可以讓您在結果中的任何位置看不到顏色鍵的痕跡。

+0

另外,請確保遮罩和紋理具有相同的分辨率,否則這可能無法正常工作。 – Tim

+0

我明白你在說什麼。我今天做了一個實驗,以瞭解正在發生的採樣,以及您對線性插值的說法,因爲紋理採樣後返回0.5。這可能會奏效。我會試着看看我能否實現這樣的事情。謝謝。 – Thorinside

+0

我剛剛通過添加遮罩紋理對此進行了測試實現,並按照您的建議在着色器中使用它。它效果很好。再次感謝@Tim。 – Thorinside

相關問題