Better use of Cubemap
In my previous post I didn’t fully understand the use of cube maps, and I was just generating the render as if the point light was 5 lights… But code can be a lot easier as OpenGL natively supports Cubemap and the glsl code to check if a point is in shadow or not is actually a lot easier.
Another mistake was to not consider top depth for lights, in most cases they are useless, except when a light is near a wall. In this case the light will “see” the wall when looking up.
Sadly it does not seem Libgdx supports cube map frame buffer, so I copied the FrameBuffer class and modified it to include cube maps.
The code can be download here: FrameBufferCubeMap.java
It might be very dirty, I don’t know… first time getting this deep into OpenGL, FrameBuffer… and I adapted it from C++ source… but it seems to work 🙂
You need to bind each side of the cubemap differently when rendering to this frame buffer, and don’t forget to change the up of the camera
... frameBufferCube.begin(GL20.GL_TEXTURE_CUBE_MAP_NEGATIVE_X); camera.up.set(0, -1, 0); ... frameBufferCube.begin(GL20.GL_TEXTURE_CUBE_MAP_POSITIVE_X); camera.up.set(0, -1, 0); ... frameBufferCube.begin(GL20.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y); camera.up.set(0, 0, -1); ... frameBufferCube.begin(GL20.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z); camera.up.set(0, -1, 0); ... frameBufferCube.begin(GL20.GL_TEXTURE_CUBE_MAP_POSITIVE_Z); camera.up.set(0, -1, 0); ... frameBufferCube.begin(GL20.GL_TEXTURE_CUBE_MAP_POSITIVE_Y); camera.up.set(0, 0, 1); ...
And now the traditional screenshots
Here is what happens if you don’t change the up property of the camera :
The up property is not the same for negative/positive Y as the ones I saw on the Internet, don’t know why :
After correction and adding the bias back
This seems to be a lot quicker than previous method.
Now, trying to render multiple lights, my first approach was to
- Have one framebuffer per light
- Generate shadow map for each light on its own framebuffer
- Generate the final scene, using arrays of samplerCube (for each light) in the fragment shader
Problem is it seems only the last shadow texture is used, and I have lots of troubles getting array of samplerCube in the shader.
As of now I can’t seem to get anything to work, so I guess I’m not using the right technique. I’ve read about deferred shading, but I don’t know yet how it works (nor if it can be done with Libgdx / GL 2.0)