2010-06-12 2 views
1

J'essaie de faire quelque chose avec Ogre en utilisant des textures 3D. Je voudrais mettre à jour une texture 3D en la parcourant par tranches et en recalculant les valeurs de couleur. Cependant, à chaque étape, j'ai également besoin d'accéder à la tranche précédente pour lire les valeurs. La définition d'une découpe en tant que cible de rendu est facile, mais est-il possible d'insérer une telle découpe en tant qu'entrée de texture 2D dans un shader, ou dois-je la copier explicitement dans une texture 2D séparée?Utilisation d'une tranche de texture 3D comme entrée de texture 2D

Merci.

Répondre

0

Vous pouvez adresser une tranche de la texture 3D en jouant avec les valeurs de coordonnées de texture 3D (que je désignerai comme les coordonnées (u, v, w)). Par exemple, supposons que vous vouliez obtenir les coupes le long de l'axe Z. Par exemple, disons que vous voulez obtenir les coupes le long de l'axe Z. Imaginez que votre texture 3D vive un cube unité dans le monde 3D. Les coordonnées (u, v, 0) donneront les texels de la première tranche. (u, v, 0.5) donnera les texels au milieu du volume et (u, v, 1.0), les texels de la dernière tranche.

Un premier nuanceur de coupe se présente comme suit:

// slicer.cg 
//------------------------------------------------------------------------------ 
struct AppData 
{ 
    float3 position : POSITION; 
    float3 normal  : NORMAL; 
    float3 texcoord : TEXCOORD0; 
}; 

struct VertexOutput 
{ 
    float4 position : POSITION; 
    float3 texcoord : TEXCOORD0; 
}; 
//------------------------------------------------------------------------------ 
VertexOutput main_vp(AppData   IN 
        , uniform float4 slice 
        , uniform float4x4 worldViewProj) 
{ 

    VertexOutput OUT; 
    OUT.position = mul(worldViewProj, float4(IN.position, 1)); 
    OUT.texcoord = float3(IN.texcoord.xy, slice.x); 

    return OUT; 
} 
//------------------------------------------------------------------------------ 
void main_fp(float3    texcoord : TEXCOORD0 
      , out float3   oColor : COLOR 
      , uniform sampler3D volume) 
{ 
    float val = tex3D(volume, texcoord).a; 
    oColor = float3(1.0, 0.0, 0.0) ; 
} 

Dans cet exemple, l'indice de la tranche le long de l'axe Z est passé à travers une variable uniforme (float4 slice), dans le vertex shader (main_vp). Les coordonnées de texture (u, v) sont définies dans un maillage (dans ce cas, ce serait un simple quadri 2D), interpolées par le GPU, et utilisées dans le fragment shader()

Je ne suis pas sûr de ce que vous êtes essayer d'atteindre en accédant à la tranche précédente, mais encore une fois, vous pouvez le faire en recalculant la valeur w dans le shader et rééchantillonnant la texture 3D.

Bien sûr, vous pourriez couper votre cube le long d'un autre axe, ou même avec un plan arbitraire, mais ce dernier nécessiterait un peu plus de calcul pour obtenir les 3 coordonnées (u, v, w).