2

我是 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, 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);

我怎样才能做到这一点或类似的东西?

谢谢!

4

1 回答 1

1

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

调酒面膜

虽然 GLSL 着色器完全能够重新排序纹理函数返回的 vec4​ 值,但从代码中控制从纹理获取的数据的顺序通常更方便。这是通过 swizzle 参数完成的。

纹理对象可以有 swizzling 参数。这仅适用于具有彩色图像格式的纹理。四个输出分量 RGBA 中的每一个都可以设置为来自特定的颜色通道。swizzle 掩码受到所有读取访问的尊重,无论是通过纹理采样器还是图像加载存储。

要设置组件的输出,您需要设置 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 > 通道。

于 2012-11-11T21:02:36.733 回答