PathLineを使用して一度に3つの画像を水平方向に表示しています。左右の画像は、左から50%フェード、右から50%フェードとして表示する必要があります。ここでは、親が20%透明で、背景ビデオに浮いているため、黒い長方形のグラデーションを使用してフェード効果を表示することはできません。
では、不透明度プロパティを水平フェードアニメーションとして適用する方法はありますか?
QMLShaderEffectItem
要素を使用すると、シェーダー プログラムを使用してポスト エフェクトを QML アイテムに追加できます。これにより、GPU でいくつかのグラフィック効果を実行できます。
上でリンクしたドキュメントでわかるように、これはたとえば波の効果である可能性があります。一般に、すべての出力ピクセルに小さな「プログラム」を適用します。これは、 GLSLのいわゆるフラグメント シェーダーです。
アイテムにアルファ マスクを実装する方法を理解するために (これは、アニメーション化しているパス上の画像を含むシーンである可能性があります)、次のように単純な線形グラデーションを実装する例を示します。アルファ マスク。左側は不透明度ゼロ、右側は完全な不透明度です。
import QtQuick 1.0
import Qt.labs.shaders 1.0
Item {
width: 300
height: 300
id: wrapper
Item {
id: scene
anchors.fill: parent
// Here is your scene with the images ...
}
ShaderEffectItem {
anchors.fill: wrapper
// Any property you add to the ShaderEffectItem is accessible as a
// "uniform" value in the shader program. See GLSL doc for details.
// Essentially, this is a value you pass to the fragment shader,
// which is the same for every pixel, thus its name.
// Here we add a source item (the scene) as a uniform value. Within the
// shader, we can access it as a sampler2D which is the type used to
// access pixels in a texture. So the source item becomes a texture.
property variant source: ShaderEffectSource
{
sourceItem: scene // The item you want to apply the effect to
hideSource: true // Only show the modified item, not the original
}
// This is the fragment shader code in GLSL (GL Shading Language)
fragmentShader: "
varying highp vec2 qt_TexCoord0; // The coords within the source item
uniform sampler2D source; // The source item texture
void main(void)
{
// Read the source color of the pixel
vec4 sourceColor = texture2D(source, qt_TexCoord0);
// The alpha value of the mask
float alpha = qt_TexCoord0.x; // = 0.0 at left, 1.0 at right border
// Multiply the alpha mask on the color to be drawn:
sourceColor *= alpha;
// Write the pixel to the output image
gl_FragColor = sourceColor;
}
"
}
}
シェーダー プログラムで最も重要な行は、alpha
変数の値です。この小さな例では、テクスチャ座標の X コンポーネントをアルファ値として設定しただけなので、左側の境界では 0、右側の境界では 1 です。テクスチャ座標はピクセルではなく [ 0..1] 範囲。gl_FragCoord.x
ピクセル座標にアクセスする場合は、 /を使用できますy
。y
は下から上に測定されるため、0 が下の境界線で、が上の境界線であることに注意してくださいheight
。デフォルトheight
では、結果の画像全体にアクセスすることはできませんが、ユニフォームを使用できます。新しいものを割り当てて、シェーダーproperty int h: height
で使用してアクセスするだけです。uniform float h