QRhiTexture Class

テクスチャリソース。詳細...

Header: #include <rhi/qrhi.h>
CMake: find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::GuiPrivate)
qmake: QT += gui-private
Since: Qt 6.6
Inherits: QRhiResource

パブリックタイプ

struct NativeTexture
(since 6.8) struct ViewFormat
enum Flag { RenderTarget, CubeMap, MipMapped, sRGB, UsedAsTransferSource, …, OneDimensional }
flags Flags
enum Format { UnknownFormat, RGBA8, BGRA8, R8, RG8, …, ASTC_12x12 }

パブリック関数

int arrayRangeLength() const
int arrayRangeStart() const
int arraySize() const
virtual bool create() = 0
virtual bool createFrom(QRhiTexture::NativeTexture src)
int depth() const
QRhiTexture::Flags flags() const
QRhiTexture::Format format() const
virtual QRhiTexture::NativeTexture nativeTexture()
QSize pixelSize() const
(since 6.8) QRhiTexture::ViewFormat readViewFormat() const
int sampleCount() const
void setArrayRange(int startIndex, int count)
void setArraySize(int arraySize)
void setDepth(int depth)
void setFlags(QRhiTexture::Flags f)
void setFormat(QRhiTexture::Format fmt)
virtual void setNativeLayout(int layout)
void setPixelSize(const QSize &sz)
(since 6.8) void setReadViewFormat(const QRhiTexture::ViewFormat &fmt)
void setSampleCount(int s)
(since 6.8) void setWriteViewFormat(const QRhiTexture::ViewFormat &fmt)
(since 6.8) QRhiTexture::ViewFormat writeViewFormat() const

再実装されたパブリック関数

virtual QRhiResource::Type resourceType() const override

詳細説明

QRhiTexture はVkImageMTLTexture のようなネイティブテクスチャオブジェクトをカプセル化します。

QRhiTextureインスタンスは常にthe QRhi's newTexture() function 。これにより、ネイティブ・グラフィックス・リソースは作成されません。そのためには、フォーマットやサイズなどの適切なオプションを設定した後にcreate() を呼び出しますが、ほとんどの場合、これらはnewTexture() に渡された引数に基づいてすでに設定されています。

flags を正しく設定することが重要です。そうしないと、基盤となるQRhi バックエンドやグラフィック API によって、さまざまなエラーが発生する可能性があります。たとえば、テクスチャがQRhiTextureRenderTarget を介してレンダーパスからレンダリングされる場合、テクスチャはRenderTarget フラグが設定された状態で作成されなければなりません。同様に、テクスチャがread back になる場合は、UsedAsTransferSource フラグを前もって設定する必要があります。ミップマップされたテクスチャにはMipMapped フラグが設定されていなければなりません。などです。create() が成功すると、フラグを変更することはできません。既存のテクスチャを解放し、変更した設定で新しいネイティブテクスチャオブジェクトを作成するには、セッターを呼び出し、create() を再度呼び出します。この場合、潜在的に高価な操作になる可能性があります。

使用例

サイズ512x512ピクセルの2Dテクスチャを作成し、その内容をすべて緑色に設定する:

QRhiTexture *texture = rhi->newTexture(QRhiTexture::RGBA8, QSize(512, 512));
if (!texture->create()) { error(); }
QRhiResourceUpdateBatch *batch = rhi->nextResourceUpdateBatch();
QImage image(512, 512, QImage::Format_RGBA8888);
image.fill(Qt::green);
batch->uploadTexture(texture, image);
// ...
commandBuffer->resourceUpdate(batch); // or, alternatively, pass 'batch' to a beginPass() call

一般的なパターン

create() の呼び出しは、create() が以前に正常に呼び出された場合、既存のネイティブ・リソースをすべて破壊します。これらのネイティブリソースが飛行中のフレームでまだ使用されている(つまり、GPUによってまだ読み込まれている可能性がある)場合、これらのリソースの破棄は自動的に延期されます。したがって、すでに存在するテクスチャのサイズを安全に変更するための非常に一般的で便利なパターンは、次のとおりです。なぜなら、texture オブジェクト自体を破棄しないことで、それへのすべての参照が他のデータ構造(たとえば、QRhiTextureが参照されるQShaderResourceBinding)で有効なままだからです。

// determine newSize, e.g. based on the swapchain's output size or other factors
if (texture->pixelSize() != newSize) {
    texture->setPixelSize(newSize);
    if (!texture->create()) { error(); }
}
// continue using texture, fill it with new data

注意: これは互換性が限定的に保証されたRHI APIです。詳細はQRhi を参照してください。

