简而言之:
任何人都可以确认是否可以在启用的 iOS 上使用 OpenGL ES 2.0 在顶点着色器中使用内置变量gl_InstanceID
(或) ?gl_InstanceIDEXT
GL_EXT_draw_instanced
更长:
我想使用glDrawArraysInstanced和gl_InstanceID绘制一个对象的多个实例,并且我希望我的应用程序可以在包括 iOS 在内的多个平台上运行。
规范明确指出这些特性需要 ES 3.0。根据iOS 设备兼容性参考,ES 3.0 仅在少数设备上可用(基于 A7 GPU 的设备;因此是 iPhone 5s,但不适用于 iPhone 5 或更早版本)。
所以我的第一个假设是我需要避免在旧的 iOS 设备上使用实例化绘图。
然而,在兼容性参考文档的后面,它说所有 SGX 系列 5 处理器(包括 iPhone 5 和 4s)都支持EXT_draw_instanced扩展。
这让我觉得我确实也可以在较旧的 iOS 设备上使用实例绘图,方法是查找并使用glDrawArraysInstanced的适当扩展函数(EXT 或 ARB) 。
我目前只是在 Windows 上使用SDL和GLEW运行一些测试代码,所以我还没有在 iOS 上测试过任何东西。
但是,在我当前的设置中,我无法在顶点着色器中使用gl_InstanceID内置变量。我收到以下错误消息:
'gl_InstanceID' : 变量在当前 GLSL 版本中不可用
在 GLSL 中启用“draw_instanced”扩展无效:
#extension GL_ARB_draw_instanced : enable
#extension GL_EXT_draw_instanced : enable
当我特别声明我需要 ES 3.0 (GLSL 300 ES) 时,错误消失了:
#version 300 es
尽管在 ES 2.0 环境中这在我的 Windows 台式机上似乎可以正常工作,但我怀疑这在 iPhone 5 上是否可以正常工作。
那么,我应该放弃能够在旧 iOS 设备上使用实例绘图的想法吗?