2010-10-08 4 views
1

En Panda3D, j'ai le code suivantProfondeur texture 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) 

... 

Quand je lance ci-dessus et autorisons les mémoires tampon de vue (show-tampons #t), la texture "sceneTex" ressemble à droite. Cependant, "depthTex" est toujours vide (tout en noir), peu importe où je déplace l'appareil photo. Quelqu'un sait ce qui ne va pas?

Merci

Répondre

0

Peut-être avez-vous désactivé l'écriture de votre test de profondeur? Même si vous ne pouvez pas obtenir d'artefacts évidents (cela dépend de votre scène), vous pourriez courir sans tampon de profondeur. Regardez dans le panda tutorial about depth buffer writing il vous dit aussi que certaines scènes fonctionnent mieux avec le tri en profondeur (vous avez peut-être testé cela mais vous n'avez pas inversé le code de désactivation du tampon de profondeur?)

0

J'ai rencontré le même problème. J'ai dû créer un shader personnalisé pour extraire la profondeur. Comme je voulais plus de 8 bits d'informations de profondeur, j'ai dû convertir la profondeur en 3 champs de 8 bits qui pourraient aller dans les composants RVB de l'image.

En Panda3D Python:

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

Les entrées et sorties shaders doivent également être mis en place (c.-à-vtx_position, mat_modelproj, etc. Voir les exemples dans la documentation Panda3D

En 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); 
}