Android NDK SDL2 OpenGL ES 2 阴影映射(定向)- 可能吗?
Android NDK SDL2 OpenGL ES 2 shadow mapping (directional)- is it possible?
尝试在 OpenGL 上使用定向阴影贴图。需要生成一个 不是 渲染缓冲区(需要能够从中读取)的深度纹理,以便将来通过。在 Android 上 运行 时继续获取 GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT(作为 glCheckFramebufferStatus 的结果)(在 OSX 上 运行 时不会出现错误)。
这是我的代码:
//Shadow
//gen tex
gl_shadow_bogus_texture_active_n = 7;
glActiveTexture(GL_TEXTURE0+gl_shadow_bogus_texture_active_n);
glGenTextures(1, &gl_shadow_bogus_texture_buff_id);
glBindTexture(GL_TEXTURE_2D, gl_shadow_bogus_texture_buff_id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,tex_dim.x,tex_dim.y,0,GL_RGB,GL_UNSIGNED_BYTE,0);
//gen depth
gl_shadow_texture_active_n = 4;
glActiveTexture(GL_TEXTURE0+gl_shadow_texture_active_n);
glGenTextures(1, &gl_shadow_texture_buff_id);
glBindTexture(GL_TEXTURE_2D, gl_shadow_texture_buff_id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D,0,GL_DEPTH_COMPONENT16,1024,1024,0,GL_DEPTH_COMPONENT,GL_FLOAT,0);
glGenFramebuffers(1, &gl_shadow_framebuffer_id); //gen fb
glBindFramebuffer(GL_FRAMEBUFFER, gl_shadow_framebuffer_id); //bind fb
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gl_shadow_bogus_texture_buff_id, 0); //attach tex
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, gl_shadow_texture_buff_id, 0); //attach depth
请注意,整个 gl_shadow_bogus_texture_buff_id
事情(颜色纹理的生成和绑定)只是尝试填充帧缓冲区,从而消除错误。我实际上并不关心颜色数据。
进一步注意 "color tex gen/bind" 在 mac 上不是必需的,可以用 glDrawBuffer(GL_NONE)
和 glReadBuffer(GL_NONE)
代替。但是我无法使用 android...
中的那些进行编译
您没有模板附件,这可能是您收到 GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT
错误的原因。尽管规范中没有明确说明,但大多数驱动程序在存在深度附件时都需要模板附件。但是,根据实施情况,您可能会 运行 遇到问题,因为将 GL_DEPTH_COMPONENT16
与模板附件结合使用可能不受支持(事实上,根据我的经验,通常不会)。每个驱动程序只需要支持至少一种组合——不幸的是,没有办法准确查询组合可能是什么。你基本上只需要猜测并希望它成功。
大多数 Android 实现支持 packed depth stencil format DEPTH24_STENCIL8_OES,扩展隐式支持深度作为可以采样的纹理。使用它可能会取得更大的成功(但不能保证成功!)。
尝试在 OpenGL 上使用定向阴影贴图。需要生成一个 不是 渲染缓冲区(需要能够从中读取)的深度纹理,以便将来通过。在 Android 上 运行 时继续获取 GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT(作为 glCheckFramebufferStatus 的结果)(在 OSX 上 运行 时不会出现错误)。
这是我的代码:
//Shadow
//gen tex
gl_shadow_bogus_texture_active_n = 7;
glActiveTexture(GL_TEXTURE0+gl_shadow_bogus_texture_active_n);
glGenTextures(1, &gl_shadow_bogus_texture_buff_id);
glBindTexture(GL_TEXTURE_2D, gl_shadow_bogus_texture_buff_id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,tex_dim.x,tex_dim.y,0,GL_RGB,GL_UNSIGNED_BYTE,0);
//gen depth
gl_shadow_texture_active_n = 4;
glActiveTexture(GL_TEXTURE0+gl_shadow_texture_active_n);
glGenTextures(1, &gl_shadow_texture_buff_id);
glBindTexture(GL_TEXTURE_2D, gl_shadow_texture_buff_id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D,0,GL_DEPTH_COMPONENT16,1024,1024,0,GL_DEPTH_COMPONENT,GL_FLOAT,0);
glGenFramebuffers(1, &gl_shadow_framebuffer_id); //gen fb
glBindFramebuffer(GL_FRAMEBUFFER, gl_shadow_framebuffer_id); //bind fb
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gl_shadow_bogus_texture_buff_id, 0); //attach tex
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, gl_shadow_texture_buff_id, 0); //attach depth
请注意,整个 gl_shadow_bogus_texture_buff_id
事情(颜色纹理的生成和绑定)只是尝试填充帧缓冲区,从而消除错误。我实际上并不关心颜色数据。
进一步注意 "color tex gen/bind" 在 mac 上不是必需的,可以用 glDrawBuffer(GL_NONE)
和 glReadBuffer(GL_NONE)
代替。但是我无法使用 android...
您没有模板附件,这可能是您收到 GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT
错误的原因。尽管规范中没有明确说明,但大多数驱动程序在存在深度附件时都需要模板附件。但是,根据实施情况,您可能会 运行 遇到问题,因为将 GL_DEPTH_COMPONENT16
与模板附件结合使用可能不受支持(事实上,根据我的经验,通常不会)。每个驱动程序只需要支持至少一种组合——不幸的是,没有办法准确查询组合可能是什么。你基本上只需要猜测并希望它成功。
大多数 Android 实现支持 packed depth stencil format DEPTH24_STENCIL8_OES,扩展隐式支持深度作为可以采样的纹理。使用它可能会取得更大的成功(但不能保证成功!)。