4

我正在尝试实现一种老式技术,其中使用渲染的背景图像和预设深度信息来遮挡场景中的其他对象。

因此,例如,如果您有一张房间的图片,前景中有一些电线从天花板上悬挂下来,这些电线在深度图中被赋予了一个浅深度值,并且当正确渲染时,允许角色在电线“后面”行走,但在房间内其他物体的前面。

到目前为止,我已经尝试使用以下方法创建深度纹理:

glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, Image.GetWidth(), Image.GetHeight(), 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, pixels);

然后只需将其绑定到四边形并在屏幕上渲染它,但它不会写入纹理中的深度值。

我也试过:

glDrawPixels(Image.GetWidth(), Image.GetHeight(), GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, pixels);

但这会将我的帧速率减慢到大约 0.25 fps ......

我知道您可以通过将 gl_fragDepth 设置为纹理中的值来在像素着色器中执行此操作,但我想知道是否可以使用未启用像素着色器的硬件来实现这一点?

4

3 回答 3

0

禁用对颜色缓冲区的写入(使用glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE:),然后使用适当的 Z 坐标渲染代表“前面”图像的多边形。

于 2010-04-08T21:01:08.163 回答
0

在尝试让深度纹理工作之后,我尝试了 ARB_fragment_program 扩展,看看我是否可以编写一个非常简单(因此与旧硬件广泛兼容)的 GPU 组件片段着色器来完成这个技巧,但我最终决定使用GLSL 作为 ARB_fragment_program 扩展似乎已被弃用,或者至少现在它们的用法不受欢迎。

于 2010-04-11T17:31:09.710 回答
0

您可以尝试使用帧缓冲区对象来做您想做的事。

创建 fbo1 并附加颜色和深度缓冲区。渲染或设置背景场景。

创建 fbo2 并附加颜色和深度缓冲区。

在每次更新时使用帧缓冲区 blit 将颜色和深度缓冲区从 fbo1 到 fbo2。

将其余部分渲染到 fbo2

对主显示缓冲区执行 fbo2 颜色缓冲区的全屏 blit。

于 2010-04-28T17:26:49.143 回答