Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 将调色板应用于纹理_Opengl_Textures_Glsl_Color Palette_Indexed Image - Fatal编程技术网

Opengl 将调色板应用于纹理

Opengl 将调色板应用于纹理,opengl,textures,glsl,color-palette,indexed-image,Opengl,Textures,Glsl,Color Palette,Indexed Image,更新后,许多愚蠢的问题 目标:应用纹理调色板意味着GL着色器模拟Indexed8纹理格式。 互联网上充斥着关于某一主题的文章,而且都包含了相同的解决方案。我有它,不幸的是,它不适合我 所以 片段着色器: 顶点着色器: 这是我的结果左-我的照片,右-原始: 该死,我刚设置了不正确的顶点坐标!> 嗯 我做了​​一些错误: 我生成了错误的纹理调色板。 我将paletteIndex作为浮点,而不是int错误的统一参数类型。 我不理解Textrue2D纹理坐标0..1和texelFetch texel整数

更新后,许多愚蠢的问题

目标:应用纹理调色板意味着GL着色器模拟Indexed8纹理格式。 互联网上充斥着关于某一主题的文章,而且都包含了相同的解决方案。我有它,不幸的是,它不适合我

所以

片段着色器:

顶点着色器:

这是我的结果左-我的照片,右-原始: 该死,我刚设置了不正确的顶点坐标!> 嗯

我做了​​一些错误:

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

但是,您没有正确地从调色板纹理中采样。如果您想使用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;
}