使用OpenGLES的抗锯齿去除我的绳索的锯齿状边缘

时间:2013-07-06 06:38:48

标签: iphone cocos2d-iphone

我已经实现了绳索,其中我使用Revolute关节连接动态b2bodied,现在我成功创建了这条绳索,但我的绳索看起来不是很平滑,我希望它们像丝带一样光滑。任何有这个想法的人!我发现它可以通过使用抗锯齿的openGLES实现,但仍然没有想到如何实现这一点......任何类型的帮助将不胜感激。

我的绳子是多边形的动态体,这种方式     b2BodyDef bodyDef;     bodyDef.type = b2_dynamicBody;     bodyDef.position = currentPos;

b2PolygonShape polygonShape;
polygonShape.SetAsBox(linkWidth,linkHeight);

b2FixtureDef fixtureDef;
fixtureDef.density =20.0;

fixtureDef.shape = &polygonShape;

b2Body* link = world->CreateBody( &bodyDef );
link->CreateFixture( &fixtureDef );

Revolute Joint:

b2RevoluteJointDef revoluteJointDef;
revoluteJointDef.localAnchorA.Set( 0,  linkHeight);
revoluteJointDef.localAnchorB.Set( 0, -linkHeight);            
revoluteJointDef.bodyA = link;
revoluteJointDef.bodyB = lastLink;
world->CreateJoint( &revoluteJointDef );

请帮忙。

我希望我的绳索像最右边的图像一样平滑

Figure 1 Figure 2

我的输出看起来像这样 enter image description here

1 个答案:

答案 0 :(得分:4)

如果要摆脱纹理的边缘,则必须启用多重采样。多重采样将在整个屏幕上运行,并且启用它将对性能造成损失,最严重的是在旧设备(iPhone 3GS)上。

找到在AppDelegate中实例化CCGLView的行,并启用多次采样并将样本数设置为2或4.

CCGLView *glView = [CCGLView viewWithFrame:[window bounds]
pixelFormat:kEAGLColorFormatRGBA8    // <-- use whichever is your default
depthFormat:GL_DEPTH_COMPONENT24_OES // <-- use whichever is your default
preserveBackbuffer:NO
sharegroup:nil
multiSampling:YES    // <-- enable
numberOfSamples:4];  // <-- set to 2 or 4

要记住一件事:由于显示器的高分辨率,在Retina设备上您将无法看到锯齿状边缘。在2D应用程序中对Retina设备进行多重采样可能会浪费性能并且几乎不会提高图像质量。这给你留下了另一个选择:考虑只支持Retina设备,或者只是忽略非Retina设备上的问题,因为它们即将消失。

顺便说一句,CCTexture2D别名和抗锯齿方法容易混淆,它们不执行全屏或纹理边缘别名或抗锯齿。它们在线性(“抗锯齿”,模糊)和最近(“别名”,无过滤)之间更改纹理的过滤模式。

效果是纹理内的像素是线性滤波的,因此各个像素颜色逐渐变化,而最近的滤波不执行这种滤波。像素艺术和tilemap tileset纹理最常需要最近的滤镜。两者都只改变纹理像素的滤波模式而不改变它们的边缘。为此,您需要进行多重采样。