如何在GLSL着色器中实现颜色矩阵过滤器
我想在GLSL着色器中实现颜色矩阵过滤器,但找不到有关此问题的任何文档。我对着色器的世界完全陌生(我自己从来没有编码过一个着色器),所以如果我的解释/词汇没有太多意义,请原谅我 到目前为止我能收集到的信息:如何在GLSL着色器中实现颜色矩阵过滤器,glsl,shader,colormatrix,colormatrixfilter,Glsl,Shader,Colormatrix,Colormatrixfilter,我想在GLSL着色器中实现颜色矩阵过滤器,但找不到有关此问题的任何文档。我对着色器的世界完全陌生(我自己从来没有编码过一个着色器),所以如果我的解释/词汇没有太多意义,请原谅我 到目前为止我能收集到的信息: 颜色矩阵由5列(RGBA+偏移)和4行组成 前四列中的值分别与源红色、绿色、蓝色和alpha值相乘。添加第五列值(偏移量) 我认为GLSL中最大的矩阵是4×4mat4矩阵(不包括“偏移”列) 我在着色器中看到的唯一实现的mat4如下所示: 问题: 如何实现一个目标?如上所述,我以
- 颜色矩阵由5列(RGBA+偏移)和4行组成
- 我认为GLSL中最大的矩阵是4×4
矩阵(不包括“偏移”列)mat4
- 我在着色器中看到的唯一实现的
如下所示:mat4
- 如何实现一个目标?如上所述,我以前从未编写过GLSL着色器,不幸的是,我无法提供MCVE。我很想看到一个例子,这样我就可以从中学习
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启动示例,请参阅:
gl_位置设置为顶点着色器代码的最后一行,因为使用的gl实现可以优化它之后的所有代码。为了使它工作,你也应该改变你的行vertColor=color代码>到vertColor=(m*color)+o代码>。使用统一时,不能在着色器中声明值,而是需要从CPU端代码传递这些值。如果着色器包含错误,则改用固定管道,因此请检查着色器日志。我不使用处理,因此无法帮助处理CPU端代码。