OpenGL ES纹理问题,4个重复的列和水平线(Android)

2024-03-06

我有一个 RGB(或 RGBA)纹理图像缓冲区,我想使用以下代码将其显示在我的 Android 设备上。我使用 NDK 中的 OpenGL。

glTexImage2D(GL_TEXTURE_2D,
             0,
             GL_RGBA,
             256,
             256,
             0,
             GL_RGBA,
             GL_UNSIGNED_BYTE,
             this->pBuffer);

我还从 Java 端设置了 PixelFormat:

this.getHolder().setFormat(PixelFormat.RGBA_8888);
this.setEGLConfigChooser(8, 8, 8, 8, 0, 0);
setRenderer(new MyRenderer());

图像已显示,但有四列(相同且包含原始图像的可识别部分),并且图像上到处都是水平线。

可能是什么问题?

原图:

我的代码看起来如何:


看起来图像大小不是 256 x 256,而是大约 150 像素宽。您的纹理必须是 2 大的幂,但如果您需要上传更小的纹理,您可以使用glTexSubImage2D http://www.opengl.org/sdk/docs/man/xhtml/glTexSubImage2D.xml:

glTexSubImage2D(GL_TEXTURE_2D,  /* target */
            0,      /* level */
            0,      /* xoffset */
            0,      /* yoffset */
            150,        /* width */
            256,        /* height */
            GL_RGBA,    /* format */
            GL_UNSIGNED_BYTE,   /* type */
            this->pBuffer); /* data */

在最初的 glTexImage2D 调用中,只需传递 NULL 而不是像素缓冲区。尝试这样的事情,看看是否会有所不同。

如果您使用 glDrawTexiOES 绘制纹理,则要裁剪较小的纹理,请使用 GL_TEXTURE_CROP_RECT_OES:

int rect[4] = {0, imageHeight, imageWidth, -imageHeight};
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, rect);
glDrawTexiOES(0, 0, 0, windowWidth, windowHeight);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenGL ES纹理问题,4个重复的列和水平线(Android) 的相关文章

随机推荐