Mac - 线性插值不起作用

时间:2015-05-29 08:17:36

标签: opengl textures texture2d

我搜索了很多,似乎无法找到关于这个主题的任何内容。我用OpenGL 4.1获得了Macbook。我创建了一个纹理:

glGenTextures(1, &heightMapTexture);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, heightMapTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 13);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
glUniform1i(program1->uniformLocation("heightMap"), 0);

glTexImage2D(GL_TEXTURE_2D, 0, GL_R16UI, heightMap.getWidth(), heightMap.getHeight(), 0, GL_RED_INTEGER, GL_UNSIGNED_SHORT, heightMap.getData().data());
glGenerateMipmap(GL_TEXTURE_2D);

这很好但我实际上想使用GL_LINEAR。但是GL_LINEAR给了我一个全零/黑色的纹理。

Mac是否不支持GL_LINEAR或是否有扩展程序? 在官方文档中,我发现了以下代码:

glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,
                GL_TEXTURE_MIN_FILTER, GL_LINEAR);

https://developer.apple.com/library/mac/documentation/GraphicsImaging/Conceptual/OpenGL-MacProgGuide/opengl_texturedata/opengl_texturedata.html

但我无法让扩展工作。

2 个答案:

答案 0 :(得分:2)

Mac肯定支持OpenGL中的双线性和三线性过滤 - 很长一段时间它都是核心规范的一部分。您显示的用于上传纹理的代码:

glTexImage2D(GL_TEXTURE_2D, 0, GL_R16UI, heightMap.getWidth(), heightMap.getHeight(), 0, GL_RED_INTEGER, GL_UNSIGNED_SHORT, heightMap.getData().data());

使用0作为第二个参数,它对应于基本级别的图像(有时称为顶级mipmap)。您没有显示用于上传纹理的其他可能mip级别的任何代码,也不会使用glGenerateTextureMipmapglGenerateMipmap。在这种情况下,GL规范中的行为未定义,但大多数情况下它只会产生黑色纹理样本。可能启用GL_LINEAR会导致您对这些未定义的纹理级别进行采样,从而产生黑色样本。

您应该通过对glTexImage2D的额外调用来定义这些纹理级别,和/或将纹理参数限制为纹理将包含的实际mip级别。

答案 1 :(得分:2)

GL_R16UI是整数纹理格式。 OpenGL不支持整数格式的线性过滤。

从OpenGL 4.5规范的第8.17节“纹理完整性”,第252页:

  

使用前面的定义,除非满足以下任何条件,否则纹理完成:
  [..]   纹理的内部格式是整数[..],放大过滤器不是NEAREST,或者缩小过滤器既不是NEAREST也不是NEAREST_MIPMAP_NEAREST。

要使用每个组件精度为16位且可以使用线性过滤进行采样的纹理,您需要使用GL_R16之类的标准化格式,或者使用{{1}一直到浮点数。 }。