首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用glTexImage2D绘制63*63图像

使用glTexImage2D绘制63*63图像
EN

Stack Overflow用户
提问于 2013-09-26 08:44:06
回答 3查看 1.3K关注 0票数 2

在android中,使用这段代码是可行的:

代码语言:javascript
复制
glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, content.width, content.height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, content.pixels);

但是在iOS不工作的情况下,此代码只绘制64 *64(幂为2)。

代码语言:javascript
复制
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, content.width, content.height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, content.pixels);

我怎么能?

非常感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-26 09:10:59

纹理的大小取决于GPU和OpenGL ES的实现。在iOS上只有2种纹理的功率被接受。而在PVR模板中,只有2种大小的方形纹理被接受。在实现之前,您需要阅读他们的文档。但是对于跨平台来说,最好是使用2的平方纹理的功率。

票数 0
EN

Stack Overflow用户

发布于 2013-10-03 11:16:11

在您的glTexImage2D调用之前使用这个:

代码语言:javascript
复制
// Use tightly packed data
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

这里有更多信息:http://www.khronos.org/opengles/sdk/1.1/docs/man/glPixelStorei.xml

...GL_PACK_ALIGNMENT指定内存中每个像素行开始时的对齐要求。允许的值是1(字节对齐)、2行(行对偶数字节)、4行(字对齐)和8行(行从双字边界开始)。初始值是4.

这可能并不适用于所有的设备。但是现在针对的任何严重的设备都应该支持它。但是,该方法的一个缺点是,OpenGL读取缓冲区一次只读取一个字节。因此,当使用1而不是默认值4时,对glTexImage2D的调用可能会慢4倍左右。当然,数据在内存中没有正确地对齐,但这不应该是一个问题。我不得不建议使用大小为2的纹理,因为使用63x63纹理的缺点比仅仅加载64x64纹理和调整纹理坐标要糟糕得多。

票数 1
EN

Stack Overflow用户

发布于 2013-09-30 18:18:57

如果我还记得,iOS OpenGLES2可以绘制2种纹理的非幂,但在某些情况下它不会绘制它们。首先,我们讨论的是未压缩的纹理,因为这是您试图在代码中做的事情。其次,你没有提供太多的信息。什么是“不起作用”?我假设你的意思是你得到的是黑色的纹理。

可能存在mipmap不匹配,例如,如果您指定:

代码语言:javascript
复制
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

当您的纹理没有mip映射级别时,指定mip映射最小比例尺过滤器将导致黑色纹理。实际上,你根本不能使用带有非幂二纹理的mipmap。

另一件事是,你不能使用GL_REPEAT与非功率2纹理。对于非电源2纹理,您不能在iOS上这样做:

代码语言:javascript
复制
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
                        GL_REPEAT);

相反,您可以这样做:

代码语言:javascript
复制
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
        GL_CLAMP_TO_EDGE);

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19023397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档