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 は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()
対応するネイティブ・グラフィックス・リソースを作成します。対応する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 の場合、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
テクスチャに書き込むときや、画像のロード/ストアで使用するときに使用されるビューフォーマットを返します。呼び出されない場合、ビューフォーマットは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.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。