我想在GLSL着色器中实现Color Matrix Filter,但无法找到有关此问题的任何文档。我完全是对着色器世界的新手(从来没有自己编写过),所以如果我的解释/词汇没有意义,请原谅我。
到目前为止我可以收集的信息:
前四列中的值分别为乘以,分别为源红色,绿色,蓝色和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} };
问题:
谢谢
编辑:
我正在使用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;
}
答案 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 开始示例,请参阅: