Hello Carsten,
first off, I'm not an expert with textures. First I will show you how I
initialize my shadow maps in my plain OpenGL example. So that you
understand what I want to map into OpenSG land.
Example: [1]
Next the sources I have studied:
https://www.khronos.org/opengl/wiki/Framebuffer_Object
https://www.khronos.org/opengl/wiki/Geometry_Shader#Layered_rendering
https://www.opengl.org/sdk/docs/man/html/glFramebufferTextureLayer.xhtml
https://www.opengl.org/sdk/docs/man/html/glFramebufferTexture.xhtml
I have reread these articles and I now tend to agree with you wrt to the
LayeredTextureBuffer. However, the GL_TEXTURE_CUBE_MAP_ARRAY is missing
nevertheless (?)
This stuff is not easy to grasp. Most important for me is that I have
the OpenSG primitives at hand that I need to translate my plain OpenGL
shadow implementation into OpenSG land.
Best,
Johannes
[1]
void OpenGLWindow::InitializeShadowFBO()
{
if (_shadow_casters_point > 0)
{
glGenTextures(1, &_texture_shadow_array_point_id);
glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY,
_texture_shadow_array_point_id);
glTexImage3D(
GL_TEXTURE_CUBE_MAP_ARRAY,
0,
GL_DEPTH_COMPONENT,
SHADOW_WIDTH,
SHADOW_HEIGHT,
6 * _shadow_casters_point,
0,
GL_DEPTH_COMPONENT,
GL_FLOAT,
nullptr);
glTexParameteri (GL_TEXTURE_CUBE_MAP_ARRAY,
GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri (GL_TEXTURE_CUBE_MAP_ARRAY,
GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri (GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_S,
GL_CLAMP_TO_EDGE);
glTexParameteri (GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_T,
GL_CLAMP_TO_EDGE);
glTexParameteri (GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_R,
GL_CLAMP_TO_EDGE);
for (unsigned int i = 0; i < _shadow_casters_point * 6; i++)
{
GLuint fbo_id;
glGenFramebuffers(1, &fbo_id);
glBindFramebuffer(GL_FRAMEBUFFER, fbo_id);
glFramebufferTextureLayer(GL_FRAMEBUFFER,
GL_DEPTH_ATTACHMENT, _texture_shadow_array_point_id, 0, i);
glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, 0);
}
if (_shadow_casters_dir > 0)
{
glGenTextures(1, &_texture_shadow_array_dir_id);
glBindTexture(GL_TEXTURE_2D_ARRAY, _texture_shadow_array_dir_id);
glTexImage3D(
GL_TEXTURE_2D_ARRAY,
0,
GL_DEPTH_COMPONENT,
SHADOW_WIDTH,
SHADOW_HEIGHT,
_shadow_casters_dir,
0,
GL_DEPTH_COMPONENT,
GL_FLOAT,
nullptr);
glTexParameteri (GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S,
GL_CLAMP_TO_BORDER);
glTexParameteri (GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T,
GL_CLAMP_TO_BORDER);
GLfloat borderColor[] = { 1.0, 1.0, 1.0, 1.0 };
glTexParameterfv(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BORDER_COLOR,
borderColor);
glTexParameteri (GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER,
GL_NEAREST);
glTexParameteri (GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER,
GL_NEAREST);
for (unsigned int i = 0; i < _shadow_casters_dir; i++)
{
GLuint fbo_id;
glGenFramebuffers(1, &fbo_id);
glBindFramebuffer(GL_FRAMEBUFFER, fbo_id);
glFramebufferTextureLayer(GL_FRAMEBUFFER,
GL_DEPTH_ATTACHMENT, _texture_shadow_array_dir_id, 0, i);
glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
glBindTexture(GL_TEXTURE_2D_ARRAY, 0);
}
}