신 그래프에 어떤 액션을 수행하는 것은 일반적인 모델을 따른다
1. 액션 클래스의 인스턴스를 생성하므로써 액션을 초기화하라.
SbViewportRegion region(300, 200);
SoGLRenderAction renderAction(region);
액션의 인스턴스를 할당하기 위한 new 연산자를 이용할 수도 있다
renderAction = new SoGLRenderAction(region);
new를 가지고 액션을 생성하면, 끝내기 전에 액션을 삭제하는 걸 잊지 마라
2. 액션에 대한 특별한 파라미터를 설정하라
예를 들어, SoGLRenderAction 에 대한 생성자는 뷰포트 영역을 설정하는 것 뿐만 아니라 OpenGL 설정을 상속받을 것인지 결정할 수 있다
SoGLRenderAction renderAction(region, TRUE);
3. 노드, 패스 또는 패스 리스트 에 액션을 적용하라
renderAction->apply(root);
4. 액션에 대한 결과를 얻어라
어떤 액션들은 그것들을 사용하기 위해 추가 함수를 가진다
예를 들어 SoGetBoundingBoxAction 은 다음 함수를 가진다
getBoundingBox() - 액션에 의해 계산된 경계 박스
getCenter() - 계산된 중심 반환
- 대부분 Volume 품질 설정은 SoVolumeRenderingQuality 노드의 부분
- 그러나 전체는 아님
- 예를 들면, 샘플의 수(the number of samples)와 관련된 설정은 SoVolumeRender 노드의 일부
* SoVolumeRenderingQuality
- lighting
- 슬라이스 렌더링과 비교하여, 직접적인 Volume 렌더링은 이미지를 생성하는 것의 완전히 다른 방법이다
- 다른 Open Inventor 렌더링 노드들과는 다르게 Volume 렌더링은 점, 선, 삼각형과 같은 전통적인 컴퓨터 그래픽스 도형의 어떤 것도 사용하지 않음
- Volume 데이터 : 3D 스칼라 필드, 스칼라 값 셀의 일반 그리드로 고려
- 2D 픽셀과 유사하게, 각각 3D 셀은 "Voxel"로 불린다 : volume element
- Volume 렌더링은 어떤 지오메트리 사용없이 Volume 데이터 가시화 가능
- VolumeViz는 Volume Ray-casting 기술을 이용하여 보여줌
- Ray는 Volume을 통해 던져지고 규칙적인 또는 적절한 간격을 샘플링 함
- 각 샘플 점에서 데이터 값들은 보간
- 결과 스칼라 값은 transfer function을 통해 색과 투명도에 맵핑
- 이것은 RGBA 값을 결과로 출력
- 개념적으로 이 값은 Volume을 통해 Voxel이 빛 투과에 어떻게 영향받는지 결정
- RGBA 값은 Ray를 따라 이전 값에 합쳐지(composite)
- 최종 합성된 ray의 값은 화면에서 대응되는 픽셀의 색상을 결정
- 다른 렌더링 노드와 마찬가지로 이 알고리즘은 최대 성능을 위해
완전히GPU에서 구현
- Volume 렌더링은 유일한 렌더링 기술이고 슬라이스 기반 렌더링보다 더 강력함(powerful)
- 그러나 사용하는데 훨씬 더 복잡하고 GPU에서 요구되는 거대한 계산량 때문에 일반적으로 슬라이스 렌더링보다 덜 상호적(interactive)
- 슬라이스 렌더링은 Volume의 내부 구조에 대한 단서 제공하는 반면에
Volume 렌더링은 직접ㅈ적으로 내부 구조의 모양을 가시화
-SoVolumeRender 노드를 지오메트리 노드의 한 종류로 생각하는 것이 편리
- VolumeViz는 가능한 많이 표준 Open Inventor 속성(attribute)과 연산(operations)을 적용
- 예를 들어 Voxel에 빛을 적용할 수 있고, 그림자를 주고 받을 수 있음
- 유사하게 SoRayPickAction을 Volume 렌더링을 포함하는 신(scene)에 적용할 때, 액션은 첫 번째 불투명 voxel을 찾음
* Ray Casting
- 이 알고리즘은 빛의 방사(emission), 반사(reflection) 그리고 흡수(absorption)에 기반한 고전 컴퓨터 그래픽스 렌더링 방정식을 구현
- Volume으로 ray cast의 수가 스크린에 렌더링되어야 하는 픽셀에 수의 의존하기 때문에 이미지 기반 기술
- ray에 따른 샘플링은 성능과 이미지 품질을 증가시키기 위해 Volume에서 데이터에 적용할 수 있기 때문 텍스처 폴리곤 기반보다 유연(flexible)
- VolumeViz ray-casting 엔진은 GPU에서 실행
- 그래픽 보드에서 프로세서의 수에 따라 스케일되는 훌륭한 성능을 수행하기 위해 GPU의 거대한 평행(parallelism)을 활용
- GPU 구현은 표준 GLSL 언어에서 쓰이는 셰이더 함수를 사용해서 응용 프로그램에 확장(extented)할 수 있고 편집(customized)할 수 있음
![The four basic steps of volume ray casting: 1. Ray Casting 2. Sampling 3. Shading 4. Compositing.](http://oivdoc96.vsg3d.com/sites/default/files/imported/usersguide/images/VVVolumeRendering1.png)
Figure 1.29. The four basic steps of volume ray casting: 1. Ray Casting 2. Sampling 3. Shading 4. Compositing.
- (Volume에 의해 영향을 받을 수도 있는) 최종 이미지에서 각 픽셀에 대해,
"ray"는 신 과 Volume을 통해 직선으로 던져진다
- 이 ray를 따라 간 계산은 평행하게 수행될 수 있음
- 각 ray에 대해 Volume의 잘리지 않은 부분과 교차되는 점이 계산됨
- Volume은 clip plane, region of interest, polygons 그리고 다른 기술에 의해 잘릴 수 있음
- 교차점을 시작으로 ray에 따른 샘플링 점들은 선택된다
- 각 샘플 점들에 대해 데이터 값은 주변 voxel과 함께 보간에 기반되어 계산
- 응용 프로그램은 데이터에 필터를 적용하거나 여러 개의 Volume을 혼합하여 이 계산을 편집(customize)할 수 있음
- 만약 빛(lighting) 또는 모서리 검출(edge detection)과 같은 렌더링 기술이 가능하면, 그래디언트(gradient)는 계산됨
- 이것은 표면 범선 벡터(surface normal vector)와 유사하게 Volume 렌더링을 표현
- 응용 프로그램은 정확성과 성능의 거래(trade-off)에 따라 여러 그래디언트 알고리즘을 선택 가능
- 샘플 값과 그래디언트를 사용하여, 색과 투명도가 계산
- VolumeViz 는 라이팅(lighting), 모서리 색상(edge coloring) 그리고 경계 투명도(boundary opacity)와 같은 추가 렌더링 효과를 제공
- 최종적으로 샘플링된 색생과 투명도는 ray에서 출발한 각 픽셀에 대해 최종 색상과 투명도를 계산하기 위해 ray에 따른 다른 샘플들과 함께 혼합됨
- 응용 프로그램은 여러 혼합 알고리즘 중에서 선택
- VolumeViz는 호환성(compatibility)을 위해 이전의 렌더링 알고리즘 제공
- 이 알고리즘은 Volume 데이터에 텍스처를 입힌 폴리곤의 스택을 그림으로써 Volume 렌더링에 근사화 한다
- 폴리곤 렌더링 알고리즘은 SoVolumeRenderingQuality 노드에서 raycasting 필드를 false 로 설정하면 행해짐
* Rendering
- 슬라이스 렌더링과 마찬가지로, Volume 렌더링의 색과 투명도는 주로
SoMaterial, SoDataRange 그리고 SoTransferFunction(color map) 노드에 의해 결정
- Volume 렌더링의 결과는 슬라이스 객체(primitive)와는 약간 다른 옵션을 제외하고 보간에 의해 영향을 받음
- 기본 색과 투명도가 결정된 후에 라이팅과 렌더링은 슬라이스 렌더링보다 훨씬 더 복잡하다
- Volume 렌더링의 최종 결과는 다음 항목에 영향을 받음
-- LDM 메모리 설정
-- 렌더링 품질 설정(Rendering Quality Setting)
-- 렌더링 효과 (Rendering Effect)
-- 렌더링 모드(Rendering Mode)
- 렌더링 품질 설정(Volume Rendering Quality Settings)
- SoVolumeRender
- SoVolumeRenderingQuality
- 샘플링 수(Number of samples)
- 이전 통합 렌더링(Preintegrated rendering)
- 지터링(Jittering)
- 3차원 보간(Cubic Interpolation)
- 풀 해상도에서 메모리에 로딩될 수 없는 매우 큰 Volume에 대해 Volume 렌더링의 결과(appearance)는 SoLDMResourceParameters의 필드를 사용한 LDM 파라미터 설정에 의해 영향을 받음
- Volume에 대한 SoLDMResourceParameters 객체는 SoVolumeData 노드의 ldmResourceParameters 필드로부터 요구(query)할 수 있다
- 관계있는 필드는 maxMainMemory 와 maxTexMemory를 포함한다
- 렌더링 효과(Volume Rendering Effects)
- SoVolumeRenderingQuality
- 라이팅과 같은 사실 효과와 에지 컬러링과 같은 NPR(non-photorealistic) 효과 둘 다 포함
- Lighting
- Edge coloring
- Boundary opacity
- Edge detection (2D)
* Volume의 Lighting
- SoVolumeRenderingQuality 노드를 사용하여 옵션 설정
- Gradient quality
- Gradient threshold
- Surface scalar exponent
- Ambient occlusion
* Volume 렌더링의 성능
- Volume의 크기
- 샘플의 수
- 선택된 품질 설정(quality settings)
- 렌더링 효과(Rendering effects)
- SoVolumeRender 노드에서 구체적인 옵션
-- lowResMode
-- lowScreenResolutionScale
-- subDivideTile
-- gpuVertexGen
* 렌더링 모드(Volume rendering modes)
- 다양한 노드를 사용하여 대체적인 렌더링 모드를 사용한 이미지 생성
- Maximum Intensity Projection ( and other composition styles)
- Isosurface rendering
- Voxelized("Sugar cube") rendering
- Mask boundary rendering
- Volume 데이터는 응용 프로그램의 메모리에 저장되어 있다고 가정
- VolumeViz에서 사용 가능한 Volume 데이터를 만드는 것
- Volume 데이터를 묘사할 파라미터 설정
- VolumeViz가 시스템 메모리에 저장된 Volume에 접근하는 방법
- Volume 차원 : 256 x 256 x 256
- 데이터 값은 부호없는 8비트 정수(bytes : unsigned 8-bit integers)
- 데이터와 특성은 SoVolumeData 노드의 setValue() 함수를 사용해서 데이터 필드를 설정
- 이 함수의 세 번째 파라미터는 numSigBits(각 데이터 값에서 중요 비트의 수)
- 이 경우에 우리는 모든 8비트를 사용하므로 이 파라미터를 0으로 설정하고, 이것은 모든 비트를 사용한다는 의미
- 다른 경우의 예에서 16비트 값에서 오직 12 비트를 사용하는 DICOM 데이터의 경우 이 파리미터를 12 로 설정
- 만약 VolumeViz가 데이터의 복사본을 만들면, 응용 프로그램은 메모리를 해제할 수 있음
// Pointer to Volume data
unsigned char* pData = new unsigned char [numVoxels];
...
// Volume Characteristics
SbVec3i32 volDim(256, 256, 256);
SbDataType dataType = SbDataType::UNSIGNED_BYTE;
SoVolumeData* pVolData = new SoVolumeData();
pVolData->data.setValue(volDim, dataType, 0,
(void*)pData, SoSFArray::NO_COPY);