2010-06-12 111 views
1

我正在嘗試使用3D紋理進行Ogre的操作。我想通過逐片切片並重新計算顏色值來更新3D紋理。但是,在每一步中,我還需要以某種方式訪問​​前一個片段以讀取值。將切片設置爲渲染目標很容易,但是可以將這種切片作爲2D紋理輸入提供給着色器,還是需要將其明確地複製到單獨的2D紋理中?使用3D紋理切片作爲2D紋理輸入

謝謝。

回答

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內插,並用於片段着色器()

我不確定你是什麼試圖通過訪問上一個片來實現,但是可以通過在着色器中重新計算w值並重新採樣3D紋理來實現。

當然,您可以沿着另一個軸切割立方體,甚至可以使用任意一個平面切割立方體,但最後一個需要更多的數學運算來獲得座標。