【发布时间】:2014-05-19 18:09:06
【问题描述】:
我在一个 char 数组中有一个 size 的纯图像数据(32 位 RGBA),我想用它制作一个 cocos2d-x Texture2D,如下所示:
Texture2D * tex = new Texture2D();
tex->initWithData(data, 4*size.width*size.height, Texture2D::PixelFormat::RGBA8888,size.width, size.height, size);
tex->drawAtPoint(Point(offset));
但生成的图像是模糊的(就像压缩的 jpeg 图像)..
输入和纹理(如上所示)的大小均为size,我没有进行任何转换。我只是将代码放在HelloWorld::draw(Renderer *, const kmMat4&, bool) 中的一个新创建的项目中。如何获得清晰的图像(数据的精确表示)?也欢迎任何其他建议(如直接帧缓冲区之类的东西......等,如果有的话)。
我在 mac os 10.8.x 中使用 v3.0
编辑:我尝试在创建Texture2D 之后和initWithData 之前设置纹理参数(GL_NEAREST),但没有任何改变。数据和纹理的大小相同,因此无论如何都不应该调整大小……这是一张图片;矩形的角不锋利:
Edit2:设置纹理参数(GL_NEAREST)之后 initWithData工作:
...
Texture2D::TexParams tp = {GL_NEAREST, GL_NEAREST, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE};
tex->setTexParameters(tp);
tex->drawAtPoint(Point(offset));
【问题讨论】:
-
能否附上截图?当我想到压缩的 jpeg 图像时,我想到的是压缩伪影,而不是模糊。您似乎在描述两个相互矛盾的事情,我认为您真正想要的是点采样 (
GL_NEAREST) min/mag 过滤器。 -
@see 编辑。 (谢谢,顺便说一句)
-
老实说,假设图像没有在图像编辑程序中重新缩放,在我看来它仍然使用线性插值。 (我编辑了您的问题以显示更大的图像以显示实际的平滑处理。) 这些矩形是您的纹理的一部分吗?另一种可能性是您正在重新调整您的名气缓冲区本身 - 颜色缓冲区可以在从 FBO 到默认帧缓冲区的 blitting 期间线性插值,它会产生这种结果。
-
@see Edit2:如果您将其写为答案,我会接受。我想再问几个(opengl)问题,但会在(希望足够)谷歌搜索后将它们作为单独的问题问......谢谢......
标签: c++ opengl textures cocos2d-x cocos2d-x-3.0