이 페이지에서

볼륨 렌더링

볼륨 오브젝트 렌더링.

'볼륨 렌더링'에서는 QCustom3DVolume을 사용하여 볼륨 데이터를 표시하는 방법을 설명합니다.

물과 육지 레이어가 포함된 3D 지형의 볼륨 렌더링

예제 실행

다음 경로에서 예제를 실행할 수 있습니다:

볼륨 항목 초기화

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);

슬라이스를 확인하는 두 번째 방법은 ` QCustom3DVolume::renderSlice()` 메서드를 사용하는 것으로, 이 메서드는 지정된 슬라이스로부터 ` QImage ` 객체를 생성합니다. 이 이미지는 ` QLabel`와 같은 다른 위젯에 표시할 수 있습니다:

m_sliceLabelX->setPixmap(
            QPixmap::fromImage(m_volumeItem->renderSlice(Qt::XAxis, m_sliceIndexX)));

볼륨 투명도 조정

때로는 슬라이스만 보는 것만으로는 볼륨의 내부 구조를 제대로 파악하기 어려울 수 있습니다. 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);

예제 내용

예제 프로젝트 @ code.qt.io

© 2026 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.