QRhiResourceUpdateBatchQRhiQRhiTextureRenderTargetも参照してください

メンバ型ドキュメント

enum QRhiTexture::Flag
flags QRhiTexture::Flags

テクスチャがどのように使用されるかを指定するフラグ値。create() の前に設定されたフラグに従わず、前もって宣言されていない方法でテクスチャを使用しようとすると、バックエンドや基礎となるグラフィックスAPIによっては、仕様外の動作やパフォーマンスの低下につながる可能性があります。

定数説明
QRhiTexture::RenderTarget1 << 0QRhiTextureRenderTarget と組み合わせて使用するテクスチャ。
QRhiTexture::CubeMap1 << 2テクスチャはキューブマップです。このようなテクスチャには6つのレイヤーがあり、+X、-X、+Y、-Y、+Z、-Zの順番で各面に1つずつあります。キューブマップテクスチャはマルチサンプルにできません。
QRhiTexture::MipMapped1 << 3テクスチャにはミップマップがあります。適切なミップカウントは自動的に計算され、QRhi::mipLevelsForSize() で取得することもできます。ミップレベルのイメージは、アップロードされたテクスチャで提供されるか、QRhiResourceUpdateBatch::generateMips() 経由で生成される必要があります。マルチサンプルテクスチャはミップマップを持つことができません。
QRhiTexture::sRGB1 << 4sRGB フォーマットを使用してください。
QRhiTexture::UsedAsTransferSource1 << 5テクスチャはテクスチャコピーまたはリードバックのソースとして使用されます。つまり、テクスチャはQRhiResourceUpdateBatch::copyTexture() またはQRhiResourceUpdateBatch::readBackTexture() でソースとして与えられます。
QRhiTexture::UsedWithGenerateMips1 << 6テクスチャをQRhiResourceUpdateBatch::generateMips() で使用する。
QRhiTexture::UsedWithLoadStore1 << 7テクスチャは、例えば、コンピュートシェーダにおいて、イメージのロード/ストア操作で使用されます。
QRhiTexture::UsedAsCompressedAtlas1 << 8テクスチャは圧縮されたフォーマットを持っており、サブリソースのアップロードの寸法はテクスチャサイズと一致しない可能性があります。
QRhiTexture::ExternalOES1 << 9テクスチャはOpenGLでGL_TEXTURE_EXTERNAL_OESターゲットを使用する必要があります。このフラグは他のグラフィックスAPIでは無視されます。
QRhiTexture::ThreeDimensional1 << 10テクスチャは3Dテクスチャです。このようなテクスチャは、幅と高さに加えて深さを取るQRhi::newTexture() オーバーロードで作成する必要があります。3Dテクスチャはミップマップを持つことができますが、マルチサンプルにすることはできません。3Dテクスチャにレンダリングするとき、または3Dテクスチャにデータをアップロードするとき、レンダーターゲットのカラーアタッチメントまたはアップロード記述で指定されたlayer 、範囲[0..depth-1]の単一のスライスを参照します。基礎となるグラフィックス API は、実行時に 3D テクスチャをサポートしない場合があります。サポートはQRhi::ThreeDimensionalTextures 機能で示されます。
QRhiTexture::TextureRectangleGL1 << 11テクスチャはOpenGLでGL_TEXTURE_RECTANGLEターゲットを使用する必要があります。このフラグは他のグラフィックスAPIでは無視されます。ExternalOESと同様に、このフラグは、プラットフォームから受信したネイティブOpenGLテクスチャオブジェクトがQRhiTexture 、プラットフォームが非2Dテクスチャターゲット用のテクスチャしか提供できないプラットフォームAPIで動作するときに便利です。
QRhiTexture::TextureArray1 << 12テクスチャはテクスチャ配列、つまり2Dテクスチャの均質な配列である1つのテクスチャオブジェクトです。テクスチャ配列はQRhi::newTextureArray() で作成されます。基礎となるグラフィックスAPIは、実行時にテクスチャ配列オブジェクトをサポートしていない場合があります。サポートはQRhi::TextureArrays 機能で示されます。テクスチャ配列にレンダリングするとき、またはテクスチャ配列にデータをアップロードするとき、レンダーターゲットのカラーアタッチメントまたはアップロード記述で指定されたlayer は、配列内の単一の要素を選択します。
QRhiTexture::OneDimensional1 << 13テクスチャは1Dテクスチャです。このようなテクスチャは、QRhi::newTexture() に 0 の高さと深さを渡すことで作成できます。1次元テクスチャには、基盤となるグラフィックスAPIによって制限がある場合があることに注意してください。例えば、1次元テクスチャへのレンダリングやミップマップベースのフィルタリングでの使用はサポートされていない場合があります。これはQRhi::OneDimensionalTexturesQRhi::OneDimensionalTextureMipmaps 機能フラグで示されます。

Flags 型はQFlags<Flag> の typedef です。Flag値のORの組み合わせを格納します。

enum QRhiTexture::Format

テクスチャ・フォーマットを指定します。QRhi::isTextureFormatSupported() も参照してください。また、QRhiTexture::sRGB が設定されている場合、flags() がフォーマットを変更できることに注意してください。

定数説明
QRhiTexture::UnknownFormat0有効なフォーマットではありません。これはsetFormat() には渡せない。
QRhiTexture::RGBA814成分、符号なし正規化8ビット。常にサポートされる。
QRhiTexture::BGRA824 コンポーネント、各コンポーネントにつき符号なし正規化 8 ビット。
QRhiTexture::R831コンポーネント、符号なし正規化8ビット。
QRhiTexture::RG842コンポーネント、符号なし正規化8ビット。
QRhiTexture::R1651コンポーネント、符号なし正規化16ビット。
QRhiTexture::RG1662成分、符号なし正規化16ビット。
QRhiTexture::RED_OR_ALPHA87R8と同じか、RedOrAlpha8IsRed に応じて成分がアルファ値にスウィズルされた同様のフォーマット。
QRhiTexture::RGBA16F84成分、1成分あたり16ビット浮動小数点。
QRhiTexture::RGBA32F94成分、1成分あたり32ビットfloat。
QRhiTexture::R16F101コンポーネント、16-bit float。
QRhiTexture::R32F111コンポーネント、32ビットfloat。
QRhiTexture::RGB10A2124成分、符号なし正規化10ビットR、G、B、2ビットアルファ。これはパックされたフォーマットなので、ネイティブのエンディアンが適用されます。BGR10A2がないことに注意。これは、RGB10A2がD3DのDXGI_FORMAT_R10G10B10A2_UNORM、MetalのMTLPixelFormatRGB10A2Unorm、VulkanのVK_FORMAT_A2B10G10R10_UNORM_PACK32、OpenGL(ES)のGL_RGB10_A2/GL_RGB/GL_UNSIGNED_INT_2_10_10_REVにマッピングされるためです。これは普遍的にサポートされている唯一のRGB30オプションです。対応するQImage フォーマットはQImage::Format_BGR30QImage::Format_A2BGR30_Premultiplied です。
QRhiTexture::D161316 ビット深度(正規化符号なし整数)
QRhiTexture::D241424 ビット深度(正規化符号なし整数)
QRhiTexture::D24S81524 ビ ッ ト 深度 (正規化 さ れた符号なし整数)、 8 ビ ッ ト ス テ ン シル
QRhiTexture::D32F1632ビット深度(32ビット浮動小数点)
QRhiTexture::BC117
QRhiTexture::BC218
QRhiTexture::BC319
QRhiTexture::BC420
QRhiTexture::BC521
QRhiTexture::BC6H22
QRhiTexture::BC723
QRhiTexture::ETC2_RGB824
QRhiTexture::ETC2_RGB8A125
QRhiTexture::ETC2_RGBA826
QRhiTexture::ASTC_4x427
QRhiTexture::ASTC_5x428
QRhiTexture::ASTC_5x529
QRhiTexture::ASTC_6x530
QRhiTexture::ASTC_6x631
QRhiTexture::ASTC_8x532
QRhiTexture::ASTC_8x633
QRhiTexture::ASTC_8x834
QRhiTexture::ASTC_10x535
QRhiTexture::ASTC_10x636
QRhiTexture::ASTC_10x837
QRhiTexture::ASTC_10x1038
QRhiTexture::ASTC_12x1039
QRhiTexture::ASTC_12x1240

メンバ関数ドキュメント

int QRhiTexture::arrayRangeLength() const

setArrayRange() がコールされたときに露出していた配列範囲のサイズを返す。

setArrayRange()も参照

int QRhiTexture::arrayRangeStart() const

setArrayRange() がコールされたときの最初の配列レイヤを返す。

setArrayRange()も参照してください

int QRhiTexture::arraySize() const

テクスチャ配列のサイズを返します。

setArraySize() も参照して ください。

[pure virtual] bool QRhiTexture::create()

対応するネイティブ・グラフィックス・リソースを作成します。対応するdestroy() がない以前の create() によって既にリソースが存在する場合は、destroy() が最初に暗黙的に呼び出されます。

成功した場合はtrue を返し、グラフィックス操作に失敗した場合はfalse を返す。返り値に関係なく、destroy() を呼び出すと常に安全である。

