将调色板应用于纹理

时间:2014-06-18 17:10:24

标签: opengl textures glsl color-palette indexed-image

在许多愚蠢的问题后更新

目标:应用纹理调色板意味着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;
}

这是我的结果(左 - 我的图片,右 - 原版):

result

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

感谢那位试图帮助的好男人。现在我知道不同于texture2d和fetchTexel并找到问题的原因! d:

1 个答案:

答案 0 :(得分:0)

嗯...

我犯了一些错误:

  1. 我生成了错误的纹理调色板。
  2. 我把paletteIndex作为一个浮点数而不是int(错误的统一参数类型)。
  3. 我不明白Textrue2D(纹理坐标0..1)和texelFetch(纹素整数坐标)之间的区别。
  4. 调用函数GL.Viewport (0, 0, w * 2, h * 2);因此,图像是原始图像的两倍。
  5. 所有这些问题都已解决,现在正确地将调色板应用于原始图像。 上面显示的正确着色器。 谢谢你的关注。