c++ - OpenGL 颜色变换

标签 c++ opengl colors

我正在使用 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 覆盖顶点 attributeuniform 只是您传递给 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/

相关文章:

c++ - 在opengl中绘制几何图形

c++ - 如何在 grammar<Iterator,double()> 中添加 qi::symbols?

c++ - GCC 编译器标志 "-DEVAL"

C++ 共同祖先问题。它是什么?

algorithm - Mandelbrot 集渲染的平滑频谱

ios - 如何使用 Swift 从 UIImage 中提取颜色

matlab - 如何使用 Matlab 或 OpenCV 库中的 API 在 xyY 颜色空间中绘制普朗克轨迹?

c++ - 如果是指针,则启用模板

opengl - GLSL 着色器的正确文件扩展名是什么?

java - OpenGL 灯光示例无法在 LWJGL 中使用等效代码