任何Android模拟器都支持OpenGL ES顶点数组对象吗?

14

我一直在尝试在使用Android NDK的模拟器上运行使用VAOs的C++代码。我期望能够使用glDeleteVertexArraysOESglGenVertexArraysOESglBindVertexArrayOES

我发现即使我使用OpenGL ES 2并使用此解决方案动态链接扩展,模拟器仍无法运行代码:Are Vertex Array Objects supported in Android OpenGL ES 2.0 using extensions?

我在运行API级别为19的Nexus 4模拟器上运行了glGetString(GL_EXTENSIONS)并启用了GPU加速,结果如下:

GL_EXT_debug_marker
GL_OES_EGL_image
GL_OES_depth24
GL_OES_depth32
GL_OES_element_index_uint
GL_OES_texture_float
GL_OES_texture_float_linear
GL_OES_compressed_paletted_texture
GL_OES_compressed_ETC1_RGB8_texture
GL_OES_depth_texture
GL_OES_texture_half_float
GL_OES_texture_half_float_linear
GL_OES_packed_depth_stencil
GL_OES_vertex_half_float
我认为我需要查看GL_OES_vertex_array_object才能使用顶点数组对象。所以对于那个特定的模拟器来说似乎行不通。 您知道是否可以在任何现有的Android模拟器(第三方或其他)中使用OpenGL ES中的顶点数组对象吗?如果可以,如何操作?

2
如果模拟器使用了硬件加速的GLES,那么这些功能是否可用取决于主机上的实际实现。 - derhass
1
我不认为这一定是真的。我正在使用NVIDIA GeForce GT 750M 2048 MB在一台中2014年的MacBook Pro上运行模拟器,当我在模拟器中运行glGetString(GL_EXTENSIONS)时,它回报说它不支持顶点数组对象扩展。当我运行glGetString(GLES20.GL_VERSION)时,它回报说它只支持2.0版本。如果它使用了主机GPU的所有功能,我会期望它支持OpenGL ES 3.0,但我想我真的不太理解这个。 - Cypress Frankenfeld
应用程序可以请求特定版本的GLES上下文(更多或更少),如果只获取到2.0,即使GPU能够支持它们,所有后续功能也不一定可用。如果glGetString返回2.0,则确实获得了2.0。模拟器可能会请求它。也许您甚至可以在某些设置对话框中更改它。但我以前从未使用过Android模拟器,所以我不知道。我也不知道nvidia如何处理OES扩展。 - derhass
官方上看来,这应该由用户目录下的devices.xml中的<d:gl-extensions>标签支持,但从我查看的情况来看,它目前是失效的。它可能在过去的某个时候起作用了,但根据我所知,在最新的NDK和Android Studio版本中,它已经不再起作用了。 - Engineer
3个回答

1

官方上,这应该由用户目录下devices.xml中的<d:gl-extensions>标签支持,但从查看周围得知,此功能目前无法使用。或许在过去某个时候它曾经可用,但截至今日,最新的NDK和Android Studio版本不再支持它。(因此我提出了悬赏,如果有更好的答案请回答。)


0

Genymotion的Nexus 5 Android 5.1.0 API 22虚拟设备仅支持OpenGL ES版本2.0。

您可以使用以下代码检查未来系统映像和模拟器下的支持:

package com.example.opengltest;

import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.ConfigurationInfo;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

public class OpenGLESVersionActivity extends Activity {

    private static final String TAG = "OpenGLESVersionActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final ActivityManager activityManager =
                (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        final ConfigurationInfo configurationInfo =
                activityManager.getDeviceConfigurationInfo();
        String versionText = "Device Supported OpenGL ES Version = " + configurationInfo.getGlEsVersion();
        Toast.makeText(this, versionText, Toast.LENGTH_LONG).show();
        Log.d(TAG, versionText);
    }

}

它来自于Android模拟器是否支持OpenGL ES 3.0?


需要将参数更改为模拟器

1)您需要编辑您的模拟器图像,转到硬件部分,并添加“GPU仿真”,并将其设置为true。

