簡體   English   中英

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事物(顏色紋理的生成和綁定)只是嘗試填充幀緩沖區,從而消除了錯誤。 我實際上並不關心顏色數據。

還要注意的是,在Mac上不需要“ color tex gen / bind”,可以將其替換為glDrawBuffer(GL_NONE)glReadBuffer(GL_NONE) 但是我無法與android中的那些一起編譯...

您沒有模具附件,這可能是為什么您遇到GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT錯誤的原因。 盡管在規范中未明確說明,但大多數驅動程序在還存在深度附着時都需要模板附着。 但是,根據實現的不同,您可能會遇到問題,因為將GL_DEPTH_COMPONENT16與模版附件一起使用可能不是受支持的組合(實際上,根據我的經驗,通常不是這樣)。 每個驅動程序僅需要支持至少一個組合-不幸的是,無法精確查詢該組合可能是什么。 您基本上只需要猜測並希望它成功。

大多數Android實現均支持壓縮深度模板格式DEPTH24_STENCIL8_OES ,並且該擴展隱式支持將深度作為可以采樣的紋理。 使用它可能會獲得更大的成功(但不能保證成功!)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM