Opengl 将调色板应用于纹理
更新后,许多愚蠢的问题 目标:应用纹理调色板意味着GL着色器模拟Indexed8纹理格式。 互联网上充斥着关于某一主题的文章,而且都包含了相同的解决方案。我有它,不幸的是,它不适合我 所以 片段着色器: 顶点着色器: 这是我的结果左-我的照片,右-原始: 该死,我刚设置了不正确的顶点坐标!> 嗯 我做了一些错误: 我生成了错误的纹理调色板。 我将paletteIndex作为浮点,而不是int错误的统一参数类型。 我不理解Textrue2D纹理坐标0..1和texelFetch texel整数坐标之间的差异。 调用函数GL.Viewport 0,0,w*2,h*2;因此,图像是原始图像的两倍。 所有这些问题都已解决,现在可以正确地将调色板应用于原始图像。 上面显示了正确的着色器。Opengl 将调色板应用于纹理,opengl,textures,glsl,color-palette,indexed-image,Opengl,Textures,Glsl,Color Palette,Indexed Image,更新后,许多愚蠢的问题 目标:应用纹理调色板意味着GL着色器模拟Indexed8纹理格式。 互联网上充斥着关于某一主题的文章,而且都包含了相同的解决方案。我有它,不幸的是,它不适合我 所以 片段着色器: 顶点着色器: 这是我的结果左-我的照片,右-原始: 该死,我刚设置了不正确的顶点坐标!> 嗯 我做了一些错误: 我生成了错误的纹理调色板。 我将paletteIndex作为浮点,而不是int错误的统一参数类型。 我不理解Textrue2D纹理坐标0..1和texelFetch texel整数
感谢您的关注。但是,您没有正确地从调色板纹理中采样。如果您想使用paletteIndex作为索引,您应该使用texelFetch。。。并将其作为整数传递,或将坐标除以纹理大小,使其在[0.0,1.0]范围内。但是你还需要应用一些额外的数学来确保它们是texel中心而不是borders.Updated。非常感谢。但我在MF网站上没有看到任何弹出窗口。嗯……我为你编辑了你的问题,因此图像实际上是问题的一部分,但是如果你解决了自己的问题,你真正应该做的是在问题中保留原来损坏的着色器,并在回答问题时解释你的解决方案。这是一个非常混乱的问题,有许多语义和语法错误。我为此感到羞愧D再次感谢你!
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;
}