3D テクスチャを使用して Ogre で何かをしようとしています。スライスごとに調べて色の値を再計算することで、3D テクスチャを更新したいと考えています。ただし、各ステップでは、何らかの方法で前のスライスにアクセスして値を読み取る必要もあります。スライスをレンダー ターゲットとして設定するのは簡単ですが、そのようなスライスを 2D テクスチャ入力としてシェーダーに供給することは可能ですか?それとも別の 2D テクスチャに明示的にコピーする必要がありますか?
ありがとう。
3D テクスチャの座標値 (座標と呼びます) をいじることで、3D テクスチャの 1 つのスライスに対処できます(u, v, w)
。
たとえば、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)
座標を取得するためにもう少し計算が必要になります。