godotengine / godot

Godot Engine – Multi-platform 2D and 3D game engine
https://godotengine.org
MIT License
88k stars 19.9k forks source link

Mobile Renderer makes Meshes unreadable/uneditable on Android #75599

Closed qdeanc closed 8 months ago

qdeanc commented 1 year ago

Godot version

4.0.1-stable

System information

Android 12, Mobile Renderer

Issue description

When retrieving Mesh data from a MeshInstance3D like so...

var mesh = self.get_mesh()
var mesh_array = mesh.surface_get_arrays(0)
var vertex_array = mesh_array[Mesh.ARRAY_VERTEX]
var index_array = mesh_array[Mesh.ARRAY_INDEX]

...the index_array contains vertex indices that are not within the vertex_array.

This issue does not occur in the Linux editor, but does occur on my Android build: Android 12 arm64v8 sdk version 32.0.0 ndk version 23.2.8568313

Steps to reproduce

Download the minimal reproduction project, which contains an example ArrayMesh and GDScript script which has the code shown above. Build to Android using the 4.0.1 build template and test.

Minimal reproduction project

Array_Mesh_Test.zip

qdeanc commented 1 year ago

Some more info:

mbrlabs commented 10 months ago

I looked into this (latest master branch), but i hit a roadblock because my understanding of Vulkan is too limited unfortunately.

Godot reads the indices as raw byte buffers from the Vulkan API using the method below, but the returned values are sometimes bigger than the actual vertex count. They later get composed into 16/32 bit indices but they are wrong from the start i think.

https://github.com/godotengine/godot/blob/6916349697a4339216469e9bf5899b983d78db07/drivers/vulkan/rendering_device_vulkan.cpp#L6058-L6109