Android ARCore增强图像如何在运行时创建新的对象渲染器

Android ARCore增强图像如何在运行时创建新的对象渲染器,android,opengl-es,arcore,Android,Opengl Es,Arcore,我正在使用Java扩展Android Studio中的“增强图像”Arcore项目,我想在运行时创建新的对象渲染器,以便在增强图像上生成新对象。我看到了“Hello AR”项目,但在该示例中,它创建了相同对象的更多实例,因此使用了相同的对象渲染器。我需要创建不同的对象,因此我认为我需要创建不同的对象渲染器 我尝试在“createOnGlThread”方法中创建我需要的所有对象渲染器,但这需要时间,而我更喜欢在运行时创建它们。它给我的问题是在着色器tho中。它不能在“createOnGlThrea

我正在使用Java扩展Android Studio中的“增强图像”Arcore项目,我想在运行时创建新的对象渲染器,以便在增强图像上生成新对象。我看到了“Hello AR”项目,但在该示例中,它创建了相同对象的更多实例,因此使用了相同的对象渲染器。我需要创建不同的对象,因此我认为我需要创建不同的对象渲染器

我尝试在“createOnGlThread”方法中创建我需要的所有对象渲染器,但这需要时间,而我更喜欢在运行时创建它们。它给我的问题是在着色器tho中。它不能在“createOnGlThread”方法之外创建它们,因为ShaderUtil中的“GLES20.glCreateShader(type)”方法始终返回0,而“GLES20.glGetShaderiv(shader,GLES20.GL_COMPILE_STATUS,compileStatus,0);”在compileStatus中也返回0,并启动运行时异常(“错误创建着色器”)


如何在“createOnGlThread”方法之外创建对象渲染器?

您可以做的不是首先创建所有对象渲染器,而是尝试在选择模型时创建它们。 假设您在屏幕上有一个按钮,当您单击该按钮时,您希望创建一个新的对象渲染器并更改模型和纹理。以下是您可以处理此问题的方法

myNewModel.setOnClickListener {
            objectName = "newModelFromAssets"
            objectTexture ="newTextureFromAssets"
            objectRenderer = ObjectRenderer()
            isModelSelected = true
    }
然后在onDrawFrame中执行以下操作:

if (isModelSelected) {
            isModelSelected = false
            try {
                objectRenderer.createOnGlThread(
                    this,
                    objectName,
                    objectTexture
                )
               objectRenderer.setDepthTexture(
                    depthTexture.depthTexture,
                    depthTexture.depthWidth,
                    depthTexture.depthHeight
                )
               objectRenderer.setMaterialProperties(
                    0.0f,
                    2.0f,
                    0.5f,
                    6.0f
                )
            } catch (e: Exception) {
                Log.e("onSurfaceCreated", "Failed to read plane texture")
            }
        }
就这些

更简单的解决方案是使用“queueEvent”从主线程与OPENGL交互,如下所示:

surfaceView.queueEvent {
//render your object
}

您可以做的不是首先创建所有对象渲染器,而是在选择模型时尝试创建它们。 假设您在屏幕上有一个按钮,当您单击该按钮时,您希望创建一个新的对象渲染器并更改模型和纹理。以下是您可以处理此问题的方法

myNewModel.setOnClickListener {
            objectName = "newModelFromAssets"
            objectTexture ="newTextureFromAssets"
            objectRenderer = ObjectRenderer()
            isModelSelected = true
    }
然后在onDrawFrame中执行以下操作:

if (isModelSelected) {
            isModelSelected = false
            try {
                objectRenderer.createOnGlThread(
                    this,
                    objectName,
                    objectTexture
                )
               objectRenderer.setDepthTexture(
                    depthTexture.depthTexture,
                    depthTexture.depthWidth,
                    depthTexture.depthHeight
                )
               objectRenderer.setMaterialProperties(
                    0.0f,
                    2.0f,
                    0.5f,
                    6.0f
                )
            } catch (e: Exception) {
                Log.e("onSurfaceCreated", "Failed to read plane texture")
            }
        }
就这些

更简单的解决方案是使用“queueEvent”从主线程与OPENGL交互,如下所示:

surfaceView.queueEvent {
//render your object
}