2016. 1. 7. 00:50

Volume의 특성

- 차원(dimension)

- 범위(extent)

- Voxel 크기(size)/공간(spacing)

- 데이터 타입(data type)

- 데이터 범위(data range)

- GPU에서의 data


* 차원(Dimensions)

- Volume의 차원(각 축에 대한 Voxel의 수)은 보통 데이터 파일에서의 정보로부터 Volume 리더에 의해 결정

- 스택에서의 이미지 수

- 데이터 필드를 이용해서 Volume 차원을 쿼리할 수 있다


SbVec3i32 volumeDimension = pVolumeData->data.getSize();


* 범위(Extent)

- 3D에서 Volume의 기하학적 범위는 Volume 리더에 의해 초기에 결정

- extent 필드를 사용하여 설정 가능

- Volume 범위는 월드 공간에서 Volume의 경계 박스(bounding box)

- 종종 3D에서 Volume 범위는 Volume의 차원과 같게 설정됨

- 또는 Volume 차원에 비례하여 값을 설정

- Volume 범위는 어떤 범위든 될 수 있음

- Volume 범위는 간접적으로 Voxel 크기/공간을 지정

- extent 필드를 사용하여 Volume 범위를 쿼리


SbBox3f volumeExtent = pVolumeData->extent.getValue();


* Voxel 크기(size)/공간(spacing)

- 만약 Volume 데이터가 균일하게 샘플링되면, Voxel 크기는 Volume 범위를 Volume 차원으로 나눈 값

- Voxel 크기는 각 축에 따라 여전히 균일하지만, 최소한 한 축에 따라 다름

- 이것은 Volume Z 축을 따라 더 큰 공간을 가지는 의료 스캐너 Volume 의 전형

- 그러나 Volume 범위는 응용 프로그램에 의해 정해지고 심지어 실시간으로 바뀜

- VolumeViz는 균일적으로 Voxel에 한계가 있지 않음

- VolumeViz는 또한 "직사각 좌표"(rectilinear coordinates) 를 지원

 여기서 각축에  따라 비균일(non-uniform) voxel위치가 구체적으로 주어짐

- 이 정보는 Volume 리더에 의해 제공

- 쿼리 방법

SoVolumeData의 함수 getCoordinateType() 과 getRectilinearCoordinates() 함수를 사용


* 데이터 타입(Data Type)

- VolumeViz는 부호 있고(signed)와 부호 없는(unsigned) 정수 값

(byte, short, int) 또는 부동 소수점 값을 지원

- VolumeViz는 32비트에 알파 값을 포함하는 RGBA Volume 을 지원

- 데이터 타입은 리더(reader)에 의해 결정 (data 필드를 설정할 때)

- 쿼리 방법(데이터 타입, Voxel당 바이트 수)


int bytesPerVoxel = pVolumeData->getDataSize();

SoDataSet::DataType type = pVolumeData->getDataType();



* 데이터 범위(Data Range)

- 바이트보다 더 큰 데이터 타입을 사용하는 Volume에서, 데이터 값의 실제 범위는 보통 데이터 타입의 범위보다 더 작음

- 응용프로그램은 transfer function에 매핑될 값의 범위를 정하기 위해 SoDataRange 노드를 사용

- 쿼리 방법


double minVal, maxVal;

SbBool ok = pVolumeData->getMinMax(minVal, maxVal);


- 만약 getMinMax( ) 쿼리가 반응하지 않으면, 이 함수는 전체 데이터 집합을 메모리로 로딩시키는 것을 VolumeViz에 강제시키고, 

최소, 최대 값을 계산하기 위해 모든 voxel을 통해 스캔함



* GPU에서의 데이터

- 디폴트적으로, VolumeViz는 8비트보다 더 큰 모든 타입의 데이터 값을 8 비트 부호없는 정수(8-bit unsigned integer) 값으로 GPU에 스케일링함

- 렌더링 목적을 위해 이것은 보통 충분하고 

 작은 데이터 타입을 사용하는 것은 GPU 위의 사용가능한 메모리에서 

로딩될 수 있는 데이터의 양을 최대화함

- 만약 필요하다면 SoVolumeData 노드의 texturePrecision 필드를 

  설정함으로써 12 비트 정수 값을 사용할 수 있음

- 주의 : 12 비트 옵션은 실질적으로 데이터를 저장하기 위해 16비트 텍스처를 사용한다. 그래서 이 경우에는 GPU에서 필요한 메모리는 2배가 됨

- 개념적으로 고려할 이슈는 (데이터 타입과 데이터 범위(range)에 의존하여) 실질적인 데이터 값의 범위는 각 GPU 값 위에 "aliased" 될 수 있음

- 예를 들어 32 에서 47까지의 범위에 있는 모든 데이터 값은 GPU 메모리에서 32로 끝날 수 있음

- 렌더링을 위해 GPU에서 더 큰 데이터 타입을 사용하는 것의 주요 장점은 더 크고 더 정확한 컬러 맵을 이용하기 위해서임

- 요약하면, 디폴트 데이터 저장공간은 256개의 다른 값을 허락하고 12 비트 저장공간은 4096의 값을 허락한다