OpenGL 着色器中的整数采样不起作用。结果始终为 0
Sampling integers in OpenGL shader doesn't work. Result is always 0
我有一个 16 位有符号整数的高度图。如果我使用归一化浮点对纹理进行采样,它会很好地采样。所以对于规范化的浮点数,我将纹理上传为:
glTexImage2D(GL_TEXTURE_2D, 0, GL_R16_SNORM, 512, 512, 0, GL_RED, GL_SHORT, data);
然后在着色器中我做:
layout (binding = 0) uniform sampler2D heightmap;
float height = texture(heightmap, inTexCoords).r;
那么身高就是-32768到32767归一化为-1.0和1.0。这很好用。但我想读取整数值,所以我这样做:
glTexImage2D(GL_TEXTURE_2D, 0, GL_R16I, 512, 512, 0, GL_RED, GL_SHORT, data);
在着色器中:
layout (binding = 0) uniform isampler2D heightmap; // < -- Notice I put isampler here
float height = texture(heightmap, inTexCoords).r; // < -- This should return an ivec4, the r value should have my 16 bit signed value, right?
但无论我做什么,它总是采样 0。我不知道该怎么做,我试过禁用纹理过滤和混合(因为我听说它们可能不起作用)但仍然没有。
glTexImage2D 的其他参数是否正确? GL_RED,以及 GL_SHORT?
谢谢。
Are the other arguments to glTexImage2D
correct? GL_RED
, and GL_SHORT
?
没有。对于 GL_R16I
内部格式,您必须使用 GL_RED_INTEGER
作为客户端数据格式。
我有一个 16 位有符号整数的高度图。如果我使用归一化浮点对纹理进行采样,它会很好地采样。所以对于规范化的浮点数,我将纹理上传为:
glTexImage2D(GL_TEXTURE_2D, 0, GL_R16_SNORM, 512, 512, 0, GL_RED, GL_SHORT, data);
然后在着色器中我做:
layout (binding = 0) uniform sampler2D heightmap;
float height = texture(heightmap, inTexCoords).r;
那么身高就是-32768到32767归一化为-1.0和1.0。这很好用。但我想读取整数值,所以我这样做:
glTexImage2D(GL_TEXTURE_2D, 0, GL_R16I, 512, 512, 0, GL_RED, GL_SHORT, data);
在着色器中:
layout (binding = 0) uniform isampler2D heightmap; // < -- Notice I put isampler here
float height = texture(heightmap, inTexCoords).r; // < -- This should return an ivec4, the r value should have my 16 bit signed value, right?
但无论我做什么,它总是采样 0。我不知道该怎么做,我试过禁用纹理过滤和混合(因为我听说它们可能不起作用)但仍然没有。
glTexImage2D 的其他参数是否正确? GL_RED,以及 GL_SHORT?
谢谢。
Are the other arguments to
glTexImage2D
correct?GL_RED
, andGL_SHORT
?
没有。对于 GL_R16I
内部格式,您必须使用 GL_RED_INTEGER
作为客户端数据格式。