Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在cocos2d-x中制作锐利的纹理_C++_Opengl_Textures_Cocos2d X_Cocos2d X 3.0 - Fatal编程技术网

C++ 如何在cocos2d-x中制作锐利的纹理

C++ 如何在cocos2d-x中制作锐利的纹理,c++,opengl,textures,cocos2d-x,cocos2d-x-3.0,C++,Opengl,Textures,Cocos2d X,Cocos2d X 3.0,我在char数组中有一个大小为size的普通图像数据(32位RGBA),我想用它制作一个cocos2d-x纹理2D,如下所示: Texture2D * tex = new Texture2D(); tex->initWithData(data, 4*size.width*size.height, Texture2D::PixelFormat::RGBA8888,size.width, size.height, size); tex->drawAtPoint(Point(offset)

我在char数组中有一个大小为
size
的普通图像数据(32位RGBA),我想用它制作一个cocos2d-x纹理2D,如下所示:

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:在
initWithData
工作后设置纹理参数(GL_最近值)


根据您对问题的描述,我必须假设与
Texture2D
对象关联的GL纹理在调用
Texture2D::initWithData(…)
之前不会实际创建

在OpenGL中,默认的纹理放大过滤器是
GL\u LINEAR
。在这种情况下,您不希望使用默认的mag过滤器,但在初始化纹理后才能更改过滤器。在创建纹理后设置一个最近的mag过滤器,将在放大纹理时消除平滑现象。

尝试以下操作:

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


您能提供一个屏幕截图吗?当我想到压缩的jpeg图像时,我想到的是压缩伪影,而不是模糊。您似乎描述了两件相互矛盾的事情,我认为您真正想要的是点采样(
GL_NEAREST
)最小/最大过滤器。@请参见编辑。(顺便说一句,谢谢)老实说,假设图像没有在图像编辑程序中重新缩放,在我看来它仍然像是在使用线性插值。(我编辑了你的问题,将图像放大,以显示实际的平滑效果。)这些矩形是你纹理的一部分吗?另一种可能是您正在重新调整缓冲区本身的大小-颜色缓冲区可以在从FBO到默认帧缓冲区的blitting过程中进行线性插值,它将产生这种结果。@请参阅Edit2:如果您作为答案写入,我将接受它。我想再问几个(opengl)问题,但在(希望足够)谷歌搜索之后,我会把它们作为单独的问题来问。。。谢谢…我没有要求(并看到)对纹理进行任何缩放/调整大小,但很可能(不幸的是)框架(cocos)正在内部执行此操作…通过缩放,我实际上指的是纹理采样的时间。如果纹理贴图矩形在屏幕上的尺寸与纹理不同,则不可避免地会发生缩放。当源纹理小于屏幕上的覆盖大小时,将使用放大过滤器
GL_NEAREST
使其只输出单个最近的texel,而不是查找4个最近的texel并平滑它们。
Texture2D::TexParams tp = {GL_NEAREST, GL_NEAREST, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE};
tex->setTexParameters(tp);
tex->drawAtPoint(Point(offset));