我搜索了很多,似乎无法找到关于这个主题的任何内容。我用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);
但我无法让扩展工作。
答案 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级别的任何代码,也不会使用glGenerateTextureMipmap
或glGenerateMipmap
。在这种情况下,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}一直到浮点数。 }。