【问题标题】:How to make sharp textures in cocos2d-x如何在 cocos2d-x 中制作清晰的纹理
【发布时间】: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


【解决方案1】:

根据您对问题的描述,我必须假设与 Texture2D 对象关联的 GL 纹理在您调用 Texture2D::initWithData (...) 之前并未真正创建。

在 OpenGL 中,默认的纹理放大过滤器是 GL_LINEAR。在这种情况下,您想要默认的 mag 过滤器,但您也无法更改过滤器,直到 初始化您的纹理。在创建纹理后设置GL_NEAREST mag 过滤器将在您放大纹理时消除平滑。

【讨论】:

  • 我没有请求(并且看到)纹理的任何缩放/调整大小,但可能(不幸的是)框架(cocos)在内部进行...
  • 通过缩放,我实际上是指纹理采样的时间。如果纹理映射的矩形在屏幕上的尺寸与纹理不同,则不可避免地会发生缩放。当源纹理小于屏幕上覆盖的大小时,使用放大滤镜。 GL_NEAREST 使得它不是找到最近的 4 个纹素并对其进行平滑处理,而是输出最近的单个纹素。
【解决方案2】:

试试这个:

通常游戏需要保持像素图像的外观清晰/ 没有模糊

http://www.gamedevcraft.com/2015/10/disable-texture-anti-aliasing.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-21
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    相关资源
    最近更新 更多