我是opengl编程的新手,但是我正在做一些非常基础的事情,而自定义opengl代码和cocos2d之间的质量差异很大!
我正在尝试仅加载图像并不断旋转每一帧。通过我的代码,我得到了许多闪烁的,清晰的边缘,而cocos2d的一切都很好且平滑。
我已经在代码中使用Apple推荐的iOs 4推荐代码设置了4倍多采样抗锯齿功能,与没有任何MSAA的cocos2d相比,它看起来仍然很糟糕。
您可以在这里看到差异:
自定义opengl代码(使用MSAA):
cocos2D(无MSAA):
有谁知道我缺少能够获得如此流畅的图形的东西?通过查看cocos2d代码,我找到了一些将别名链接到GL_LINEAR的引用。就像cocos一样,我已经在我的纹理中添加了GL_LINEAR参数,但是看起来还是很糟糕。
最佳答案
消除锯齿的功能恰如其名:防止图元采用别名,例如直线(对角线)变成阶梯。由于抗锯齿通常会导致“软”边缘,因此该术语有时用于表示任何算法上的“软化”,但这样做是不正确的。
假设您的源纹理已经包含一些抗锯齿功能,以将汽车的弯曲边缘渲染到像素网格上(因此,如果您打开源PNG或美术程序中的任何内容,并放大边缘,您会看到一些柔软度) ,我认为您的代码出于任何原因都无法应用多重采样。如果放大并查看屋顶的顶部边缘,则请检查从右至右的第一步顶部到其左端之间的过渡。顶部的粗糙深色只是自发地提升像素。这表明该边缘处于原始纹理中,并且逐像素复制出来。GL_LINEAR
是一个过滤参数,会影响OpenGL回答以下问题的方式:“如果(0,0)处的源像素是一种颜色,而(0,1)处的源像素是另一种颜色,那么(0,0.5)处的颜色是什么?”如果应用线性过滤,则在将纹理缩放到其原始大小以上时,将使用最近的源像素的线性组合来创建OpenGL必须创建的额外像素。如果您使用了GL_NEAREST
,那么它将是最接近源像素的颜色。因此,这就是放大以看起来模糊和低对比度的纹理与放大以看起来像具有明显像素的马赛克的纹理之间的区别。因此,它(通常)为整个图像增加了模糊度和柔和度,但与抗锯齿没有任何关系。
关于为什么没有获得抗锯齿的原因,有两个可能的原因让我想到了冲刺。您的代码中可能存在一些错误,或者您可能只是在使用与Cocos2D不同的算法。 Apple的硬件多重采样支持仅在iOS 4中出现,而Cocos2D早于这种方法就坚持使用“软件”方法(具体而言,以4倍的大小逐像素渲染整个场景,然后使GPU缩小比例)。后者会明显变慢,但会阻止硬件尝试优化过程。一些硬件有时采用的一种优化方法是仅在几何体的边缘(大约)进行多重采样。显然,这根本不会使您受益。
另一种可能性是您在绘制时按比例缩小图像(尽管看起来不像),而Cocos2D却生成了mip映射,而您却没有。 Mip贴图可预先计算一定比例的图像,并在绘制到屏幕时从那里开始工作。这样做可以允许应用更昂贵的算法,并导致较少的混叠。
您可以发布一些代码吗?