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로 보간되어 프래그먼트 셰이더()에 사용됩니다.
당신이 무엇인지 모르겠습니다. 이전 슬라이스에 액세스하여 달성하려고 시도했지만 다시 셰이더의 w
값을 다시 계산하고 3D 텍스처를 리샘플링하여 수행 할 수 있습니다.
물론 다른 축 또는 임의의 평면을 따라 큐브를자를 수 있지만 마지막 좌표는 3 (u, v, w)
좌표를 얻기 위해 더 많은 수학이 필요합니다.