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

如何在GLSL着色器中实现颜色矩阵过滤器,glsl,shader,colormatrix,colormatrixfilter,Glsl,Shader,Colormatrix,Colormatrixfilter,我想在GLSL着色器中实现颜色矩阵过滤器,但找不到有关此问题的任何文档。我对着色器的世界完全陌生(我自己从来没有编码过一个着色器),所以如果我的解释/词汇没有太多意义,请原谅我 到目前为止我能收集到的信息: 颜色矩阵由5列(RGBA+偏移)和4行组成 前四列中的值分别与源红色、绿色、蓝色和alpha值相乘。添加第五列值(偏移量) 我认为GLSL中最大的矩阵是4×4mat4矩阵(不包括“偏移”列) 我在着色器中看到的唯一实现的mat4如下所示: 问题: 如何实现一个目标?如上所述,我以

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

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

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

前四列中的值分别与源红色、绿色、蓝色和alpha值相乘。添加第五列值(偏移量)

  • 我认为GLSL中最大的矩阵是4×4
    mat4
    矩阵(不包括“偏移”列)

  • 我在着色器中看到的唯一实现的
    mat4
    如下所示:

问题

  • 如何实现一个目标?如上所述,我以前从未编写过GLSL着色器,不幸的是,我无法提供MCVE。我很想看到一个例子,这样我就可以从中学习
多谢各位

编辑:

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

colorvert.glsl:

uniform mat4 transform;

attribute vec4 position;
attribute vec4 color;

varying vec4 vertColor;

void main() {
  gl_Position = transform * position;
  vertColor = color;
}
#ifdef GL_ES
precision mediump float;
precision mediump int;
#endif

varying vec4 vertColor;

void main() {
  gl_FragColor = vertColor;
}
colorfrag.glsl:

uniform mat4 transform;

attribute vec4 position;
attribute vec4 color;

varying vec4 vertColor;

void main() {
  gl_Position = transform * position;
  vertColor = color;
}
#ifdef GL_ES
precision mediump float;
precision mediump int;
#endif

varying vec4 vertColor;

void main() {
  gl_FragColor = vertColor;
}

首先,我会尝试:

顶点:

uniform mat4 transform;

attribute vec4 position;
attribute vec4 color;

varying vec4 vertColor;

void main() {
  gl_Position = transform * position;
  vertColor = color;
}
#ifdef GL_ES
precision mediump float;
precision mediump int;
#endif

varying vec4 vertColor;

void main() {
  gl_FragColor = vertColor;
}
#版本410核心
vec3中的布局(位置=0)在_顶点中;
vec4中的布局(位置=3)为彩色;
输出vec4颜色;
void main()
{
常数mat4x4 m=mat4x4//RGBA矩阵
(
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);//偏移量
颜色=(m*in_color)+o;//变换
gl_位置=vec4(在_顶点中,1.0);
}
片段:

uniform mat4 transform;

attribute vec4 position;
attribute vec4 color;

varying vec4 vertColor;

void main() {
  gl_Position = transform * position;
  vertColor = color;
}
#ifdef GL_ES
precision mediump float;
precision mediump int;
#endif

varying vec4 vertColor;

void main() {
  gl_FragColor = vertColor;
}
#版本410核心
vec4色;
out vec4 out_颜色;
void main()
{
out_color=颜色;
}
只需更改
#版本
、布局和输入属性/制服即可满足您的需要(目前它使用默认的nVidia属性位置作为固定管道)

例如,现在要转换图像,只需在
顶点坐标
x,y
范围内渲染纹理四边形

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

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

如果您需要GLSL启动示例,请参阅:


非常清楚和全面的答案!不幸的是,它对我不起作用(我正在处理,问题已被编辑)。1.我没有看到任何变化的颜色时,与颜色矩阵混乱。2.我尝试将转换移动到片段着色器,但我遇到了多个错误“使用未声明的标识符”('m'、'in_color'、'o')。然后我在片段着色器中指定了“uniform vec4 in_color;uniform mat4x4 m;uniform vec4 o”,但仍然得到“赋值的左侧不能是只读的”错误。@solub尝试将
gl_位置设置为顶点着色器代码的最后一行,因为使用的gl实现可以优化它之后的所有代码。为了使它工作,你也应该改变你的行
vertColor=color
vertColor=(m*color)+o。使用统一时,不能在着色器中声明值,而是需要从CPU端代码传递这些值。如果着色器包含错误,则改用固定管道,因此请检查着色器日志。我不使用处理,因此无法帮助处理CPU端代码。