我想使用一个次采样深度缓冲器来提高程序的性能。在我的例子中,如果有工件或者几何图形弹出就不重要了。
我设置了这样的帧缓冲区:
// Color attachment
glBindTexture(GL_TEXTURE_2D, colorAttachment);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
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_RGBA, 640, 360, 0, GL_RGBA, GL_UNSIGNED_BYTE, nil);
// Depth attachment
glBindRenderbuffer(GL_RENDERBUFFER, depthAttachment);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 160, 90);
// Framebuffer
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorAttachment, 0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthAttachment);然而,现在,glCheckFramebufferStatus(GL_FRAMEBUFFER)返回GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS,根据文档,它表示“并不是所有附加的图像都有相同的宽度和高度”。
有一篇名为"基于粒子滤波的全三维边缘跟踪“的研究论文,在第3.5节中描述了他们实际上使用了一个亚采样深度缓冲器来提高其应用的性能。
亚采样深度缓冲器:沿图像边缘的相邻像素是如此密切相关,以至于测试每个单个边缘像素都是冗余的。对于单假设跟踪器,通常将样本点沿边缘分布距离为10-20像素。仅每n个边缘像素采样也减少了所需的图形带宽,因此仅采样每4像素一次。这里不是显式绘制点画线,而是使用次采样深度缓冲器(160x120)来实现这一点,因为这进一步实现了用于清除和填充深度缓冲区的带宽减少。然而,这也意味着隐藏线删除可能是不准确的,大约四个像素。除此之外,系统的精度不受影响。
唯一显而易见的解决办法是
这两种方法听起来都不像是最具表现力的想法。什么是最干净的方式来实现一个次采样深度缓冲器?
发布于 2011-11-17 18:47:12
您引用的文档页引用了OpenGL ES1.0和2.0。OpenGL维基有更多关于2.0和3.0之间区别的信息,即从3.0 (和ARB_framebuffer_object)开始,框架缓冲区纹理可以是不同大小的。但是,如果我没有记错,当你有不同尺寸的纹理时,实际使用的纹理大小是所有FBO附加纹理的交集。我不认为这是你想要的。
为了减少深度纹理的大小,我建议使用glBlitFramebuffer将您的大纹理转换为较小的纹理。这个操作完全是在GPU上完成的,所以它非常快。最后一个较小的纹理可以作为输入,在您的着色器进一步渲染操作,这肯定会节省带宽。不是对每个像素着色器的执行执行多个深度值的平均值,它将在较小的纹理中每个纹理执行一次。较小的纹理在本质上也更快,因为它更适合高速缓存。
然而,保持在明,平均深度样本可能会产生野生不准确,因为深度值不是线性分布。
https://stackoverflow.com/questions/8172172
复制相似问题