Panda3D中的深度纹理

1 投票
2 回答
813 浏览
提问于 2025-04-16 05:13

在Panda3D里,我有以下这段代码

self.manager = FilterManager(base.win, base.cam)

self.sceneTex = Texture("scene")
self.depthTex = Texture("depth")


self.quad = self.manager.renderSceneInto(colortex=self.sceneTex, depthtex = self.depthTex)

...   

当我运行上面的代码并开启视图缓冲(show-buffers #t)时,“sceneTex”这个纹理看起来是对的。但是,不管我把相机移动到哪里,“depthTex”总是空白的(全黑)。有人知道这是怎么回事吗?

谢谢

2 个回答

0

我遇到了同样的问题。为了提取深度信息,我需要创建一个自定义的着色器。因为我想要的深度信息超过了8位,所以我必须把深度值转换成3个8位的字段,这样才能放进图像的RGB组件里。

在Panda3D的Python中:

# Set up Shader
dcam = loader.loadShader('Dcam.sha')
# render everything through this camera and shader
self.terrain.getRoot().setShader(dcam)

着色器的输入和输出也需要设置好(比如vtx_position、mat_modelproj等等。可以参考Panda3D文档中的示例)。

在Dcam.sha文件中:

//Cg

void vshader(float4 vtx_position : POSITION,
             uniform float4x4 mat_modelproj,
             out float4 l_position : POSITION,
             out float4 l_pos : TEXCOORD0)
{
    float4 position = vtx_position;
    l_pos = mul(mat_modelproj, position);
    l_position = l_pos;
}

void fshader(in float4 l_pos : TEXCOORD0,
             out float4 o_color : COLOR)
{
    float z = (l_pos.z / l_pos.w) * 0.5 + 0.5;
    float zres = 16777216.0 * z;
    float v0 = round(zres / 65536.0);
    zres = zres - 65536.0 * v0;
    float v1 = round(zres / 256.0);
    zres = zres - 256.0 * v1;
    float v2 = round(zres);
    o_color = float4(v0, v1, v2, 1);
}
0

也许你禁用了深度测试的写入?即使你可能没有看到明显的问题(这取决于你的场景),你可能是在没有深度缓冲区的情况下运行。可以看看关于深度缓冲区写入的Panda教程,里面也提到了一些场景在深度排序方面表现得更好(你可能测试过这个,但没有恢复你禁用深度缓冲区的代码?)

撰写回答