【发布时间】:2010-06-12 10:46:48
【问题描述】:
我正在尝试使用 3D 纹理对 Ogre 做一些事情。我想通过逐个切片并重新计算颜色值来更新 3D 纹理。但是,在每个步骤中,我还需要以某种方式访问前一个切片以读取值。将切片设置为渲染目标很容易,但是是否可以将这样的切片作为 2D 纹理输入提供给着色器,或者我是否需要将其显式复制到单独的 2D 纹理中?
谢谢。
【问题讨论】:
标签: 3d direct3d textures ogre3d
我正在尝试使用 3D 纹理对 Ogre 做一些事情。我想通过逐个切片并重新计算颜色值来更新 3D 纹理。但是,在每个步骤中,我还需要以某种方式访问前一个切片以读取值。将切片设置为渲染目标很容易,但是是否可以将这样的切片作为 2D 纹理输入提供给着色器,或者我是否需要将其显式复制到单独的 2D 纹理中?
谢谢。
【问题讨论】:
标签: 3d direct3d textures ogre3d
您可以通过使用 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) 坐标。
【讨论】: