java - GL_NEAREST 上的 Android OpenGL mag 过滤器,小纹理仍然模糊

标签 java android opengl-es textures

我正在使用两倍大小的纹理 (128x128) 并将它的一小部分绘制到多边形上(将其用作纹理图集)。我设置了以下内容:

gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST);

然而,结果是纹理仍然模糊在一起。看起来它正在使用 GL_LINEAR。

知道为什么纹理仍然会变得模糊而不是像素化吗?

这是一个例子:

Letter drawn with four different texture resolutions

字母 F 是图像的一部分。此处使用 128px 图像、256px、512px 和 1024px 绘制。正如您所看到的,它变得更好了,但即使在 1024 像素时,它仍然会稍微混合边缘。 我应该能够使用 128px 图像并使用 GL_NEAREST 将其放大并使其具有清晰的边缘。是什么导致它画成这样?

编辑

我已将应用程序更新为使用 GLES20,但问题仍然存在。 在绑定(bind)纹理之后和调用 drawArrays 之前,我尝试使用以下方法来确保我使用的是 GL_NEAREST:

GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);

编辑 2

即使不使用图集也会出现此问题。我在四边形上放了一个 8px x 8px 的 png,结果一片模糊。 OpenGL ES 2.0 不使用 GL_NEAREST 是否有某种原因?

结果如下:

8px by 8px letter A drawn on quad

最佳答案

我相信 glTexParameterf 应该是 glTexParameteri。您将枚举作为最后一个参数传递,而不是 float 。

您是否也使用 glGetError 检查错误?

还要确保为每个要进行线性采样的纹理设置它。它的状态是每个纹理的,而不是全局的。

关于java - GL_NEAREST 上的 Android OpenGL mag 过滤器,小纹理仍然模糊,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11733899/

相关文章:

java - 如何传递包含带空格的目录的 bash 参数作为 Java 参数?

Java - 将对象作为构造函数中的参数传递......来自父类(super class)

java - 卡夫卡生产者巨大的内存使用(泄漏?)

java - 无法从 Activity 到 fragment 获取 bundle 值

android - 如果我使用低于 Oreo 目标的 sdk,那么我的应用程序将不会有 Oreo 背景限制?

android - EGL14类是什么意思?

java - 为什么引用 String str1 = str + "test "与 String str3 = "checktest"不同

java - 在 gradle 中查找类路径的代码

c++ - glTexImage2D 将 alpha 转换为 rgba openGL ES

具有多个输出的 iOS 片段着色器