0

在许多愚蠢的问题后更新

目标:应用纹理调色板意味着 GL 着色器(模拟 Indexed8 纹理格式)。互联网上到处都是关于某个主题的文章,并且都包含相同的解决方案。我有它,不幸的是,它对我不起作用。

所以。

片段着色器:

uniform sampler2D texture;
uniform sampler2D palette;
uniform int paletteIndex;
layout (origin_upper_left) in vec4 gl_FragCoord;

void main()
{
    int colorIndex = int(texture2D(texture, gl_TexCoord[0].xy, 0).r * 255);
    gl_FragColor = texelFetch(palette, ivec2(colorIndex, paletteIndex), 0);
}

顶点着色器:

void main () {
   gl_Position = ftransform ();
   gl_TexCoord [0] = gl_MultiTexCoord0;
}

这是我的结果(左 - 我的照片,右 - 原始):

  结果

该死的,我只是设置了不正确的顶点坐标!>.<

感谢试图帮助的好人。现在我知道这与 texture2d 和 fetchTexel 不同,并找到了问题的原因!丁:

4

1 回答 1

0

出色地...

我犯了几个错误:

  1. 我生成了错误的纹理调色板。
  2. 我将paletteIndex 作为浮点数,而不是int(错误的统一参数类型)。
  3. 我不明白Textrue2D(纹理坐标0..1)和texelFetch(texel整数坐标)之间的区别。
  4. 因此调用函数GL.Viewport (0, 0, w * 2, h * 2);,图像是原来的两倍。

所有这些问题都已解决,现在可以正确地将调色板应用于原始图像。正确的着色器如上所示。感谢您的关注。

于 2014-06-20T13:57:13.147 回答