我正在使用 OpenGL 绘制大量带有颜色的二维点。每个点(顶点)还在 MX.c
数组中定义了它的 alpha channel 。我希望能够增加或减少整个数组(显示的每个顶点)的 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);
}
最佳答案
正如 datenwolf 在他的评论中指出的那样,您可以使用着色器非常简单地完成此操作,但不使用固定功能管道(如果您从不调用 glUseProgram()
.
如果您不使用光照,那么再现固定功能着色器并不是很难,稍微谷歌一下就可以帮助您达到这一点。
这里的关键是您想要将通常是顶点属性(颜色的 alpha channel )的东西更改为整个绘图操作的可配置值。在着色器术语中,这意味着用 uniform
覆盖顶点 attribute
。 uniform
只是您传递给 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
uniform,它将为 -1,因此将被顶点着色器忽略。但是,如果您将它设置为 0 到 1 之间的值,那么它将应用于顶点的 alpha channel 。
关于c++ - OpenGL 颜色变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25731894/