2012-11-11 59 views
2

我是OpenGL的新手。我用LWJGL和Slick來使用Java。到目前爲止,我可以繪製幾個紋理和緩衝區,我可以將屏幕上顯示的圖像複製到紋理以進行後期處理。 使用glColor3f()我可以使屏幕具有所需的顏色(只是藍色,只是紅色,只顯示藍色和綠色通道等)。使用OpenGL進行紋理顏色處理(在使用Java的LWJGL中)

但是,glColor3f(r,g,b)只是將r,g,b的值乘以當前像素。如果R,G,B是像素的當前值,則對於所有像素,glColor所做的是(R * r,G * g,B * b)。

我想要做的是使用電流值的R,G,B,從而例如我可以交換紅色通道用於藍色頻道:

(B,RG)

或者使用這些值和新的用於算術運算

(R + G * R,(B + G)/ 5,B * 0.2)

我的目的是使灰度紋理,改變所有象素的顏色(R ,G,B)與

color = (R*0.5 + G*0.5 + B*0.5)/3 
functionThatChangesColor(color, color, color); 

我該如何做到這一點或類似的東西?

謝謝!

回答

1

使用着色器實現組件swizzle。使用更高版本的OpenGL,您還可以將紋理的組件混合設置爲紋理參數。見http://www.opengl.org/wiki/Texture#Swizzle_mask

拌和掩模

雖然GLSL着色器完全能夠通過重新排序一個紋理函數返回的值vec4的,它往往是更方便的,以控制從代碼的紋理取出的數據的排序。這是通過swizzle參數完成的。

紋理對象可能具有混合參數。這隻適用於彩色圖像格式的紋理。四個輸出組件RGBA中的每一個都可以設置爲來自特定的顏色通道。無論是通過紋理採樣器還是通過圖像加載存儲,所有讀取訪問都會尊重混紡面罩。

要設置爲輸出的組件,你將設置GL_TEXTURE_SWIZZLE_C紋理參數,其中C是R,G,B,或A.這些參數可以被設置爲以下值:

  • GL_RED:該組件的值來自>圖像的紅色通道。所有顏色格式至少有一個紅色通道。
  • GL_GREEN:該組件的值來自圖像的綠色通道,如果沒有綠色通道,則爲0。
  • GL_BLUE:此組件的值來自圖像的藍色通道,如果沒有藍色通道,則爲0。
  • GL_ALPHA:該組件的值來自圖像的alpha通道,如果它沒有alpha通道,則爲1。
  • GL_ZERO:此組件的值始終爲0.
  • GL_ONE:此組件的值始終爲1。

您還可以使用GL_TEXTURE_SWIZZLE_RGBA參數將所有四個參數設置爲>>一次。這一個需要一個四個值的數組。例如:

//Bind the texture 2D. 
GLint swizzleMask[] = {GL_ZERO, GL_ZERO, GL_ZERO, GL_RED}; 
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask); 

當着色器訪問它時,這將有效地將圖像中的紅色通道映射到alpha通道。