如何在GLSL着色器中实现Color Matrix Filter

时间:2018-04-12 12:30:08

标签: glsl shader colormatrix colormatrixfilter

我想在GLSL着色器中实现Color Matrix Filter,但无法找到有关此问题的任何文档。我完全是对着色器世界的新手(从来没有自己编写过),所以如果我的解释/词汇没有意义,请原谅我。

到目前为止我可以收集的信息

  • 颜色矩阵由5列(RGBA +偏移)和4行
  • 组成

enter image description here

前四列中的值分别为乘以,分别为源红色,绿色,蓝色和alpha值。第五列值已添加(偏移)

  • 我相信GLSL中的最大矩阵是4×4 mat4矩阵(不包括'偏移'列)

  • 我在浏览器中看到的唯一mat4看起来像这样:

colorMatrix = (GPUMatrix4x4){{0.3588, 0.7044, 0.1368, 0.0},
                             {0.2990, 0.5870, 0.1140, 0.0},
                             {0.2392, 0.4696, 0.0912 ,0.0},
                             {0,0,0,1.0}
              };

问题

  • 如何实施一个?如上所述,我以前从未编写过GLSL着色器,不幸的是我无法提供MCVE。我很想看到一个例子,所以我可以从中学习。

谢谢

编辑:

我正在使用Processing,这是我发现的用于显色的顶点和片段着色器的唯一示例:

colorvert.glsl:

uniform mat4 transform;

attribute vec4 position;
attribute vec4 color;

varying vec4 vertColor;

void main() {
  gl_Position = transform * position;
  vertColor = color;
}

colorfrag.glsl:

#ifdef GL_ES
precision mediump float;
precision mediump int;
#endif

varying vec4 vertColor;

void main() {
  gl_FragColor = vertColor;
}

1 个答案:

答案 0 :(得分:1)

对于初学者我会尝试:

<强>顶点:

#version 410 core
layout(location = 0) in vec3 in_vertex;
layout(location = 3) in vec4 in_color;
out vec4 color;
void main()
    {
    const mat4x4 m=mat4x4               // RGBA matrix
        (
        0.3588, 0.7044, 0.1368, 0.0,
        0.2990, 0.5870, 0.1140, 0.0,
        0.2392, 0.4696, 0.0912 ,0.0,
        0.0   , 0.0   , 0.0    ,1.0
        );
    const vec4 o=vec4(0.0,0.0,0.0,0.0); // offset

       color    = (m * in_color) + o;   // transformation
    gl_Position = vec4(in_vertex,1.0);
    }

<强>片段:

#version 410 core
in vec4 color;
out vec4 out_color;
void main()
    {
    out_color=color;
    }

只需更改#version,布局和输入属性/制服即可满足您的需求(目前它使用固定管道的默认 nVidia 属性位置)

现在转换图片,例如只在<-1,+1>顶点坐标x,y范围内渲染纹理四边形。

如果你的矩阵或颜色在片段内发生变化(例如由于某些程序生成的东西)而不是仅仅将转换移动到片段着色器。

您还可以将const更改为uniform(并将其移至main上方),以便在运行时传递自定义参数...

如果您需要 GLSL 开始示例,请参阅: