使用OpenGL进行纹理颜色处理(使用Java的LWJGL)

时间:2012-11-11 20:36:10

标签: java opengl colors lwjgl

我是OpenGL的新手。我正在使用Java与LWJGL和Slick。到目前为止,我可以绘制几个纹理和缓冲区,我可以将屏幕上显示的图像复制到纹理以进行后处理。 使用glColor3f()我可以使屏幕具有所需的颜色(只是蓝色,只是红色,只显示蓝色和绿色通道等)。

但glColor3f(r,g,b)只做的是将r,g,b的值乘以当前像素。如果R,G,B是像素的当前值,那么glColor对所有像素的作用是(R * r,G * g,B * b)。

我想要做的是使用当前值R,G,B,以便例如我可以将红色通道换成蓝色通道:

(B,R G)

或者将这些值和新值用于算术运算

(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 个答案:

答案 0 :(得分:1)

使用实现组件混合的着色器。使用更高版本的OpenGL,您还可以将纹理的组件调配设置为纹理参数。见http://www.opengl.org/wiki/Texture#Swizzle_mask

  

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>着色器访问它时的通道。