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
Python 如何在片段着色器中应用我自己的颜色贴图?_Python_Opengl_Pyopengl - Fatal编程技术网

Python 如何在片段着色器中应用我自己的颜色贴图?

Python 如何在片段着色器中应用我自己的颜色贴图?,python,opengl,pyopengl,Python,Opengl,Pyopengl,我有一个给定的图像img(16位灰度图像,其值范围为0到65535)和一个colormap colormap_文件,它是一个8位RGB 256*256像素的图像 因此,由于有了这样的颜色映射,我能够为valueImage中的所有像素分配一个(R,G,B)三元组 目前,它是通过以下函数在纯Python中完成的: def transcodeThroughColormap(img, colormap_file): colormap = np.array(Image.open(colormap_

我有一个给定的图像img(16位灰度图像,其值范围为0到65535)和一个colormap colormap_文件,它是一个8位RGB 256*256像素的图像

因此,由于有了这样的颜色映射,我能够为valueImage中的所有像素分配一个(R,G,B)三元组

目前,它是通过以下函数在纯Python中完成的:

def transcodeThroughColormap(img, colormap_file):
    colormap = np.array(Image.open(colormap_file))
    flat_colormap = colormap.flatten()

    idx = img
    i = np.floor(idx / 256)
    j = idx - (i * 256)
    R = flat_colormap[(3 * (i * 256 + j)).astype('int')]
    G = flat_colormap[(3 * (i * 256 + j) + 1).astype('int')]
    B = flat_colormap[(3 * (i * 256 + j) + 2).astype('int')]


    rgbArray = np.zeros(shape=(img.shape[0], img.shape[1], 3))
    rgbArray[..., 0] = R
    rgbArray[..., 1] = G
    rgbArray[..., 2] = B


    return rgbArray
但是,我想在片段着色器中应用这样的颜色贴图


因此,我想知道我必须在片段着色器中使用两个sampler2D,但我不知道如何获得与Python相同的结果。

我从OpenGL论坛获得了答案: 一种选择:

uniform usampler2D image_tex;
uniform sampler2D color_map;

in vec2 texcoord;

void main()
{
    uint value = texture(image_tex, texcoords).x;
    uvec2 uv = uvec2(value / 0x100, value % 0x100);
    vec4 color = texelFetch(color_map, uv, 0);
    gl_FragColor = color;
}
请注意,图像纹理需要为无符号整数类型,即GL_R16UI。放大和缩小过滤器需要最接近GL_(线性插值对于整数值没有意义)

如果图像纹理中的值表示一个连续的范围,并且颜色贴图是连续的,则可以对图像纹理使用归一化格式(即GL_R16),并对颜色贴图使用一维纹理(但是不能保证支持65536的大小,因此可能需要对颜色贴图进行下采样)。例如

或者,您可以为颜色贴图使用缓冲区纹理(保证支持65536的大小),这样可以避免将值拆分为行和列。例如

uniform sampler2D image_tex;
uniform samplerBuffer color_map;

in vec2 texcoord;

void main()
{
    float value = texture(image_tex, texcoords).x;
    int idx = int(round(value * 0xFFFF));
    vec4 color = texelFetch(color_map, idx, 0);
    gl_FragColor = color;
}

uniform sampler2D image_tex;
uniform samplerBuffer color_map;

in vec2 texcoord;

void main()
{
    float value = texture(image_tex, texcoords).x;
    int idx = int(round(value * 0xFFFF));
    vec4 color = texelFetch(color_map, idx, 0);
    gl_FragColor = color;
}