Opengl es 是否可以在没有GL_OES_depth_纹理的情况下对OpenGL ES深度缓冲区进行下采样?

Opengl es 是否可以在没有GL_OES_depth_纹理的情况下对OpenGL ES深度缓冲区进行下采样?,opengl-es,opengl-es-2.0,Opengl Es,Opengl Es 2.0,我正在为移动平台开发一款游戏,我想将我的效果渲染到比屏幕分辨率更低的渲染目标。问题是,我需要从全屏的深度缓冲区开始 如果硬件支持GL_OES_depth_纹理,我想它会相对简单,但不幸的是我没有,所以我想知道是否有其他方法可以从全屏渲染中获取深度信息,并将其用于低分辨率渲染 如果我不能实际减少渲染缓冲区的采样,我可以将较高分辨率的深度缓冲区绑定到具有较低分辨率颜色缓冲区的渲染目标吗?我找不到任何文档说明帧缓冲区对象的所有不同附件的分辨率必须在分辨率上匹配,但我强烈怀疑这是一项要求 谢谢你的帮助

我正在为移动平台开发一款游戏,我想将我的效果渲染到比屏幕分辨率更低的渲染目标。问题是,我需要从全屏的深度缓冲区开始

如果硬件支持GL_OES_depth_纹理,我想它会相对简单,但不幸的是我没有,所以我想知道是否有其他方法可以从全屏渲染中获取深度信息,并将其用于低分辨率渲染

如果我不能实际减少渲染缓冲区的采样,我可以将较高分辨率的深度缓冲区绑定到具有较低分辨率颜色缓冲区的渲染目标吗?我找不到任何文档说明帧缓冲区对象的所有不同附件的分辨率必须在分辨率上匹配,但我强烈怀疑这是一项要求


谢谢你的帮助

我认为应该渲染附加到FBO的纹理。纹理可以具有您想要的更低分辨率。在大多数平台上,纹理是OpenGL ES 1.1和2.0中唯一真正有用的FBO附件

谢谢,安东

Andon的建议是,您可以使用OpenGL ES 2.0能够理解的普通GL_RGBA格式渲染到纹理中,但可以以更有效的方式对颜色进行打包/编码。如果仅使用该纹理来使用自定义片段着色器进行渲染,则可以执行此操作,该着色器将解压/解码放入的自定义格式。例如,从纹理采样器读取的值实际上可以是您想要的任何格式

float fR = texture2D(gsuTexture0, gsvTexCoord0).r;
float fG = texture2D(gsuTexture0, gsvTexCoord0).g;
float fB = texture2D(gsuTexture0, gsvTexCoord0).b;
float fA = texture2D(gsuTexture0, gsvTexCoord0).a;

float fDepth = fR;

在OpenGL ES 2.0中,不能在帧缓冲区对象中的附件之间混合和匹配分辨率(很像
GL\u EXT\u framebuffer\u obect
)。在桌面GL(GL3/
GL_ARB_framebuffer_object
)中,这是可能的,但在GLES2中,它将创建一个帧缓冲区不完整错误。如果您知道在哪里查找,它实际上是有文档记录的,请参阅--
GL\u FRAMEBUFFER\u completed\u DIMENSIONS
感谢您指出这一点!我不会想到去那里看。。。如果我没有GL_OES_depth_纹理扩展,有没有办法让深度缓冲区降级?他的问题是他的实现不支持
GL_OES_depth_纹理
。但是我认为如果你修改这个答案,指出一些类似于将深度值打包到颜色缓冲区的东西,这可能会解决他的问题。不幸的是,它会增加额外的内存带宽/存储需求,而OpenGL ES设备从一开始就很少见,但它可能会做到这一点。我本来打算自己建议的,但是增加的内存要求让我不这么认为。嗨,安登,我明白你的建议,你是说我把所有东西都重新渲染到一个颜色缓冲区中,在那里我只记录深度值?是否有一些技巧可以让我更有效地做到这一点?对于这种效果,我可以将场景再次渲染到较低的rez效果缓冲区,但我正在尝试找出如何使用z缓冲来避免这种情况。谢谢@看起来你什么都知道:不,悲哀的是,没有什么诀窍可以有效地做到这一点。对于那些需要深度缓冲区像纹理一样使用的算法来说,这是一个彻底的攻击,因为没有硬件/API支持。但您不必在单独的过程中执行此操作,您可以向着色器添加额外的MRT目标,将深度打包到颜色缓冲区中;这就是深度纹理通常在D3D9中实现的方式。我认为MRT是OpenGL ES 3.0的一个功能(或仅限于Tegra的扩展)。有没有什么方法是我忽略的?谢谢啊好的。知道了。谢谢