このページでは

ボリュームレンダリング

ボリュームオブジェクトのレンダリング。

「ボリュームレンダリング」では、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 では、スライスを表示する 2 つの方法が用意されています。1 つ目は、ボリュームの代わりに選択したスライスを表示する方法です。たとえば、X 軸に垂直なスライスを指定するには、次のメソッドを使用します:

m_volumeItem->setSliceIndexX(m_sliceIndexX);

上記で指定したスライスを表示するには、QCustom3DVolume::drawSlices プロパティも設定する必要があります:

m_volumeItem->setDrawSlices(true);

スライスを表示する2つ目の方法は、QCustom3DVolume::renderSlice() メソッドを使用することです。このメソッドは、指定されたスライスからQImage を生成します。この画像は、QLabel などの別のウィジェットに表示することができます:

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

ボリュームの透明度の調整

スライスだけを見ていても、ボリュームの内部構造を十分に把握できない場合があります。QCustom3DVolume には、ボリュームの透明度を調整するために使用できる 2 つのプロパティが用意されています:

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.