を使用して、QMLアイテムに単純なアルファマスクを適用しようとしていますShaderEffectItem
。
最小限の(機能しない)例を次に示します。背景として赤から白へのグラデーションがあり、その上に緑の200x200の正方形を描画したいと思います。この正方形のアルファマスクは、左側の境界で0.0、右側の境界で1.0である必要があるため、左側の境界で透明である必要があります。
import QtQuick 1.1
import Qt.labs.shaders 1.0
Rectangle {
width: 300
height: 300
id: wrapper
gradient: Gradient {
GradientStop { position: 0.0; color: "red" }
GradientStop { position: 1.0; color: "white" }
}
Rectangle {
id: square
anchors.centerIn: parent
width: 200
height: 200
color: "green"
}
ShaderEffectItem {
anchors.centerIn: parent
width: 200
height: 200
property variant source: ShaderEffectSource {
sourceItem: square
hideSource: true
}
fragmentShader: "
varying vec2 qt_TexCoord0;
uniform sampler2D source;
void main(void)
{
vec4 sourceColor = texture2D(source, qt_TexCoord0);
float alpha = qt_TexCoord0.x; // = 0.0 at left, 1.0 at right border
sourceColor.a *= alpha; // apply alpha mask
gl_FragColor = sourceColor;
}
"
}
}
私は次の出力を期待していました(GIMPで描画):
しかし、これは実際に示されています:
私は何が間違っているのですか?
シェーダー効果を有効にするために、qmlviewer (Qt 4.8.2)を使用してオプション付きのQMLファイルを表示しています。-opengl
おそらくこれは、数週間前に見つけたQGLFramebufferObjectsでのアルファブレンディングのこの奇妙な動作に関連しています...