iPhone OpenGLES纹理 - 颜色带状现象

3
我在iPhone上使用openGL遇到了问题,我相信一定有一个简单的解决方案!当我加载并显示纹理时,出现了很多所谓的“颜色条带”,特别是在渐变处,颜色似乎被自动“优化”了。为了证明这不是我的代码问题,我下载了iPhone的“Crashlanding”应用程序,并替换了背景图像,如下图所示(来自模拟器),完全相同的事情发生了。左边的图片是原始的PNG,右边的图片是游戏中的图片。它几乎像是将调色板缩小为256种颜色。

屏幕截图

我相信这与我保存图像的格式有关,尽管它不仅发生在PNG上,无论我选择哪种图像格式,它似乎都会发生。这让我很烦恼!如果您想重新创建此操作,请下载Crash Landing应用程序并更换背景。非常感谢您提前的任何帮助。

2个回答

1

iPhone不支持24位的颜色格式(每种颜色8个位)。它支持(未压缩):

  • 565格式,红=5位,绿=6位,蓝=5位
  • 5551格式,红=5位,绿=5位,蓝=5位,alpha(透明度)- 1位
  • 4444格式,4位用于红/绿/蓝/透明度。

因此,如果你在红色上从0到255绘制渐变,你会在24位格式中看到256个渐变,但只有32个渐变在565/5551格式中,甚至是16个渐变在4444中。24位颜色正在“即时转换”,因此看起来似乎被支持,但事实并非如此。

这就是为什么会出现色带的原因。

/这对于OpenGL ES 1.0是正确的,还没有了解2.0的详细信息/

更新: 我错了。 iPhone支持其他格式(8888),但也许在应用程序本身中有一种转换?

更新2:啊,你正在使用cocos2d。并且不要在图像中使用(我假设)透明度。Cocos2d将这种类型的图像转换为565格式。如果需要,我认为您将不得不修改cocos2d以“取消实现”此优化。


所以问题在于图像格式。为了获得他们想要的最终图像,我应该告诉艺术家使用哪个程序导出,并勾选哪些选项?到目前为止,他们已经尝试过Pixelmator和Gimp,但似乎无论从哪个软件保存,都会出现相同的问题。 - Chicknstu
好的,有一个问题。iPhone上用于加载图像的PNG格式只能使用8位调色板的24位图像。因此,实际上,我不知道如何在编辑器中查看它在iPhone上的外观。他们唯一可以用来了解它将会是什么样子的工具是“Posterise”,但它并不够灵活。除此之外...我真的不知道。那是另一个问题,不是我的专业领域,我是一名程序员 :) - bealex
OpenGL ES 1.1规范(请参见3.6.2节中的表3.4)要求支持GL_RGB/GL_UNSIGNED_BYTE和GL_RGBA/GL_UNSIGNED_BYTE纹理,因此iPhone OS支持它们两个。根据您有关使用CrashLanding示例应用程序的评论,我假设您正在使用Texture2D类加载图像-您是否已经验证它没有代表您执行任何格式转换? - Pivot
这是代码的转录:http://code.google.com/p/cocos2d-iphone/source/browse/branches/branch-0.1/OpenGLSupport/Texture2D.m确实有一个部分看起来像是在进行转换,但是删除它会导致糟糕的后果。图像会损坏或根本无法显示。 - Chicknstu
啊,我明白了。你的图像中没有使用透明度,对吧?这就是为什么cocos2d会将其转换为565格式而不是8888格式。这会导致带状效果。也许你需要强制cocos2d这样做。 - bealex
显示剩余2条评论

0

你应该更改Cocos2d的GLView像素格式。以下是如何操作。

如果您使用Cocos2d的模板创建新项目,则会有一个名为AppDelegate.m的文件。在该文件中找到以下方法:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

然后在方法内部你会找到:

CCGLView *glView = [CCGLView viewWithFrame:[_window bounds]
                               pixelFormat:kEAGLColorFormatRGB565
                               depthFormat:0
                        preserveBackbuffer:NO
                                sharegroup:nil
                             multiSampling:NO
                           numberOfSamples:0];

(根据您的Cocos2d版本可能会有所不同。我的是2.1)

无论如何,您只需要将pixelFormat从kEAGLColorFormatRGB565(红色、绿色、蓝色组件分别为5、6和5位)更改为kEAGLColorFormatRGBA8(红色、绿色、蓝色和alpha组件每个8位)。请注意,这意味着更多的内存使用(16位比24位)和可能更低的性能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接