Python 如何在片段着色器中应用我自己的颜色贴图?
我有一个给定的图像img(16位灰度图像,其值范围为0到65535)和一个colormap colormap_文件,它是一个8位RGB 256*256像素的图像 因此,由于有了这样的颜色映射,我能够为valueImage中的所有像素分配一个(R,G,B)三元组 目前,它是通过以下函数在纯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_
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;
}