3

我正在使用两种大小的纹理 (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 。

任何想法为什么纹理仍然会变得模糊而不是像素化?

这是一个例子:

用四种不同的纹理分辨率绘制的字母

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

编辑

我已更新应用程序以使用 GLES20,但问题仍然存在。在绑定纹理之后和调用 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 x 8px 字母 A

4

2 回答 2

1

我相信glTexParameterf应该是glTexParameteri。您将枚举作为最终参数传递,而不是浮点数。

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

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

于 2012-08-01T17:15:11.323 回答
1

我终于想通了!!!!

这是我加载资源的方式。

我从这个改变:

Bitmap bitmap = BitmapFactory.decodeResource(GLRenderer.context.getResources(), textureId);

对此:

InputStream is = GLRenderer.context.getResources().openRawResource(textureId);
Bitmap bitmap;
try {
    bitmap = BitmapFactory.decodeStream(is);
} finally {
    try {
        is.close();
    } catch(IOException e) {
        // Ignore.
    }
}
于 2012-08-09T17:04:47.683 回答