[virtual] bool QRhiTexture::createFrom(QRhiTexture::NativeTexture src)

create() と似ていますが、新しいネイティブ・テクスチャは作成されません。代わりに、src で指定されたネイティブテクスチャリソースが使用されます。

これにより、外部のグラフィックスエンジンから既存のネイティブテクスチャオブジェクト(グラフィックス API によっては、同じデバイスまたは共有コンテキストに属している必要があります)をインポートすることができます。

指定された既存のネイティブテクスチャオブジェクトが正常に非所有QRhiTexture としてラップされた場合、true を返します。

注意: format(),pixelSize(),sampleCount(),flags() は正しく設定されている必要があります。正しくないサイズやその他の値をQRhi::newTexture() に渡し、その後に createFrom() を実行することで、ネイティブのテクスチャ・オブジェクトだけでそのような値を推測できると期待するのは誤りであり、問題につながります。

注意: QRhiTexture はテクスチャオブジェクトの所有権を取りません。destroy() はオブジェクトや関連メモリを解放しません。

この操作の逆で、QRhiTexture で作成されたネイティブのテクスチャオブジェクトを外国のエンジンに公開することは、nativeTexture() で可能です。

注意: 3Dテクスチャ、テクスチャ配列オブジェクト、またはOpenGL ESで外部テクスチャをインポートする場合、この関数を呼び出す前に、setFlags() を使用して対応するフラグ (ThreeDimensional,TextureArray,ExternalOES) を設定することが特に重要です。

int QRhiTexture::depth() const

3D テクスチャの深度を返します。

setDepth()も参照してください

QRhiTexture::Flags QRhiTexture::flags() const

テクスチャフラグを返します。

setFlags()も参照して ください。

QRhiTexture::Format QRhiTexture::format() const

テクスチャフォーマットを返します。

setFormat() も参照して ください。

[virtual] QRhiTexture::NativeTexture QRhiTexture::nativeTexture()

このテクスチャの基礎となるネイティブリソースを返します。基盤となるネイティブリソースの公開がバックエンドでサポートされていない場合、返される値は空になります。

createFrom()も参照して ください。

QSize QRhiTexture::pixelSize() const

サイズをピクセル単位で返します。

setPixelSize() も参照して ください。

[since 6.8] QRhiTexture::ViewFormat QRhiTexture::readViewFormat() const

テクスチャをサンプリングするときに使用したビューフォーマットを返します。呼び出されない場合、ビューフォーマットはformat() と同じであると見なされます。

この関数は Qt 6.8 で導入されました。

setReadViewFormat()も参照してください

[override virtual] QRhiResource::Type QRhiTexture::resourceType() const

再インプリメントです:QRhiResource::resourceType() const.

リソースタイプを返します。

int QRhiTexture::sampleCount() const

サンプル数を返します。1 は、マルチサンプルアンチエイリアスを行わないことを意味します。

setSampleCount()も参照してください

void QRhiTexture::setArrayRange(int startIndex, int count)

通常、すべての配列レイヤが公開され、sampler2DArray をサンプリングするときにtexture() GLSL 関数に渡される 3 番目の座標を介してレイヤを選択するのはシェーダ次第です。QRhi::TextureArrayRange がサポートされていると報告された場合、create() またはcreateFrom() の前に setArrayRange() を呼び出すと、指定された範囲、startIndex から始まるcount 要素のみを選択するように要求されます。 シェーダロジックは、このことを念頭に置いて記述することができます。

QRhi::TextureArrayRangeも参照してください

void QRhiTexture::setArraySize(int arraySize)

テクスチャを設定するarraySize

arraySize()も参照して ください。

void QRhiTexture::setDepth(int depth)

3D テクスチャのdepth を設定します。

depth() も参照して ください。

void QRhiTexture::setFlags(QRhiTexture::Flags f)

テクスチャフラグをf に設定します。

flags() も参照して ください。

void QRhiTexture::setFormat(QRhiTexture::Format fmt)

要求されたテクスチャフォーマットをfmt に設定します。

注意: 設定された値は、次にcreate() を呼び出すとき、つまり基礎となるグラフィック・リソースが (再) 作成されるときにのみ考慮されます。そうでない場合、新しい値を設定しても無駄であり、一貫性のない状態になる可能性があるため、避けなければならない。

format()も参照

[virtual] void QRhiTexture::setNativeLayout(int layout)

VulkanのようないくつかのグラフィックスAPIでは、グラフィックスAPIを直接使用するカスタムレンダリングコードの統合は、画像レイアウトに関しては特別な注意が必要です。この関数を使用すると、ネイティブレンダリングコマンドの後に、QRhiTexture をバッキングする画像が予想されるlayout を伝えることができます。

