QCanvasCustomBrush Class
QCanvasCustomBrush は、カスタムシェーダーを備えたブラシです。詳細...
| ヘッダー: | #include <QCanvasCustomBrush> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS CanvasPainter) target_link_libraries(mytarget PRIVATE Qt6::CanvasPainter) |
| 以下より: | Qt 6.11 |
| ステータス: | テクノロジープレビュー |
このクラスはテクノロジープレビュー段階にあり、変更される可能性があります。
パブリック関数
| QCanvasCustomBrush() | |
| QCanvasCustomBrush(QCanvasCustomBrush &&) | |
| ~QCanvasCustomBrush() | |
| bool | isAnimationRunning() const |
| void | setAnimationRunning(bool running) |
| void | setData1(const QVector4D &data) |
| void | setData2(const QVector4D &data) |
| void | setData3(const QVector4D &data) |
| void | setData4(const QVector4D &data) |
| void | setFragmentShader(const QShader &fragmentShader) |
| void | setFragmentShader(const QString &fragmentShader) |
| void | setVertexShader(const QShader &vertexShader) |
| void | setVertexShader(const QString &vertexShader) |
| operator QVariant() const |
関連する非メンバー
| bool | operator!=(const QCanvasCustomBrush &lhs, const QCanvasCustomBrush &rhs) |
| QDataStream & | operator<<(QDataStream &stream, const QCanvasCustomBrush &brush) |
| bool | operator==(const QCanvasCustomBrush &lhs, const QCanvasCustomBrush &rhs) |
| QDataStream & | operator>>(QDataStream &stream, QCanvasCustomBrush &brush) |
詳細な説明
QCanvasCustomBrush は、カスタム頂点シェーダーおよび/またはフラグメントシェーダーを持つストローク/塗りつぶしブラシです。
これらのシェーダーは、Qt Quick ShaderEffect のシェーダーと同様に、Vulkan スタイルの GLSL で記述されることが想定されています。これらは常に、"customfrag.glsl" または"customvert.glsl" を含むQC_INCLUDE ステートメントを含まなければなりません。これにより、ユニフォームブロック、画像およびフォントテクスチャ、およびいくつかのヘルパー関数が利用可能になります。
iTime は、組み込みのuniformブロックで一般的に使用されるメンバーの一例です。true を指定してsetAnimationRunning()を呼び出すと、この値は毎フレーム自動的に更新され、アニメーションコンテンツの駆動に使用できます。
組み込みシェーダーの入力、ユニフォーム、およびヘルパー関数
QC_INCLUDE ステートメントは、標準のプリプロセッサ指令ではありません。これは、シェーダーが通常のシェーダーコンパイルパイプラインに渡される前のビルド時に、qt_add_custom_brush_shaders() によって処理されます。 このステートメントは、シェーダーの入力と出力、テクスチャサンプラー、共有ユニフォームブロック、およびフラグメントシェーダーの場合は一連のヘルパー関数を宣言する GLSL ソースコードのブロックに置き換えられます。頂点シェーダーでは `"customvert.glsl" ` を、フラグメントシェーダーでは `"customfrag.glsl" ` を使用してください。
つまり、カスタムブラシシェーダーは、これらの入力、出力、サンプラー、またはユニフォームを自ら宣言する必要はなく、これらはすべて `QC_INCLUDE ` ステートメントによって利用可能になります。
頂点シェーダーのインターフェース
"customvert.glsl" を含む頂点シェーダーでは、以下の入力および出力が宣言されます。
in vec2 vertex- キャンバス座標系における頂点の位置。in vec2 tcoord- 頂点に関連付けられたテクスチャ座標。out vec2 texCoord- フラグメントシェーダーに転送されます。通常は `tcoord` に設定されます。out vec2 fragCoord- フラグメントシェーダーに渡されます。通常は `vertex` に設定されます。
注:これらの 変数は、QC_INCLUDE ディレクティブを介して暗黙的に利用可能です。頂点シェーダーのコード内では、これらを明示的に宣言してはなりません。
さらに、以下の変換に関連するユニフォームが利用可能です:
vec4 viewRect- ビューポートの矩形((x, y, width, height))。int ndcIsYDown- 一部のグラフィックスAPIの場合のように、正規化されたデバイス座標系のY軸が下向きになっているときは、0以外になります。gl_Positionを計算する際は、この点を考慮してください。mat3 vertMatrix- 現在の変換行列。
頂点シェーダーは `gl_Position` を書き込む必要があり、`texCoord ` および `fragCoord ` をフラグメントステージに転送することが期待されます。
注:カスタム 頂点シェーダーはあまり一般的ではありません。ほとんどのカスタムブラシでは、デフォルトの組み込み頂点シェーダーと、アプリケーション側で提供されるカスタムフラグメントシェーダーを組み合わせて使用することが想定されています。
典型的な頂点シェーダーは次のようになります:
#version 440
QC_INCLUDE "customvert.glsl"
void main()
{
texCoord = tcoord;
fragCoord = vertex;
vec2 v = (vertMatrix * vec3(vertex, 1.0)).xy;
if (ndcIsYDown != 0)
gl_Position = vec4(2.0 * (v.x + viewRect.x) / viewRect.z - 1.0,
-1.0 + 2.0 * (v.y + viewRect.y) / viewRect.w, 0.0, 1.0);
else
gl_Position = vec4(2.0 * (v.x + viewRect.x) / viewRect.z - 1.0,
1.0 - 2.0 * (v.y + viewRect.y) / viewRect.w, 0.0, 1.0);
}フラグメントシェーダーインターフェース
"customfrag.glsl" を含むフラグメントシェーダーでは、以下の入力と出力が宣言されます。
in vec2 texCoord- 補間されたテクスチャ座標。in vec2 fragCoord- ジオメトリと同じ座標系における、補間されたフラグメント位置。通常、プロシージャルエフェクトの生成に使用されます。out vec4 fragColor- 結果としてのフラグメントカラー。シェーダーはこれを書き込む必要があります。期待される出力は、プリマルチプライドアルファを使用します。
注:これらの変数は 、QC_INCLUDE ディレクティブを通じて暗黙的に利用可能です。フラグメントシェーダーのコード内では、これらを明示的に宣言してはなりません。
利用可能なテクスチャサンプラーは2つあります:
sampler2D tex- 画像テクスチャ。sampler2D fontTex- フォントテクスチャ。グリフの符号付き距離フィールドを保持しています。ブラシを使用してテキストを塗りつぶす場合に適用されます。
また、便利定数TAU (2 * piに等しい)およびSQRT2 も定義されています。
共通のユニフォーム
QC_INCLUDE を使用する頂点シェーダーとフラグメントシェーダーの両方が、共有ユニフォームブロックにアクセスできます。最も一般的に使用されるメンバーは以下の通りです:
float iTime-isAnimationRunning() がtrueである間、毎フレーム更新される秒単位の時間値。アニメーションの駆動に使用します。setAnimationRunning() を参照してください。vec4 data1,vec4 data2,vec4 data3,vec4 data4- シェーダーに公開されるカスタムデータ。これらはC++からsetData1()、setData2()、setData3()、およびsetData4()を介して設定します。float globalAlpha- ペインターの現在のグローバル不透明度。フラグメントシェーダーでは通常、fragColorにこの値を乗算する必要があります。vec4 colorEffects- 有効なカラーエフェクトのパラメータ。通常は、直接アクセスするのではなく、applyColorEffects() を通じて適用されます。float fontAlphaMin,float fontAlphaMax- グリフのアンチエイリアシングを行う際に使用される、符号付き距離フィールドの閾値。
フラグメントシェーダーのヘルパー関数
フラグメントシェーダーのインクルードには、以下のヘルパー関数が用意されています:
float clipMask()- 現在のフラグメントに対するクリップ(シザー)カバレッジを [0, 1] の範囲で返します。fragColorにこの値を乗算することで、ペインターのクリッピングを反映させることができます。float antialiasingAlpha()- `texCoord` から導出されたアンチエイリアシングカバレッジを [0, 1] の範囲で返します。アンチエイリアシングされたエッジを得るには、`fragColor` にこの値を乗算してください。float sdfFontAlphaRaw()- アンチエイリアシングを適用せずに、fontTexからtexCoordの位置でサンプリングされた生の符号付き距離フィールド値を返します。必要に応じて、smoothstep()を手動で適用してください。float sdfFontAlpha()-fontTexからtexCoordでサンプリングされたグリフのアルファ値を返します。この値には、fontAlphaMinおよびfontAlphaMaxに基づいてデフォルトのアンチエイリアシングが適用されています。void applyColorEffects(inout vec4 color)- アクティブなコントラスト、明るさ、彩度エフェクトをcolorにその場で適用します。
一般的なフラグメントシェーダーでは、fragColor を計算し、これにglobalAlpha を乗算します。必要に応じて、クリッピングやアンチエイリアシングに対応するためにclipMask() およびantialiasingAlpha() を乗算し、最後に applyColorEffects() を呼び出します。
テキストが関与する場合は、sdfFontAlpha() も考慮に入れる必要があります。例えば:
#version 440
QC_INCLUDE "customfrag.glsl"
void main()
{
float a = 0.6 + 0.2 * sin(0.1 * fragCoord.x + 4.0 * iTime);
vec4 color = vec4(a, a, a, 1.0);
fragColor = sdfFontAlpha() * globalAlpha * color;
applyColorEffects(fragColor);
}プロジェクトへのシェーダーの追加
QCanvasCustomBrushで使用されるシェーダーは、Qt Canvas Painterパッケージが提供するqt_add_custom_brush_shadersCMake関数を介して、必ずアプリケーションプロジェクトに追加する必要があります。この関数は、ビルド時に追加の前処理を実行した後、内部で標準のqt_add_shaders() を呼び出します。
例:
qt_add_custom_brush_shaders(app "app_custombrush_shaders"
PREFIX
"/shaders"
FILES
brush1.frag
)ブラシの使用
実行時には、生成された.qsb ファイルを次のように使用できます:
QCanvasCustomBrush customBrush(":/shaders/brush1.frag.qsb"));
customBrush.setAnimationRunning(true); // iTime updates automatically
// expose custom data to the shader in data1
customBrush.setData1(QVector4D(1.0, 2.0, 3.0, 4.0));その後、QCanvasCustomBrushを塗りつぶしなどで次のように使用できます:
painter->setFillStyle(customBrush);Shader Tools CMake関数の詳細については `qt_add_custom_brush_shaders`を参照し、Qtでのクロスプラットフォームシェーダーコードの扱いについては、Qt XML-ph-0000@deepl.internalモジュールのドキュメントを参照してください。
注: カスタムブラシ用のシェーダーには 、必ず `QC_INCLUDE ` ステートメントを含める必要があり、CMake関数 `qt_add_custom_brush_shaders` を通じてプロジェクトに追加する必要があります。`qt_add_shaders()` はカスタムブラシのシェーダーには適していません。
注:qt_add_custom_brush_shaders は 、シェーダーコードを以下のターゲットに変換します:GLSL300 es 、150 、130 、HLSL5.0 、および MSL1.2 。現時点では、これに関する追加の設定機能は提供されていません。
qt_add_custom_brush_shadersおよびQt Canvas Painter - ギャラリーの例も参照してください 。
メンバ関数のドキュメント
QCanvasCustomBrush::QCanvasCustomBrush()
デフォルトのカスタムブラシを作成します。
[constexpr noexcept default] QCanvasCustomBrush::QCanvasCustomBrush(QCanvasCustomBrush &&)
QCanvasCustomBrush のインスタンスをMoveコンストラクタで生成します。
[noexcept] QCanvasCustomBrush::~QCanvasCustomBrush()
カスタムブラシを削除します。
bool QCanvasCustomBrush::isAnimationRunning() const
時間が進行している場合、true を返します。
void QCanvasCustomBrush::setAnimationRunning(bool running)
実行時間を「running 」に設定します。これが true の場合、シェーダーのユニフォーム `iTime ` が自動的に更新され、シェーダー内で現在のアニメーションの実行時間を取得するために使用できます。
デフォルト値は `false` です。
isAnimationRunning()も参照してください 。
void QCanvasCustomBrush::setData1(const QVector4D &data)
data1の均一値をdata に設定します。これにより、シェーダーにカスタムデータを設定できるようになります。
void QCanvasCustomBrush::setData2(const QVector4D &data)
data2の均一値をdata に設定します。これにより、シェーダーにカスタムデータを設定できるようになります。
void QCanvasCustomBrush::setData3(const QVector4D &data)
data3の均一な値をdata に設定します。これにより、シェーダーにカスタムデータを設定できるようになります。
void QCanvasCustomBrush::setData4(const QVector4D &data)
data4の均一値をdata に設定します。これにより、シェーダーにカスタムデータを設定できるようになります。
void QCanvasCustomBrush::setFragmentShader(const QShader &fragmentShader)
fragmentShader を使用するカスタムブラシを設定します。
void QCanvasCustomBrush::setFragmentShader(const QString &fragmentShader)
fragmentShader を使用するカスタムブラシを設定します。これは、有効な qsb ファイルへのパスでなければなりません。このファイルは、ローカルファイルであるか、Qt リソースシステムを介してアプリケーションに埋め込まれている必要があります。
void QCanvasCustomBrush::setVertexShader(const QShader &vertexShader)
vertexShader を使用するカスタムブラシを設定します。
void QCanvasCustomBrush::setVertexShader(const QString &vertexShader)
vertexShader を使用するカスタムブラシを設定します。これは、有効な qsb ファイルへのパスでなければなりません。このファイルは、ローカルファイルであるか、Qt リソースシステムを介してアプリケーションに埋め込まれている必要があります。
QCanvasCustomBrush::operator QVariant() const
カスタムブラシをQVariant として返します。
関連する非メンバー
[noexcept] bool operator!=(const QCanvasCustomBrush &lhs, const QCanvasCustomBrush &rhs)
カスタムブラシ `lhs ` が `rhs` と異なる場合は `true ` を返し、それ以外の場合は `false ` を返します。
operator==()も参照してください 。
QDataStream &operator<<(QDataStream &stream, const QCanvasCustomBrush &brush)
指定されたbrush を指定されたstream に書き込み、stream への参照を返します。
注:この関数は 、.qsb ファイルから読み込まれたシェーダーをシリアル化するのであり、ファイル名そのものをシリアル化するわけではありません。
「Qt データ型のシリアライズ」も参照してください 。
[noexcept] bool operator==(const QCanvasCustomBrush &lhs, const QCanvasCustomBrush &rhs)
カスタムブラシ `lhs ` が `rhs` と等しい場合は `true ` を返し、そうでない場合は `false ` を返します。
operator!=()も参照してください 。
QDataStream &operator>>(QDataStream &stream, QCanvasCustomBrush &brush)
指定されたstream から指定されたbrush を読み込み、stream への参照を返します。
「Qtデータ型のシリアライズ」も参照してください 。
© 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.