OpenGL颜色转换

时间:2014-09-08 19:41:06

标签: c++ opengl colors

我使用OpenGL用他们的颜色绘制大量的2D点。每个点(顶点)也在MX.c数组中定义了它的alpha通道。我希望能够增加或减少整个数组(显示的每个顶点)的alpha值。使用OpenGL函数有没有一种聪明的方法呢?这是我的绘图方法:

void PointsMX::drawMX()
{
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);

    glColorPointer(4, GL_UNSIGNED_BYTE, 0, MX.c);
    glVertexPointer(2, GL_DOUBLE, 0, MX.p);

    glPushMatrix();
    glTranslated(position[X], position[Y], 0.0);
    glScaled(scale, scale, 1.0);
    glDrawArrays(GL_POINTS, 0, MX.size);
    glPopMatrix();

    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_COLOR_ARRAY);
}

1 个答案:

答案 0 :(得分:1)

正如datenwolf在他的评论中指出的那样,你可以简单地使用着色器,而不是使用固定功能管道(如果你从不打电话给glUseProgram(),那就是你正在使用的。

如果你没有使用灯光,那么复制固定功能着色器并不是很难,而且有点谷歌搜索可以帮助你达到这一点。

这里的关键是你想要将通常是顶点属性(颜色的alpha通道)的东西更改为整个绘图操作的可配置值。在着色器术语中,这意味着使用attribute覆盖顶点uniformuniform只是传递给OpenGL程序的值,然后处理的每个顶点或片段具有相同的值(取决于您是将它放入顶点还是片段着色器)。

以下是一个非常基本的顶点着色器示例:

#version 330
uniform mat4 Projection = mat4(1);
uniform mat4 ModelView = mat4(1);
layout(location = 0) in vec3 Position;
layout(location = 3) in vec4 Color;

out vec4 vColor;

void main() {
  gl_Position = Projection * ModelView * vec4(Position, 1);
  vColor = Color;
} 

和相应的片段着色器

#version 330
in vec4 vColor;
out vec4 FragColor;

void main()
{
  FragColor = vColor;
}

为了完成您要做的事情,您需要更改顶点着色器以添加表示Alpha覆盖的其他制服:

#version 330
uniform mat4 Projection = mat4(1);
uniform mat4 ModelView = mat4(1);
uniform float AlphaOverride = -1.0;
layout(location = 0) in vec3 Position;
layout(location = 3) in vec4 Color;

out vec4 vColor;

void main() {
  gl_Position = Projection * ModelView * vec4(Position, 1);
  vColor = Color;
  if (AlphaOverride > 0.0) {
    vColor.a = AlphaOverride;
  }
} 

如果未能设置AlphaOverride制服,它将为-1,因此顶点着色器将忽略它。但如果将其设置为介于0和1之间的值,则它将应用于顶点的Alpha通道。