我希望在GLSL着色器中实现一个颜色矩阵滤镜,但找不到任何相关的文档。我完全是新手(从未编写过代码),所以请原谅我如果我的解释/词汇不太准确。
到目前为止,我能收集到的信息如下:
- 颜色矩阵由5列(RGBA + 偏移量)和4行组成。 第一到第四列的值分别与源红色、绿色、蓝色和透明度值相乘。第五列的值被添加(偏移)。
到目前为止,我能收集到的信息如下:
- 颜色矩阵由5列(RGBA + 偏移量)和4行组成。 第一到第四列的值分别与源红色、绿色、蓝色和透明度值相乘。第五列的值被添加(偏移)。
我相信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;
}
gl_Position
设置为顶点着色器代码的最后一行,因为GL实现可能会优化掉它之后的所有代码。为了使其工作,您还应该将您的行vertColor = color;
更改为vertColor = (m*color)+o;
。当您使用uniform时,不能在着色器中声明值,而是需要从CPU端代码传递它们。如果您的着色器包含错误,则会使用固定管道,因此请检查着色器日志。我不使用processing,所以无法帮助处理CPU端代码。 - Spektre