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,扩展隐式支持深度作为可以采样的纹理。使用它可能会取得更大的成功(但不能保证成功!)。