在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”始终为空白(全黑)。谁知道什么是错的?
由于
答案 0 :(得分:0)
也许你已经禁用了深度测试写作?即使你可能没有任何明显的伪像(取决于你的场景),你可以在没有深度缓冲区的情况下运行。在panda tutorial about depth buffer writing中查看它还会告诉您一些场景在深度排序方面的效果更好(您可能已经测试过但未恢复深度缓冲区禁用代码?)
答案 1 :(得分: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);
}