* 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의 값을 허락한다