gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 04:06:32 29 4
gpt4 key购买 nike

我想在 GLSL 着色器中实现颜色矩阵滤镜,但找不到与此相关的任何文档。我是着色器世界的新手(我自己从未编写过代码)所以如果我的解释/词汇没有意义,请原谅我。

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

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

enter image description here

前四列中的值分别与源红色、绿色、蓝色和 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}
};

问题:

  • 如何实现?如上所述,我以前从未编写过 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;
}

最佳答案

对于初学者我会尝试:

顶点:

#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范围。

如果您的矩阵或颜色在片段内部发生变化(例如,由于某些程序生成的东西),而不是将转换移至片段着色器。

您还可以更改 constuniform (并将其移到 main 上方)这样您就可以在运行时传递自定义参数 ...

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

关于glsl - 如何在 GLSL 着色器中实现颜色矩阵过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49796623/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com