Текстура глубины в Panda3D
В 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" выглядит правильно. Тем не менее, "глубина текста" всегда пуста (все черное), независимо от того, куда я перемещаю камеру. Кто-нибудь знает, что не так?
Спасибо
2 ответа
Возможно, вы отключили запись теста глубины? Даже если вы не можете получить никаких явных артефактов (зависит от вашей сцены), вы можете работать без буфера глубины. Посмотрите в руководстве panda о записи в буфер глубины, в нем также рассказывается о том, как некоторые сцены лучше работают с сортировкой по глубине (возможно, вы проверяли это, но не отменяли код отключения буфера глубины?)
Я столкнулся с той же проблемой. Мне пришлось создать собственный шейдер, чтобы извлечь глубину. Поскольку мне требовалось более 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);
}