2010-06-12 7 views
1

3D 텍스처를 사용하여 Ogre로 무언가를하려고합니다. 슬라이스별로 슬라이스를 이동하고 색상 값을 다시 계산하여 3D 텍스처를 업데이트하고 싶습니다. 그러나 각 단계에서 필자는 어떻게 든 값을 읽으려면 이전 슬라이스에 액세스해야합니다. 슬라이스를 렌더 타겟으로 설정하는 것은 쉽지만 셰이더에 2D 텍스처 입력과 같은 슬라이스를 공급할 수 있습니까? 아니면 별도의 2D 텍스처로 명시 적으로 복사해야합니까?2D 텍스처 입력으로 3D 텍스처 슬라이스 사용

감사합니다.

답변

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 축을 따라 슬라이스 인덱스는 정점 셰이더 (main_vp)에서 균일 변수 ( float4 slice)를 통과한다. (u, v) 텍스쳐 좌표는 메쉬에 정의되어 있습니다 (이 경우 2D 커브가됩니다). GPU로 보간되어 프래그먼트 셰이더()에 사용됩니다.

당신이 무엇인지 모르겠습니다. 이전 슬라이스에 액세스하여 달성하려고 시도했지만 다시 셰이더의 w 값을 다시 계산하고 3D 텍스처를 리샘플링하여 수행 할 수 있습니다.

물론 다른 축 또는 임의의 평면을 따라 큐브를자를 수 있지만 마지막 좌표는 3 (u, v, w) 좌표를 얻기 위해 더 많은 수학이 필요합니다.