我有一个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?
谢谢。
答案 0 :(得分:1)
glTexImage2D
的其他参数是否正确?GL_RED
和GL_SHORT
?
没有。对于GL_R16I
内部格式,您必须使用GL_RED_INTEGER
作为客户端数据格式。