使用 OpenGL 在 Mac OSX El Capitan 上渲染故障

Rendering Glitch on Mac OSX El Capitan with OpenGL

我使用 SDL 1.2 + OpenGL 1.1 为 OSX 创建了一个网球游戏。

El Capitan 之前一切都很好。现在,一些纹理显示不正确。

球场白线现在是黑线;播放器纹理都很糟糕;左边的能量棒都是黑色的:

图标上的白线不正常。突出显示的图标上的彩虹纹理也不是:

游戏通常应该是这样的:

所以错误的纹理是:

此外,只有 AppStore 版本的游戏才会出现这些故障。 我从我的网站分发的版本似乎没有故障 ( => http://www.managames.com/predownload_en.php?f=TennisElbowMac_sto.zip )

我对发生的事情完全不解。我知道 El Capitan 刚刚在 OS 渲染方式上带来了很大的变化,但我不知道去哪里看,更不知道要修复什么。

它似乎只涉及 RGBA 纹理,但并非全部,因为大多数 GUI 元素仍能正确显示。

非常感谢您提供的任何提示!

我的软件图形也有同样的问题。我正在使用 SDL 1.2 和 SDL_image 1.2.12。我尝试将使用 SDL_image 加载的图像格式更改为 SDL_Surface * const surface = IMG_Load(文件名);

但没有任何效果。最后,作为快速修复,我将图形更改为 BMP(灾难)并使用纯 SDL 的函数加载它们:

SDL_Surface * const surface = SDL_LoadBMP(filename); 

之后我就再也没有这些毛病了。 这不是最终解决方案,尤其是当您有很多图形时。

感谢 Sidney Markowitz 在此帖中的帮助 => https://lists.gnu.org/archive/html/enigma-devel/2015-10/msg00001.html ,我想出了一个解决方案:用 1.2.10 版本替换 SDL_Image 1.2.12 版本。

如果我没猜错,问题是 1.2.10 带有旧的通用代码,这在 AppStore 上是不允许的,因此提交具有此版本的应用程序很可能会被拒绝。所以我将尝试仅使用 x86 代码重新编译它,这应该可以解决问题。

编辑:

我没有重新编译,而是使用了 Lipo ( http://www.manpages.info/macosx/lipo.1.html ),就像这样:

lipo -remove ppc -output ~/Documents/SDL_image /Library/Frameworks/SDL_image.framework/Versions/A/SDL_image

然后将“~/Documents/SDL_image”移回“/Library/Frameworks/SDL_image.framework/Versions/A/”。最后,我编辑了它的 info.plist 以修复 Bundle ID(其中需要 2 个点),以便可以在 AppStore 上发布。

再次感谢 Sidney Markowitz 的 Lipo 提示! :-)

编辑2:

Apple 拒绝了新版本,因为 SDL_image 1.2.10 使用了已弃用的 CGDataProviderCreate API。该代码包含一个“#ifdef”以使用更新的替代品,所以我必须重新编译它而不是使用 Lipo,但我担心这个更新的替代品是 OSX El Capitan 上故障的实际来源.

编辑3:

重新编译SDL_image 1.2.10 可以,但不是这样,我不得不将安装文件夹更改为@rpath 和其他一些参数,然后在 AppStore 上成功接受。

对于在 OS X El Capitan 和 pygame 上遇到图形故障问题的任何其他人,您可以按照这些说明将 SDL 从版本 1.2.12 降级到 1.2.10,这似乎解决问题(至少在我目前测试过的几款游戏中):

以下全部来自命令提示符:

  1. 备份原来的ruby公式(以防万一):

    mv /usr/local/Library/Formula/sdl_image.rb /usr/local/Library/Formula/sdl_image_backup.rb

  2. 这将创建一个使用 sdl 版本 1.2.10 的新公式:

    酿造 https://www.libsdl.org/projects/SDL_image/release/SDL_image-1.2.10.tar.gz

  3. 它应该会自动在文本编辑器中打开,如果不是用 vim/emacs/nano/whatever 打开它,您更喜欢并编辑它以匹配原始 sdl_image.rb 的大部分内容(现在 sdl_image_backup.rb) 说,但跳过 "bottle do" 部分和 "test" 部分。

  4. 设置环境变量(不确定这是必需的,但对我有用):

    出口SDL_CONFIG=/usr/local/bin/sdl-config

  5. 取消链接旧的 1.2.12 安装:

    brew unlink sdl_image

  6. 现在重新安装,但 brew 将使用我们针对 1.2.10 的新公式:

    brew 安装sdl_image

saltycraig 的回答对我有用,但我必须自己弄清楚一些我认为应该包括在这里的事情,这样人们就不必费力去弄明白了。

首先,当您在第 3 步更改新 sdl_image.rb 以匹配备份时,请确保保留新 url 中包含此地址的 url:“https://www.libsdl.org/projects/SDL_image/release/SDL_image-1.2.10.tar.gz”。这可能看起来很明显,但直到我第 2 次或第 3 次查看它时我才弄明白。

其次,即使在取消链接 sdl_image 并安装 1.2.10 之后,您可能仍需要删除 1.2.12。对我来说,它在 usr/local/Cellar/sdl_image 中,因为我酿造了 python 来绕过 El Capitan 的新 SIP,阻止我安装 pygame。