2)模拟器存在一个错误,即此行:“final boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0×20000;”不起作用。它将始终返回false。您可以添加“|| Build.FINGERPRINT.startsWith(“generic”)”或仅注释掉这些检查,并假定在模拟器上运行时支持OpenGL ES 2。

3)如果出现“未找到配置”的崩溃,请在调用“setRenderer(…)”之前添加此行:“glSurfaceView.setEGLConfigChooser(8,8,8,8,16,0);”

请尝试此方法。


OpenGL 2.0仍可以通过使用扩展支持顶点数组对象。如果我只能通过模拟器访问OpenGL 2.0,是否有任何使用这些扩展的方法呢?这仍然可能是可行的。 - Cypress Frankenfeld
我更新了我的答案,如果对于你标记的答案有效,更改参数。我发现许多人都遇到了这个问题。这将有助于他们。 - NovusMobile
1
你的第一点表明你没有理解问题。OP正在询问模拟器中GL_OES_*扩展的支持情况。目前这个答案并没有解决这个问题。 - Engineer

0

不确定您的应用程序与Android平台有多紧密的联系,但我猜您可以使用Adreno、PowerVR或Mali SDK的模拟器来适应和测试您的核心3D引擎。

除了libEGL和libGLESv2库之外,还有几个伴随工具可用,包括OpenGL-ES的实时调试。

编辑:VAO是GLES 3.0的核心功能。这些函数是glDeleteVertexArrays、glGenVertexArrays和glBindVertexArray的别名。因此,如果SDK支持GLES 3.0,则支持OES_VERTEX_ARRAY_OBJECTS。

重要提示:根据SDK要求,请确保您的PC支持OpenGL 3.x或更高版本。

我正在使用上述SDK库开发Android的OpenGL-ES Java API模拟器。它处于非常早期的阶段,现在可能对您没有帮助,但它可以很好地运行简单的示例。开发这个Java模拟器的原因之一是操作系统模拟器(如Genymotion等)对GLES的支持有限。现在我可以依靠GPU制造商的本机SDK。

https://github.com/AlessandroBorges/madri-gles

这里的问题是模拟器对OpenGL ES扩展的支持,具体来说,在这种情况下,是OES_VERTEX_ARRAY_OBJECTS。如果您能提供确凿证据表明Adreno、PowerVR或Mali模拟器提供了此功能,我可以考虑给您奖励。 - Engineer
除了 Google ANGLE 之外,据我所知,Adreno、Mali 和 PowerVR 的 SDK 都支持 OES_VERTEX_ARRAY_OBJECTS 扩展,包括函数 void BindVertexArrayOES(uint array); DeleteVertexArraysOES(sizei n, const uint *arrays); void GenVertexArraysOES(sizei n, uint *arrays) 和 boolean IsVertexArrayOES(uint array); 由于操作系统模拟器(如 Genymotion、VMBox 等)的限制,它们无法提供所有扩展和完整的操作系统 HOST OpenGL 能力。这就是为什么我们需要像 Adreno、Mali 和 PowerVR 这样的 SDK:一般来说,操作系统模拟器具有有限的 OpenGL-ES 支持。 - Alex Byrth
另外请查看http://community.imgtec.com/files/powervr-supported-extensions/。它显示PowerVR SDK支持VAO作为GLES 2.0的扩展和3.0的核心。必须注册。 - Alex Byrth
真遗憾的是,即使PowerVR、Mali和Qualcomm的模拟器支持ES 3.0并且应该轻松支持ES 2.0的GL_EXT_draw_instanced功能,它们仍然不支持。尽管如此,从模拟器文档中可以看出,它们都支持GL_OES_vertex_array_objects,所以我必须授予您赏金。谢谢。 - Engineer
1
当使用具有GLES 3.0功能的模拟器时,应该将_GL_EXT_draw_instanced_作为一个扩展可用。但是,出于调试目的,您可以创建一条备用渲染路径并使用GLES 3.0,其中glDrawArraysInstanced()可用,因为它是3.0的核心特性。 - Alex Byrth
P.S.: 我猜测GL_EXT_draw_instanced不是一个被广泛支持的扩展。请参考http://delphigl.de/glcapsviewer/gles_extensions.php。 - Alex Byrth

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