在iOS上使用OpenGL ES 2.0进行实例绘制

3

简述:

有人能否确认在启用了GL_EXT_draw_instanced的情况下,是否可以在OpenGL ES 2.0上使用内置变量gl_InstanceID(或gl_InstanceIDEXT)在顶点着色器中绘制多个实例,并在iOS上运行?


详述:

我想使用glDrawArraysInstancedgl_InstanceID来绘制多个对象的实例,并希望我的应用程序能够在多个平台上运行,包括iOS。

规范明确表示这些特性需要ES 3.0。根据iOS设备兼容性参考文献,ES 3.0仅适用于少数设备(基于A7 GPU的设备;因此只适用于iPhone 5s,而不适用于iPhone 5或更早版本)。

因此,我的第一个假设是需要避免在旧的iOS设备上使用实例绘图。

然而,在兼容性参考文献中进一步说明,支持EXT_draw_instanced扩展的所有SGX系列5处理器(包括iPhone 5和4s)。

这让我想到,通过查找并使用适当的扩展函数(EXT或ARB)glDrawArraysInstanced,我也可以在旧的iOS设备上使用实例绘图。

我目前只是在Windows上使用SDLGLEW运行一些测试代码,因此我还没有在iOS上测试任何内容。

然而,在我的当前设置中,我无法在顶点着色器中使用gl_InstanceID内置变量。我收到以下错误消息:

'gl_InstanceID' : variable is not available in current GLSL version

在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设备上使用实例绘图的想法吗?

1
根据扩展的文档,它可以在顶点着色器中使用变量 gl_InstanceIDEXT。如果苹果公司表示支持该扩展,则应该可以正常工作。 - GuyRT
好的。但我有点困惑。我的Windows机器显示它支持ARB_draw_instanced,但是当我在GLSL中使用ES 2.0时,gl_InstanceIDgl_InstanceIDARB都无法使用。这个问题应该不用担心吗?还是这可能表明同样的问题会影响iOS上的EXT_draw_instanced呢? - Mårten Wikström
如果您在着色器中启用了GL_EXT_draw_instanced,那么gl_InstanceIDEXT是否可用?无论如何,我认为您无法从Windows机器的行为推断出iOS实现的很多信息。 - GuyRT
2
苹果支持OpenGL ES 2.0中的实例绘制。"实例绘制"在核心OpenGL ES 3.0 API和OpenGL ES 2.0中可通过EXT_draw_instanced和EXT_instanced_arrays扩展使用。根据此文档,它适用于他们所有的GPU。https://developer.apple.com/library/ios/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/OpenGLESPlatforms/OpenGLESPlatforms.html - Shammi
谢谢Shammi!这正是我正在寻找的确认信息。真不敢相信我错过了那句话。你为什么不把它作为答案发布呢? - Mårten Wikström
显示剩余5条评论
1个回答

3

这里得知:

实例化绘制可在核心OpenGL ES 3.0 API中使用,也可以通过EXT_draw_instanced和EXT_instanced_arrays扩展在OpenGL ES 2.0中使用。

您可以看到它在他们所有的GPU上都可用,PowerVR SGX,Apple A7,A8。

(看起来@Shammi不会回来了...如果他们回来了,您可以更改接受的答案:)


PowerVR SGX 535及更高版本。因此,iPhone 3GS及更高版本(除了第一代iPhone、iPhone 3G、iPod Touch第1代或第2代之外的所有iDevice)。 - Slipp D. Thompson

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