OpenGL着色器中的采样整数不起作用。结果始终为0

时间:2017-01-21 15:32:21

标签: opengl graphics glsl textures shader

我有一个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?

谢谢。

1 个答案:

答案 0 :(得分:1)

  

glTexImage2D的其他参数是否正确? GL_REDGL_SHORT

没有。对于GL_R16I内部格式,您必须使用GL_RED_INTEGER作为客户端数据格式。