Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android NDK SDL2 OpenGL ES 2阴影映射(方向)-可能吗?_Android_C++_Opengl Es_Shadow Mapping - Fatal编程技术网

Android NDK SDL2 OpenGL ES 2阴影映射(方向)-可能吗?

Android NDK SDL2 OpenGL ES 2阴影映射(方向)-可能吗?,android,c++,opengl-es,shadow-mapping,Android,C++,Opengl Es,Shadow Mapping,尝试在OpenGL上使用方向阴影映射。需要生成一个深度纹理,而不是它将来经过的渲染缓冲区(需要能够从中读取)。在Android上运行时,继续获取GL_FRAMEBUFFER_complete_附件(由于glCheckFramebufferStatus)(在OSX上运行时不要获取错误) 这是我的密码: //Shadow //gen tex gl_shadow_bogus_texture_active_n = 7; glActiveTexture(GL_TEXTURE0+gl_shad

尝试在OpenGL上使用方向阴影映射。需要生成一个深度纹理,而不是它将来经过的渲染缓冲区(需要能够从中读取)。在Android上运行时,继续获取GL_FRAMEBUFFER_complete_附件(由于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\u shadow\u bogus\u texture\u buff\u id
事件(颜色纹理的生成和绑定)只是试图填充帧缓冲区,从而消除错误。我实际上并不关心颜色数据


还需要注意的是,“color tex gen/bind”在mac上不是必需的,可以用
glDrawBuffer(GL\u NONE)
glReadBuffer(GL\u NONE)
替换。但我无法使用android中的模板进行编译…

您没有模具附件,这可能是您收到
GL\u FRAMEBUFFER\u complete\u附件的原因。尽管规范中没有明确规定,但大多数驱动程序在还存在深度附件时需要模板附件。但是,根据实现的不同,您可能会遇到问题,因为将
GL\u DEPTH\u COMPONENT16
与模具附件结合使用可能不受支持(事实上,根据我的经验,通常不受支持)。每个驱动程序只需要支持至少一个组合-不幸的是,无法准确查询组合可能是什么。你基本上只需要猜测并希望它成功


大多数Android实现都支持,而扩展隐式地支持深度作为可以采样的纹理。您可能会在使用它时获得更大的成功(但成功是不可保证的!)。

gl\u shadow\u texture\u active\n
的作用是什么?另外,您是否正在检查OpenGL的其他错误?@nicolas-
gl_blah_texture_active_n
是一种跟踪该纹理绑定到哪个glActiveTexture的方法。我现在使用的是一对一的纹理、从id到活动纹理的架构。大大简化了事情(尽管它会渲染间接纹理的“ActiveTexture”层)。是的,我正在检查其他OpenGL错误。它们都是通过的,所以为了可读性,我将它们从示例代码中删除。“我现在使用的是一对一纹理\u id-to-active \u纹理\n类型的架构,但我没有足够的纹理。”这毫无意义。如果你正在创建一个纹理,它应该只为这个目的而绑定;一旦创建,你就可以解开它。也许我在“绑定”方面使用了错误的术语。在一天结束的时候,我需要通过
uniform sampler 2d blah_tex到我的着色器。我这样做的方法是将
ActiveTexture
(a
GLuint
)传递到
glUniform1i
。因此,我使用的任何纹理都必须与ActiveTexture关联。在某些情况下,可能会在使用“活动纹理”的绘制调用之前设置“活动纹理”,然后在需要diff纹理的下一个绘制调用中切换它们,我只会将每个纹理设置为一个activeTexture,并且从不将其混洗。这种思路有什么问题吗?“在某些情况下,可能会在使用“活动纹理”的绘制调用之前设置“活动纹理”,在某些情况下,“不,那不是”;这是大多数OpenGL应用程序的标准行为。原因是,您的方式保持了所有纹理的边界,并让您更改制服,将您可以拥有的纹理数量限制为可用纹理图像单元的数量。纹理结合点应该是短暂的;您可以根据需要设置它们,并在不再需要它们时取消设置它们。也许这适用于小例子,但不适用于任何有意义的项目。没错。我的解决方案是使用
GL_DEPTH_COMPONENT
而不是
GL_DEPTH_COMPONENT 16
让它选择任何可用的组件。我不需要创建/附加模具缓冲区。出于兼容性的目的,您是否建议我这样做?或者说,在这里起作用的“只是深度依恋”是否意味着它可能会在其他地方起作用?