QRhiTexture Class
テクスチャリソース。もっと見る
ヘッダー | #include <rhi/qrhi.h> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::GuiPrivate) |
qmake: | QT += gui-private |
以来: | Qt 6.6 |
継承: | 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 はVkImage
やMTLTexture
のようなネイティブテクスチャオブジェクトをカプセル化します。
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 を参照してください。
QRhiResourceUpdateBatch 、QRhi 、QRhiTextureRenderTargetも参照してください 。
メンバ型ドキュメント
enum QRhiTexture::Flag
flags QRhiTexture::Flags
テクスチャがどのように使用されるかを指定するフラグ値。create() の前に設定されたフラグに従わず、前もって宣言されていない方法でテクスチャを使用しようとすると、バックエンドや基礎となるグラフィックスAPIによっては、仕様外の動作やパフォーマンスの低下につながる可能性があります。
定数 | 値 | 説明 |
---|---|---|
QRhiTexture::RenderTarget | 1 << 0 | QRhiTextureRenderTarget と組み合わせて使用するテクスチャ。 |
QRhiTexture::CubeMap | 1 << 2 | テクスチャはキューブマップです。このようなテクスチャには6つのレイヤーがあり、+X、-X、+Y、-Y、+Z、-Zの順番で各面に1つずつあります。キューブマップテクスチャはマルチサンプルにできません。 |
QRhiTexture::MipMapped | 1 << 3 | テクスチャにはミップマップがあります。適切なミップカウントは自動的に計算され、QRhi::mipLevelsForSize() で取得することもできます。ミップレベルのイメージは、アップロードされたテクスチャで提供されるか、QRhiResourceUpdateBatch::generateMips() 経由で生成される必要があります。マルチサンプルテクスチャはミップマップを持つことができません。 |
QRhiTexture::sRGB | 1 << 4 | sRGB フォーマットを使用してください。 |
QRhiTexture::UsedAsTransferSource | 1 << 5 | テクスチャはテクスチャコピーまたはリードバックのソースとして使用されます。つまり、テクスチャはQRhiResourceUpdateBatch::copyTexture() またはQRhiResourceUpdateBatch::readBackTexture() でソースとして与えられます。 |
QRhiTexture::UsedWithGenerateMips | 1 << 6 | テクスチャをQRhiResourceUpdateBatch::generateMips() で使用する。 |
QRhiTexture::UsedWithLoadStore | 1 << 7 | テクスチャは、例えば、コンピュートシェーダにおいて、イメージのロード/ストア操作で使用されます。 |
QRhiTexture::UsedAsCompressedAtlas | 1 << 8 | テクスチャは圧縮されたフォーマットを持っており、サブリソースのアップロードの寸法はテクスチャサイズと一致しない可能性があります。 |
QRhiTexture::ExternalOES | 1 << 9 | テクスチャはOpenGLでGL_TEXTURE_EXTERNAL_OESターゲットを使用する必要があります。このフラグは他のグラフィックスAPIでは無視されます。 |
QRhiTexture::ThreeDimensional | 1 << 10 | テクスチャは3Dテクスチャです。このようなテクスチャは、幅と高さに加えて深さを取るQRhi::newTexture() オーバーロードで作成する必要があります。3Dテクスチャはミップマップを持つことができますが、マルチサンプルにすることはできません。3Dテクスチャにレンダリングするとき、または3Dテクスチャにデータをアップロードするとき、レンダーターゲットのカラーアタッチメントまたはアップロード記述で指定されたlayer 、範囲[0..depth-1]の単一のスライスを参照します。基礎となるグラフィックス API は、実行時に 3D テクスチャをサポートしない場合があります。サポートはQRhi::ThreeDimensionalTextures 機能で示されます。 |
QRhiTexture::TextureRectangleGL | 1 << 11 | テクスチャはOpenGLでGL_TEXTURE_RECTANGLEターゲットを使用する必要があります。このフラグは他のグラフィックスAPIでは無視されます。ExternalOESと同様に、このフラグは、プラットフォームから受信したネイティブOpenGLテクスチャオブジェクトがQRhiTexture 、プラットフォームが非2Dテクスチャターゲット用のテクスチャしか提供できないプラットフォームAPIで動作するときに便利です。 |
QRhiTexture::TextureArray | 1 << 12 | テクスチャはテクスチャ配列、つまり2Dテクスチャの均質な配列である1つのテクスチャオブジェクトです。テクスチャ配列はQRhi::newTextureArray() で作成されます。基礎となるグラフィックスAPIは、実行時にテクスチャ配列オブジェクトをサポートしていない場合があります。サポートはQRhi::TextureArrays 機能で示されます。テクスチャ配列にレンダリングするとき、またはテクスチャ配列にデータをアップロードするとき、レンダーターゲットのカラーアタッチメントまたはアップロード記述で指定されたlayer は、配列内の単一の要素を選択します。 |
QRhiTexture::OneDimensional | 1 << 13 | テクスチャは1Dテクスチャです。このようなテクスチャは、QRhi::newTexture() に 0 の高さと深さを渡すことで作成できます。1次元テクスチャには、基盤となるグラフィックスAPIによって制限がある場合があることに注意してください。例えば、1次元テクスチャへのレンダリングやミップマップベースのフィルタリングでの使用はサポートされていない場合があります。これはQRhi::OneDimensionalTextures とQRhi::OneDimensionalTextureMipmaps 機能フラグで示されます。 |
Flags 型はQFlags<Flag> の typedef です。これはFlag値のORの組み合わせを格納します。
enum QRhiTexture::Format
テクスチャフォーマットを指定します。QRhi::isTextureFormatSupported() も参照してください。また、QRhiTexture::sRGB が設定されている場合、flags() はフォーマットを変更できることに注意してください。
定数 | 値 | 説明 |
---|---|---|
QRhiTexture::UnknownFormat | 0 | 有効なフォーマットではありません。これはsetFormat() には渡せない。 |
QRhiTexture::RGBA8 | 1 | 4成分、符号なし正規化8ビット。常にサポートされる。 |
QRhiTexture::BGRA8 | 2 | 4 コンポーネント、各コンポーネントにつき符号なし正規化 8 ビット。 |
QRhiTexture::R8 | 3 | 1コンポーネント、符号なし正規化8ビット。 |
QRhiTexture::RG8 | 4 | 2コンポーネント、符号なし正規化8ビット。 |
QRhiTexture::R16 | 5 | 1コンポーネント、符号なし正規化16ビット。 |
QRhiTexture::RG16 | 6 | 2成分、符号なし正規化16ビット。 |
QRhiTexture::RED_OR_ALPHA8 | 7 | R8と同じか、RedOrAlpha8IsRed に応じて成分がアルファ値にスウィズルされた同様のフォーマット。 |
QRhiTexture::RGBA16F | 8 | 4成分、1成分あたり16ビット浮動小数点。 |
QRhiTexture::RGBA32F | 9 | 4成分、1成分あたり32ビットfloat。 |
QRhiTexture::R16F | 10 | 1コンポーネント、16-bit float。 |
QRhiTexture::R32F | 11 | 1コンポーネント、32ビットfloat。 |
QRhiTexture::RGB10A2 | 12 | 4成分、符号なし正規化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_BGR30 とQImage::Format_A2BGR30_Premultiplied です。 |
QRhiTexture::D16 | 13 | 16 ビット深度(正規化符号なし整数) |
QRhiTexture::D24 | 14 | 24 ビット深度(正規化符号なし整数) |
QRhiTexture::D24S8 | 15 | 24 ビ ッ ト 深度 (正規化 さ れた符号なし整数)、 8 ビ ッ ト ス テ ン シル |
QRhiTexture::D32F | 16 | 32ビット深度(32ビット浮動小数点) |
QRhiTexture::BC1 | 17 | |
QRhiTexture::BC2 | 18 | |
QRhiTexture::BC3 | 19 | |
QRhiTexture::BC4 | 20 | |
QRhiTexture::BC5 | 21 | |
QRhiTexture::BC6H | 22 | |
QRhiTexture::BC7 | 23 | |
QRhiTexture::ETC2_RGB8 | 24 | |
QRhiTexture::ETC2_RGB8A1 | 25 | |
QRhiTexture::ETC2_RGBA8 | 26 | |
QRhiTexture::ASTC_4x4 | 27 | |
QRhiTexture::ASTC_5x4 | 28 | |
QRhiTexture::ASTC_5x5 | 29 | |
QRhiTexture::ASTC_6x5 | 30 | |
QRhiTexture::ASTC_6x6 | 31 | |
QRhiTexture::ASTC_8x5 | 32 | |
QRhiTexture::ASTC_8x6 | 33 | |
QRhiTexture::ASTC_8x8 | 34 | |
QRhiTexture::ASTC_10x5 | 35 | |
QRhiTexture::ASTC_10x6 | 36 | |
QRhiTexture::ASTC_10x8 | 37 | |
QRhiTexture::ASTC_10x10 | 38 | |
QRhiTexture::ASTC_12x10 | 39 | |
QRhiTexture::ASTC_12x12 | 40 |
メンバ関数ドキュメント
int QRhiTexture::arrayRangeLength() const
setArrayRange() がコールされたときに公開されていた配列範囲のサイズを返す。
setArrayRange()も参照 。
int QRhiTexture::arrayRangeStart() const
setArrayRange() がコールされたときの最初の配列レイヤーを返す。
setArrayRange()も参照 。
int QRhiTexture::arraySize() const
テクスチャ配列のサイズを返します。
setArraySize()も参照してください 。
[pure virtual]
bool QRhiTexture::create()
対応するネイティブ・グラフィックス・リソースを作成する。以前の create() で対応するdestroy() がなかったためにすでにリソースが存在する場合は、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 ()の前だけです。
この関数は、基礎となる Graphical API が画像レイアウトの概念を公開しないQRhi バックエンドでは効果がありません。
注: Vulkanの場合、layout はVkImageLayout
です。 Direct 3D 12の場合、layout はD3D12_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::RGBA8 、srgb
がfalse
に設定されたViewFormat を使用してこの関数を呼び出します。)
この設定は、TextureViewFormat 機能がサポートされていると報告された場合にのみ考慮されます。
注意: この機能は、シェーダが暗黙の sRGB 変換を実行しない、または実行するように、non-sRGB と sRGB 間の「キャスト」を可能にするために提供されています。他のタイプのキャストは機能する場合としない場合があります。
この関数は Qt 6.8 で導入されました。
writeViewFormat()も参照してください 。
[since 6.8]
QRhiTexture::ViewFormat QRhiTexture::writeViewFormat() const
テクスチャに書き込むとき、および image load/store で使用するときに使用されるビューフォーマットを返します。呼び出されない場合、ビューフォーマットはformat() と同じと見なされます。
この関数は Qt 6.8 で導入されました。
setWriteViewFormat()も参照してください 。
© 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.