たとえば、QRhiCommandBuffer::beginExternal() とQRhiCommandBuffer::endExternal() で囲まれたコードブロックで、QRhiTexture's VkImage に直接 Vulkan でレンダリングし、その後、QRhi-based render pass でテクスチャサンプリングのために画像を使用することを考えます。潜在的に不正確なイメージレイアウトの遷移を避けるために、この関数は、前記コードブロックに記録されたコマンドが完了すると、イメージレイアウトがどうなるかを示すために使用できます。

この関数を呼び出すのは、QRhiCommandBuffer::endExternal ()の後と、それに続くQRhiCommandBuffer::beginPass ()の前だけです。

この関数は、基礎となるグラフィックスAPIが画像レイアウトの概念を公開しないQRhi バックエンドでは効果がありません。

注: Vulkan の場合、layoutVkImageLayout です。 Direct 3D 12 の場合、layoutD3D12_RESOURCE_STATES からのビットで構成される値です。

void QRhiTexture::setPixelSize(const QSize &sz)

ピクセル単位で指定されたテクスチャサイズをsz に設定します。

注意: 設定された値は、次にcreate() を呼び出すとき、つまり基礎となるグラフィックリソースが(再)作成されるときにのみ考慮されます。そうでない場合、新しい値を設定しても無駄であり、一貫性のない状態になる可能性があるため、避けなければなりません。他のすべてのセッターも同様です。

pixelSize()も参照してください

[since 6.8] void QRhiTexture::setReadViewFormat(const QRhiTexture::ViewFormat &fmt)

シェーダリソースビューフォーマット(またはテクスチャをサンプリングするために使用されるビューのフォーマット)をfmt に設定します。デフォルトでは、テクスチャそのものと同じフォーマット(およびsRGB-ness)が使用され、ほとんどの場合、この関数を呼び出す必要はありません。

この設定は、TextureViewFormat機能がサポートされていると報告された場合にのみ考慮されます。

注意: この機能は、シェーダが暗黙のsRGB変換を実行するかしないかを読み取るために、non-sRGBとsRGB間の「キャスト」を可能にするために提供されています。他のタイプのキャストは機能する場合としない場合があります。

この関数は Qt 6.8 で導入されました。

readViewFormat()も参照してください

void QRhiTexture::setSampleCount(int s)

サンプルカウントをs に設定します。

sampleCount() も参照して ください。

[since 6.8] void QRhiTexture::setWriteViewFormat(const QRhiTexture::ViewFormat &fmt)

レンダーターゲットのビューフォーマットをfmt に設定します。 デフォルトでは、テクスチャと同じフォーマット(および sRGB-ness)が使用されるため、ほとんどの場合、この関数を呼び出す必要はありません。

書き込みビューフォーマットを提供するための1つの一般的なユースケースは、私たちの制御の範囲外で、VulkanやDirect 3Dのような3D APIでsRGBフォーマットを使用する外部提供のテクスチャを扱うことですが、レンダリングエンジンは、そのシェーディングパイプラインの最後に線形化とsRGBへの変換を処理するようにすでに準備されています。この場合、このようなテクスチャにレンダリングするときに必要なのは、同じ、しかし非sRGBフォーマットを持つレンダーターゲットビュー(VkImageViewなど)です。(例えば、OpenXRの実装からVK_FORMAT_R8G8B8A8_SRGBテクスチャを取得した場合、レンダリングエンジンのパイプラインが要求するものであれば、VK_FORMAT_R8G8B8A8_UNORMビューを使用してレンダリングする必要があります。この例では、フォーマットがQRhiTexture::RGBA8srgbfalse に設定されたViewFormat を使用してこの関数を呼び出します。)

この設定は、TextureViewFormat 機能がサポートされていると報告された場合にのみ考慮されます。

注意: この機能は、シェーダが暗黙の sRGB 変換を実行しない、または実行するように、non-sRGB と sRGB 間の「キャスト」を可能にするために提供されています。他のタイプのキャストは機能する場合としない場合があります。

この関数は Qt 6.8 で導入されました。

writeViewFormat()も参照してください

[since 6.8] QRhiTexture::ViewFormat QRhiTexture::writeViewFormat() const

テクスチャに書き込むときや、画像のロード/ストアで使用するときに使用されるビューフォーマットを返します。呼び出されない場合、ビューフォーマットはformat() と同じと見なされます。

この関数は Qt 6.8 で導入されました。

setWriteViewFormat()も参照してください

©2024 The Qt Company Ltd. 本文書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。