我使用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);
}
答案 0 :(得分:1)
正如datenwolf在他的评论中指出的那样,你可以简单地使用着色器,而不是使用固定功能管道(如果你从不打电话给glUseProgram()
,那就是你正在使用的。
如果你没有使用灯光,那么复制固定功能着色器并不是很难,而且有点谷歌搜索可以帮助你达到这一点。
这里的关键是你想要将通常是顶点属性(颜色的alpha通道)的东西更改为整个绘图操作的可配置值。在着色器术语中,这意味着使用attribute
覆盖顶点uniform
。 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
制服,它将为-1,因此顶点着色器将忽略它。但如果将其设置为介于0和1之间的值,则它将应用于顶点的Alpha通道。