gpt4 book ai didi

c++ - 如何在 C++ 中为 GLSL 制作一维 lut

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:02:29 24 4
gpt4 key购买 nike

我开始了解如何实现片段着色器来执行 1D LUT,但我正在努力寻找任何好的资源来告诉您如何在 C++ 中制作 1D LUT,然后对其进行纹理处理。

所以对于一个简单的例子,给出下面的 1D lut:

enter image description here

我会用以下数据创建一个数组吗?

int colorLUT[255] = {255,
254,
253,
...,
...,
...,
3,
2,
1,
0};

unsigned char 我想是因为我要对其进行纹理处理。

如果这是创建 LUT 的方法,那么我将如何将其转换为纹理?我应该使用 glTexImage1D 吗?还是有更好的方法来做到这一点?我真的在这里不知所措,任何建议都会有所帮助

很抱歉这么简短,但我还没有看到任何关于如何实际制作和链接 LUT 的教程,每个关于 GLSL 的教程只告诉你着色器,他们总是忽略链接部分。

我的最终目标是我想知道如何采用如下所示的不同 1D LUT,并将它们全部应用于图像。

enter image description here

最佳答案

是的,您可以使用一维纹理作为查找表。

您可以使用 glTexImage1D() 将数据加载到一维纹理中。使用 GL_R8 作为内部纹理格式,并在将数据传递给 glTexImage1D() 时将数据指定为 GL_UNSIGNED_BYTE,如果是 8 位,是您的最佳选择的精度足以获得值(value)。您的调用将如下所示,lutData 是指向 GLubyte 数据的指针/数组,lutSize 是您的 LUT 的大小:

glTexImage1D(GL_TEXTURE_1D, 0, GL_R8, lutSize, 0, GL_RED, GL_UNSIGNED_BYTE, lutData);

如果您需要比 8 位更高的精度,您可以使用 GL_R16GL_R32F 等格式。

确保您还正确设置了纹理参数,例如对于查找表中的值之间的线性采样:

glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

然后您将纹理绑定(bind)到着色器中的 sampler1D 制服,并使用常规纹理采样函数来检索新值。请记住,纹理坐标在 0.0 到 1.0 范围内,因此在将其传递给纹理采样函数之前,您需要将原始值的范围映射到 [0.0, 1.0]。您从纹理采样函数收到的新值也将在 [0.0, 1.0] 范围内。

请注意,只要您的查找是一个相对简单的函数,在着色器中计算该函数可能会更有效。但是,如果 LUT 可以包含完全任意的映射,则使用 1D 纹理是一个不错的方法。

在没有一维纹理的 OpenGL 变体中,例如 OpenGL ES,您可以使用高度设置为 1 的二维纹理。

如果您需要大于支持的最大纹理大小的查找表,您还可以查看缓冲区纹理,正如 Andon 在他的评论中所建议的那样。

关于c++ - 如何在 C++ 中为 GLSL 制作一维 lut,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24176767/

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