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

使用3D纹理切片作为2D纹理输入,3d,direct3d,textures,ogre3d,3d,Direct3d,Textures,Ogre3d,我正在尝试使用3D纹理来处理食人魔。我想通过逐片检查3D纹理并重新计算颜色值来更新它。然而,在每一步中,我还需要以某种方式访问上一个切片以读取值。将切片设置为渲染目标很容易,但是是否可以将此类切片作为2D纹理输入提供给着色器,或者是否需要将其显式复制到单独的2D纹理中 谢谢。您可以通过播放3D纹理坐标值(我将其称为(u、v、w)坐标)来处理3D纹理的一个切片 例如,假设要沿Z轴获取切片。假设您的3D纹理生活在3D世界中的一个单位立方体中。坐标(u,v,0)将产生第一个切片的texel(u,v,0

我正在尝试使用3D纹理来处理食人魔。我想通过逐片检查3D纹理并重新计算颜色值来更新它。然而,在每一步中,我还需要以某种方式访问上一个切片以读取值。将切片设置为渲染目标很容易,但是是否可以将此类切片作为2D纹理输入提供给着色器,或者是否需要将其显式复制到单独的2D纹理中


谢谢。

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

例如,假设要沿Z轴获取切片。假设您的3D纹理生活在3D世界中的一个单位立方体中。坐标
(u,v,0)
将产生第一个切片的texel<代码>(u,v,0.5)< /代码>将在卷的中间产生纹理,而<代码>(u,v,1),最后一个切片的纹理。

第一个切片着色器如下所示:

// 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轴的切片索引通过顶点着色器
(main_vp)
中的统一变量(
float4 slice
)传递。
(u,v)
纹理坐标在网格中定义(在本例中,它将是一个简单的2D四边形),由GPU插值,并用于片段着色器(
main\u fp

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

当然,你可以沿着另一个轴切割立方体,甚至可以用任意平面切割立方体,但是最后一个需要更多的数学知识才能得到3
(u,v,w)
坐标