2011-04-22 194 views
1

我有一個用灰度漸變呈現的開放GL四邊形。我想通過應用過濾器上色它,像:OpenGL着色過濾器

如果顏色= 0,0,0然後設置顏色爲255,255,255
如果顏色= 0,0,1然後設置顏色爲255255254
等,或者我決定的一些計劃。

請注意我在灰度中這樣做的原因,因爲我使用的算法被設計爲以灰度繪製,然後着色,因爲顏色可能不會立即知道。

這將與Java LookupOp http://download.oracle.com/javase/6/docs/api/java/awt/image/LookupOp.html類似。

有沒有辦法在openGL中做到這一點?

感謝,
傑夫

+0

順便說一句,請不要忘記在發佈OpenGL相關問題時指定OpenGL版本。 – Kos 2011-04-22 19:07:32

+0

@Kos,使用JOGL 2.0 – 2011-04-22 19:09:44

回答

3

你可以解釋從灰度漸變爲1-d紋理座標的顏色,然後指定你的查表爲1-d質感。這似乎符合你的情況。

或者,您可以使用片段程序(着色器)對各個像素執行任意顏色轉換。


更多解釋:什麼是紋理?從概念上講,紋理是某種查找功能,頂部有一些額外的邏輯。

二維紋理是在[0,0] - [1,1]範圍內任意一對座標(s,t)或(x,y)產生特定顏色(RGB, RGBA,L等等)。另外它還有一些設置,比如變形或過濾。
下面,紋理由給定「密度」的離散數據描述 - 也許是16x16,也許是256x512。濾波過程可以爲[0,0]和[1,1]之間的任何實數指定顏色(通過混合/插值相鄰紋素或僅取最接近的紋理)。

一維紋理是相同的,除了它只將一個真實值映射到一個顏色。因此,它可以被認爲是「查找表」的特定類型。您可以將其視爲基於1xN圖像的二維紋理。

如果你有一個灰度漸變,你可以直接通過將漸變值作爲一種顏色來渲染它 - 或者你可以把它作爲紋理座標(=查找表中的索引),並使用一維紋理任意顏色空間變換。

您只需要將梯度值(從0到255範圍)轉換爲紋理索引的[0..1]範圍。我會推薦類似out = (in+0.5)/256.0。由於我們想要指向紋理的中間(紋理內的值),而不是指向2個值之間的拐角,0.5表示半紋理偏移量。

若要只有精確來自查找表(= 1-D紋理)的RGB值,還將紋理過濾器設置爲GL_NEAREST

順便說一句:請注意,如果您已經需要其他紋理繪製漸變,那麼它會變得更復雜一點,因爲您希望將從一個紋理接收的值視爲另一個紋理的座標 - 並且我相信您爲此需要像素着色器。不是着色器是複雜的或任何東西......當你學習基礎知識時,它們非常方便。

+0

@Kos,你能解釋一下關於解釋爲一維紋理座標的第一條語句是什麼意思嗎? – 2011-04-22 19:11:01

+0

@Jeff:在片段着色器中,使用從漸變紋理中讀取的值訪問第二個顏色漸變紋理。 – datenwolf 2011-04-22 19:13:12

+0

@datenwolf,當我繪製漸變形狀時,它不是真正的紋理(即我沒有使用GL_TEXTURE_2D繪製它) – 2011-04-22 19:17:06