【问题标题】:Using a 3D texture slice as a 2D texture input使用 3D 纹理切片作为 2D 纹理输入
【发布时间】:2010-06-12 10:46:48
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: 3d direct3d textures ogre3d


    【解决方案1】:

    您可以通过使用 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 轴的切片索引通过顶点着色器 (main_vp) 中的统一变量 (float4 slice) 传递。 (u, v) 纹理坐标在网格中定义(在这种情况下,它将是一个简单的 2D 四边形),由 GPU 插值,并在片段着色器中使用 (main_fp)

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

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

    【讨论】:

      猜你喜欢
      • 2012-09-28
      • 2014-05-25
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      相关资源
      最近更新 更多