代码之家  ›  专栏  ›  技术社区  ›  solub

如何在GLSL着色器中实现颜色矩阵过滤器

  •  2
  • solub  · 技术社区  · 6 年前

    我想在GLSL着色器中实现颜色矩阵过滤器,但找不到有关此问题的任何文档。我对着色器的世界完全陌生(我自己从来没有编码过一个着色器),所以如果我的解释/词汇没有太多意义,请原谅我。

    到目前为止我能收集到的信息 :

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

    enter image description here

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

    • 我相信 最大的 GLSL中的矩阵为44 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。我很想看到一个例子,这样我可以从中学习。

    非常感谢。

    编辑:

    我正在处理,这是我发现的唯一一个用于颜色渲染的顶点和片段着色器示例:

    颜色垂直。glsl:

    uniform mat4 transform;
    
    attribute vec4 position;
    attribute vec4 color;
    
    varying vec4 vertColor;
    
    void main() {
      gl_Position = transform * position;
      vertColor = color;
    }
    

    彩色框架。glsl:

    #ifdef GL_ES
    precision mediump float;
    precision mediump int;
    #endif
    
    varying vec4 vertColor;
    
    void main() {
      gl_FragColor = vertColor;
    }
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Spektre    6 年前

    首先,我会尝试:

    顶点:

    #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 ,布局和输入属性/制服以满足您的需要(目前使用默认设置 英伟达 固定管道的属性位置)

    现在,以转换图像为例,只需启用“渲染纹理四边形”(render textured quad) <-1,+1> 顶点坐标 x,y 范围

    如果您的矩阵或颜色在片段内发生更改(例如,由于某些程序生成的内容),则只需将转换移到片段着色器即可。

    您还可以更改 const uniform (并将其移到上方 main )因此,您可以在运行时传递自定义参数。。。

    如果你需要 GLSL公司 开始示例请参见: