2012-11-11 61 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通道。