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