I did it!
Actually, crossing DexterZ code and other advices, I ended by changing the vertices, and the texture coordinates order from:
quadVertices[0].Position = new Vector3(-1, -1, -1); // Lower left
quadVertices[0].TextureCoordinate = new Vector2(1, 1);
quadVertices[1].Position = new Vector3(-1, 1, -1); // Upper left
quadVertices[1].TextureCoordinate = new Vector2(1, 0);
quadVertices[2].Position = new Vector3(1, -1, -1); // Lower right
quadVertices[2].TextureCoordinate = new Vector2(0, 1);
quadVertices[3].Position = new Vector3(1, 1, -1); // Upper right
quadVertices[3].TextureCoordinate = new Vector2(0, 0);
To:
quadVertices[0].Position = new Vector3(1, 1, 0); // Upper right
quadVertices[0].TextureCoordinate = new Vector2(0, 0);
quadVertices[1].Position = new Vector3(-1, 1, 0); // Upper left
quadVertices[1].TextureCoordinate = new Vector2(1, 0);
quadVertices[2].Position = new Vector3(1, -1, 0); // Lower right
quadVertices[2].TextureCoordinate = new Vector2(0, 1);
quadVertices[3].Position = new Vector3(-1, -1, 0); // Lower left
quadVertices[3].TextureCoordinate = new Vector2(1, 1);
And donāt even need to set the Normal property (no effect anyway), everything is facing camera with the billboard matrix applied.
So the vertices order + the texture coordinates are the key to create a quad oriented in the right direction. No need to tweak the culling too.
My order was inspired on http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series3/Triangle_strip.php
the vertices are all declared in a clockwise manner relative to the camera
Also from here:
But I understand that the quad vertices should be created with anticlockwise coordinates, as I read that itās the way OpenGL is dealing with. Am I right? Or because XNA is DirectX based, itās a different order?
What I donāt understand itās how the texture is mapped in the DexterZ sample.
I learned that:
http://www.real3dtutorials.com/images/img00018.png
OpenGL.glTexCoord2d 1, 0
OpenGL.glVertex3d 1, 1, 1
OpenGL.glTexCoord2d 0, 0
OpenGL.glVertex3d -1, 1, 1
OpenGL.glTexCoord2d 0, 1
OpenGL.glVertex3d -1, -1, 1
OpenGL.glTexCoord2d 1, 1
OpenGL.glVertex3d 1, -1, 1
But DexterZ is mapping the upper left corner of the texture to the upper right corner of the quad, etc. so applying the texture in a horizontal reversed position.
I cannot see the logic in this, except that āHo, the texture is reversed, I will map it in the other side and it will workā. I would like to understand why :).