How to draw each a vertex of a mesh as a circle

948 views Asked by At

How to draw each a vertex of a mesh as a circle?

2

There are 2 answers

5
Emilio Martinez On BEST ANSWER

You can do it using geometry shaders to create billboarding geometry from each vertex on the GPU. You can then either create the circles as geometry, or create quads and use a circle texture to draw them (I recommend the later). But geometry shaders are not extensively supported yet, even less in iOS. If you know for sure that that computer in which you'll run this supports it, go for it.

If geometry shading isn't an option, your two best options are:

  • Use a Particle System, that already handles mesh creation and billboarding. To create a particle at each vertex position use ParticleSystem.Emit. Your system's simulation space should be Local. If the vertices move, use SetParticles to update them.
  • Creating a procedural Mesh that already contains the geometry you need. If the camera and points don't move you can get away with creating the mesh in a fixed shape. Otherwise you will need to animate the billboarding, either on the procedural mesh, or by shader.

Update: 5,000,000 points is a lot. Although Particle Systems can work with big numbers by creating lots of internal meshes, the vast amount of processing really eats up the CPU. And even if the points are static in space, a procedural mesh with no special shaders must be updated each frame for billboading effects.

My advice is creating many meshes (a single mesh cannot handle that amount of geometry). The meshes will cointain a quad per point (or triangles if you dare, to make it faster), but the four vertices will be located in the same point. You then use the texture coordinates during the vertex program to expand it into a billboarding quad.

2
David On

Assuming you are talking about 2D mesh:

Create a circle game object (or a game object with a circle shaped texture), and export it as a prefab:

var meshFilter = GetComponent(typeof(MeshFilter)) as MeshFilter; 
var mesh = meshFilter.mesh;
foreach(var v in mesh.vertices)
{
     var obj= Instantiate(circlePrefab, v, Quaternion.identity); 
} 

enter image description here