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 作为客户端数据格式。