我正在嘗試使用3D紋理進行Ogre的操作。我想通過逐片切片並重新計算顏色值來更新3D紋理。但是,在每一步中,我還需要以某種方式訪問前一個片段以讀取值。將切片設置爲渲染目標很容易,但是可以將這種切片作爲2D紋理輸入提供給着色器,還是需要將其明確地複製到單獨的2D紋理中?使用3D紋理切片作爲2D紋理輸入
謝謝。
我正在嘗試使用3D紋理進行Ogre的操作。我想通過逐片切片並重新計算顏色值來更新3D紋理。但是,在每一步中,我還需要以某種方式訪問前一個片段以讀取值。將切片設置爲渲染目標很容易,但是可以將這種切片作爲2D紋理輸入提供給着色器,還是需要將其明確地複製到單獨的2D紋理中?使用3D紋理切片作爲2D紋理輸入
謝謝。
您可以使用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紋理來實現。
當然,您可以沿着另一個軸切割立方體,甚至可以使用任意一個平面切割立方體,但最後一個需要更多的數學運算來獲得座標。