【发布时间】:2014-08-19 15:58:54
【问题描述】:
简而言之:
谁能确认是否可以在启用GL_EXT_draw_instanced 的iOS 上使用OpenGL ES 2.0 在顶点着色器中使用内置变量gl_InstanceID(或gl_InstanceIDEXT)?
更长:
我想使用glDrawArraysInstanced 和gl_InstanceID 绘制一个对象的多个实例,并且我希望我的应用程序可以在包括iOS 在内的多个平台上运行。
规范明确指出这些功能需要 ES 3.0。根据iOS Device Compatibility Reference,ES 3.0 仅在少数设备上可用(基于 A7 GPU 的设备;因此是 iPhone 5s,但不适用于 iPhone 5 或更早版本)。
所以我的第一个假设是我需要避免在旧 iOS 设备上使用实例化绘图。
但是,further down 在兼容性参考文档中表示,所有 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
虽然这似乎在我的 Windows 桌面计算机上的 ES 2.0 环境中运行良好,但我怀疑这在 iPhone 5 上是否可行。
那么,我应该放弃能够在较旧的 iOS 设备上使用实例化绘图的想法吗?
【问题讨论】:
-
根据扩展的文档,它使变量
gl_InstanceIDEXT在顶点着色器中可用。如果 Apple 说他们支持该扩展,那么它应该可以工作。 -
好的。但我很困惑。我的 Windows 机器说它支持
ARB_draw_instanced,但当我面向 ES 2.0 时,GLSL 中既不支持gl_InstanceID也不支持gl_InstanceIDARB。我应该不担心这一点,还是表明 iOS 上的EXT_draw_instanced也存在同样的问题? -
如果在着色器中启用
GL_EXT_draw_instanced,gl_InstanceIDEXT是否可用?无论哪种方式,我认为您无法从 Windows 机器上的行为中推断出很多关于 iOS 实现的信息。 -
@GuyRT:不,即使我启用了扩展,它也不可用。所以你是说我应该把这看作是我的 Windows 机器上的异常,并假设它只能在启用了扩展的 iOS 上工作?
-
Apple 支持 OpenGL ES 2.0 中的实例化绘图 developer.apple.com/library/ios/documentation/3ddrawing/… “实例化绘图可通过 EXT_draw_instanced 和 EXT_instanced_arrays 扩展在核心 OpenGL ES 3.0 API 和 OpenGL ES 2.0 中使用。”根据这个,它可以在他们所有的 GPU 上使用。developer.apple.com/library/ios/documentation/DeviceInformation/…