Im playing with the Godot voxel engine. I have a fixed isometric camera.
Each voxel is a billboard like this:
When I put them all together into a 3D mesh they look like this (which Im happy with):

But I would like to have a torch effect in game so when I move the torch around it lights up near by voxels. Unfortunately the lighting ruins the 2.5 D effect by revealing that each voxel is a billboard because you can see that the floor is not flat. (I am using normal maps)

I tried changing all the voxles to actual cubes but then when I add lighting
it betrays that my voxles are actually perfect cubes and not intricately shaped blocks of dirt. (As you can see by the dark perfectly square shadows)

Can you guys think of anyway I can do lighting without revealing the underlying geometry of each voxel?

It should work with normal maps, but you have to construct the normal so it's correct for how you are using the sprite (e.g. facing a different direction on the face).

    cybereality

    Im not sure a normal map will be enough. Heres an exaggerated example of the problem:

    In this picture you can see the silhouette of a billboard in the foreground. Ideally Id like it to not even be a silhouette.

    I think I may have to write my own shader, but Im not really sure how. Basically Id like to simulate light hitting a flat surface when in reality its hitting a scaled surface.

    If I try actually make the surface of the mesh an actual cube it solves the above problem but presents a new one. Lets say I want to simulate a half block it works fine when my light source is in front of the half-block like so :

    However if I move the light behind the cube then the shadow betrays the illusion, revealing that it is infact a whole cube not a half cube:

    because the shadow does not respect the normal map and the "top" of the half cube appears shaded because the side of the full cube mesh is being shaded.