볼류메트릭 렌더링
볼류메트릭 오브젝트 렌더링하기.
볼류메트릭 렌더링은 QCustom3DVolume 을 사용하여 볼류메트릭 데이터를 표시하는 방법을 보여줍니다.
예제 실행하기
에서 예제를 실행하려면 Qt Creator에서 Welcome 모드를 열고 Examples 에서 예제를 선택합니다. 자세한 내용은 예제 빌드 및 실행을 참조하세요.
볼륨 항목 초기화하기
QCustom3DVolume 항목은 체적 데이터를 표시하는 데 사용할 수 있는 특수 사용자 지정 항목( QCustom3DItem 참조 )입니다. 볼륨 항목은 직교 투영에서만 지원되므로 먼저 그래프가 직교 투영을 사용하고 있는지 확인하세요:
m_graph->setOrthoProjection(true);
축의 데이터 범위에 연결된 체적 항목을 만듭니다:
m_volumeItem = new QCustom3DVolume; // Adjust water level to zero with a minor tweak to y-coordinate position and scaling m_volumeItem->setScaling( QVector3D(m_graph->axisX()->max() - m_graph->axisX()->min(), (m_graph->axisY()->max() - m_graph->axisY()->min()) * 0.91f, m_graph->axisZ()->max() - m_graph->axisZ()->min())); m_volumeItem->setPosition( QVector3D((m_graph->axisX()->max() + m_graph->axisX()->min()) / 2.0f, -0.045f * (m_graph->axisY()->max() - m_graph->axisY()->min()) + (m_graph->axisY()->max() + m_graph->axisY()->min()) / 2.0f, (m_graph->axisZ()->max() + m_graph->axisZ()->min()) / 2.0f)); m_volumeItem->setScalingAbsolute(false);
QCustom3DItem::scalingAbsolute 속성을 false
으로 설정하여 볼륨의 배율이 데이터 범위의 변경 사항을 따라야 함을 나타냅니다. 다음으로 볼륨의 내부 내용을 정의합니다:
m_volumeItem->setTextureWidth(lowDetailSize); m_volumeItem->setTextureHeight(lowDetailSize / 2); m_volumeItem->setTextureDepth(lowDetailSize); m_volumeItem->setTextureFormat(QImage::Format_Indexed8); m_volumeItem->setTextureData(new QList<uchar>(*m_lowDetailData));
텍스처에는 8비트 인덱스 색상을 사용하면 전체 텍스처를 재설정할 필요 없이 색상을 쉽게 조정할 수 있으므로 압축되어 있습니다. 텍스처 데이터의 경우 높이 맵을 기반으로 이전에 생성한 데이터를 사용합니다. 일반적으로 볼륨 항목의 데이터는 이미지 스택 형태로 미리 생성되어 제공되므로 데이터 생성 세부 사항은 건너뛸 수 있습니다. 실제 데이터 생성 프로세스에 대한 자세한 내용은 예제 코드를 참조하세요.
8비트 색인 색상이 사용되므로 8비트 색상 인덱스를 실제 색상에 매핑하려면 색상 테이블이 필요합니다. 일반적인 사용 사례에서는 수동으로 정의된 색상 테이블을 사용하는 대신 소스 이미지에서 색상 테이블을 가져옵니다:
m_volumeItem->setColorTable(m_colorTable1);
볼륨 주위에 슬라이스 프레임을 표시하는 옵션을 사용하려면 해당 속성을 초기화합니다. 처음에는 프레임이 숨겨집니다:
m_volumeItem->setSliceFrameGaps(QVector3D(0.01f, 0.02f, 0.01f)); m_volumeItem->setSliceFrameThicknesses(QVector3D(0.0025f, 0.005f, 0.0025f)); m_volumeItem->setSliceFrameWidths(QVector3D(0.0025f, 0.005f, 0.0025f)); m_volumeItem->setDrawSliceFrames(false);
마지막으로 볼륨을 그래프에 사용자 지정 항목으로 추가하여 표시합니다:
m_graph->addCustomItem(m_volumeItem);
볼륨으로 슬라이싱하기
볼륨이 크게 투명하지 않으면 표면만 볼 수 있으므로 그다지 유용하지 않은 경우가 많습니다. 볼륨의 내부 구조를 검사하는 한 가지 방법은 볼륨의 슬라이스를 보는 것입니다. QCustom3DVolume 에서는 슬라이스를 표시하는 두 가지 방법을 제공합니다. 첫 번째는 볼륨 대신 선택한 슬라이스를 표시하는 것입니다. 예를 들어 X축에 수직인 슬라이스를 지정하려면 다음 방법을 사용합니다:
m_volumeItem->setSliceIndexX(m_sliceIndexX);
위에서 지정한 슬라이스를 표시하려면 QCustom3DVolume::drawSlices 속성도 설정해야 합니다:
m_volumeItem->setDrawSlices(true);
슬라이스를 보는 두 번째 방법은 지정된 슬라이스에서 QImage 을 생성하는 QCustom3DVolume::renderSlice() 메서드를 사용하는 것입니다. 그런 다음 이 이미지를 QLabel 와 같은 다른 위젯에 표시할 수 있습니다:
볼륨 투명도 조정하기
때로는 슬라이스를 보는 것만으로는 볼륨의 내부 구조를 잘 이해하지 못할 때가 있습니다. QCustom3DVolume 은 볼륨 투명도를 조정하는 데 사용할 수 있는 두 가지 프로퍼티를 제공합니다:
m_volumeItem->setAlphaMultiplier(mult); ... m_volumeItem->setPreserveOpacity(enabled);
QCustom3DVolume::alphaMultiplier 은 볼륨의 각 복셀의 알파 값에 적용되는 일반 승수입니다. 이를 통해 이미 어느 정도 투명한 볼륨 부분에 균일한 투명도를 추가하여 내부의 불투명한 디테일을 드러낼 수 있습니다. 이 배율은 QCustom3DVolume::preserveOpacity 속성을 false
으로 설정하지 않는 한 완전히 불투명한 색상에는 영향을 미치지 않습니다.
볼륨의 투명도를 조정하는 다른 방법은 복셀의 알파 값을 직접 조정하는 것입니다. 8비트 인덱스 텍스처의 경우 컬러 테이블을 수정하고 재설정하기만 하면 됩니다:
int newAlpha = enabled ? terrainTransparency : 255; for (int i = aboveWaterGroundColorsMin; i < underWaterGroundColorsMax; i++) { QRgb oldColor1 = m_colorTable1.at(i); QRgb oldColor2 = m_colorTable2.at(i); m_colorTable1[i] = qRgba(qRed(oldColor1), qGreen(oldColor1), qBlue(oldColor1), newAlpha); m_colorTable2[i] = qRgba(qRed(oldColor2), qGreen(oldColor2), qBlue(oldColor2), newAlpha); } if (m_usingPrimaryTable) m_volumeItem->setColorTable(m_colorTable1); else m_volumeItem->setColorTable(m_colorTable2);
고화질 셰이더와 저화질 셰이더 비교
기본적으로 볼류메트릭 렌더링은 고화질 셰이더를 사용합니다. 볼륨 콘텐츠를 레이 트레이싱할 때 볼륨의 각 복셀에 정확한 가중치를 부여하여 볼륨의 미세한 디테일까지 정확하게 표현합니다. 하지만 계산 비용이 매우 높기 때문에 프레임 속도가 저하됩니다. 볼륨 콘텐츠의 픽셀 단위 정확도보다 렌더링 속도가 더 중요하다면 QCustom3DVolume::useHighDefShader 속성 false
을 설정하여 훨씬 빠른 저해상도 셰이더를 사용하세요. 저해상도 셰이더는 정확도를 희생하여 속도를 달성하므로 볼륨의 모든 복셀이 샘플링된다는 보장은 없습니다. 이로 인해 볼륨의 미세한 디테일에서 깜박임이나 기타 렌더링 아티팩트가 발생할 수 있습니다.
m_volumeItem->setUseHighDefShader(enabled);
콘텐츠 예시
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.