详细信息:我有一个带有统一纹理的 glsl 片段着色器,“u_MapTexture”,上面有几千种颜色(最多大约 10k-15k 唯一的 rgb 值)。我还有一个统一的调色板纹理(“u_paletteTexture”),大小为 16384 × 1,我想用它来索引 u_MapTexture 上的颜色。我的问题是,无论我在数学上尝试什么,我似乎都无法使用传递颜色的 RGB 值正确地将颜色从第一个纹理索引到调色板纹理。艾米关于我该如何做到这一点的想法或想法?
不确定是否将其发布在此处、Gamedev SE 或 Math SE 上。
编辑:我想我可能没有添加有关该问题的足够信息,因此这里有一些更多详细信息。
我目前对地图的想法是保留省份颜色的索引调色板,并在我的片段着色器中执行调色板交换操作(就像这个问题中概述的那样:使用 OpenGL 着色器模拟调色板交换(在 LibGDX 中) https://stackoverflow.com/questions/26132160/simulating-palette-swaps-with-opengl-shaders-in-libgdx)。我的着色器几乎完全是从链接的文章中复制的。
我的问题:找到一种方法来唯一索引省份地图(原始纹理)->省份颜色(索引调色板纹理)。
首先,我决定将调色板纹理配置为 (255+255)×(255+255) 纹理。这将提供足够多的国家可供选择,而这实际上是永远无法达到的。
我认为您可以通过获取纹理中的索引来获得国家颜色的调色板纹理的适当索引,如下所示:每个国家/地区的索引将位于该调色板纹理的 (x, y)->(r+g ),(g+b)
我通过这个简单的方程式运行了一些示例颜色,并遇到了一个令人不安的场景:
RGB (0, 0, 0) -> (0, 0);
RGB (1, 0, 1) -> (1, 1); ?
RGB (1, 3, 2) -> (4, 5);
RGB (0, 1, 0) -> (1, 1); ?
RGB (2, 5, 10) -> (7, 15);
RGB (255, 255, 255) -> (510, 510);
问号是算法中“重复出现”的颜色,这意味着它们会错误地映射到同一国家/地区索引。
然后我想到添加额外的参数并将纹理缩小为一维数组。
例如,调色板纹理的大小为 (r+g+b),(r, g, b)。
这样,它们具有相同的纹理点:
RGB(0, 0, 0) -> (0);
RGB(1, 0, 1) -> (2); ?
RGB(0, 1, 1) -> (2); ?
RGB(1, 3, 2) -> (6); ?
RGB(3, 2, 1) -> (6); ?
RGB(0, 1, 0) -> (1);
RGB(2, 5, 10) -> (17);
RGB(255, 255, 255) -> (1020);
复发问题更加严重。我在脑海中进行了一些快速计算(并且总体上更深入地思考了它),并且我意识到,无论我以多少种方式添加/乘以颜色 RGB 变量,由于数学定律,都会出现相同的问题。这导致了实际的问题:如何在调色板纹理中唯一地、程序性地索引国家/地区颜色并通过着色器访问它们?这似乎是最高效的方法,但它的实现却让我困惑。
另外,郑重声明,我知道 UV 坐标和颜色值是浮点数,但我使用标准 0-255 格式来解决问题。
TL;DR 我需要从每个 RGB 值中提取唯一的索引,但根据我的测试集,这似乎是不可能的。
基本上,MCVE 将创建一个 2D 精灵,并将所链接 SO 问题的接受答案的片段着色器传递给精灵。精灵将由大约 10 个独特的 RGB 值组成,但是无论使用什么系统都必须支持至少数千种不同的独特颜色。我没有稳定的互联网连接,否则我会上传我的测试纹理。