使用3D纹理切片作为2D纹理输入

时间:2010-06-12 10:46:49

标签: 3d direct3d textures ogre3d

我正在尝试使用3D纹理对Ogre做些什么。我想通过逐个切片并重新计算颜色值来更新3D纹理。但是,在每个步骤中,我还需要以某种方式访问​​上一个切片以读取值。将切片设置为渲染目标很容易,但是可以将这样的切片作为2D纹理输入提供给着色器,还是需要将其显式复制到单独的2D纹理中?

感谢。

1 个答案:

答案 0 :(得分:0)

您可以通过播放3D纹理坐标值(我将其称为(u, v, w)坐标)来处理3D纹理的一个切片。

例如,假设您想要沿Z轴获取切片。想象一下,您的3D纹理在3D世界中是一个单位立方体。坐标(u, v, 0)将产生第一个切片的纹素。 (u, v, 0.5)将生成卷中间的纹素和(u, v, 1.0),即最后一个切片的纹素。

第一个切片着色器看起来像这样:

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

在此示例中,沿Z轴的切片索引通过顶点着色器float4 slice中的统一变量((main_vp))传递。 (u, v)纹理坐标在网格中定义(在这种情况下,它将是一个简单的2D四边形),由GPU插值,并在片段着色器中使用(main_fp

我不确定您要通过访问上一个切片来实现什么,但同样,您可以通过重新计算着色器中的w值并重新采样3D纹理来实现。

当然,您可以沿另一个轴切割立方体,甚至可以使用任意平面,但最后一个需要更多的数学来获得3 (u, v, w)坐标。