3

を使用して、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でのアルファブレンディングのこの奇妙な動作に関連しています...

4

1 に答える 1

7

フラグメントシェーダーのメイン関数を次のように変更してみてください。

    void main(void)
    {
        gl_FragColor = texture2D(source, qt_TexCoord0).rgba*qt_TexCoord0.x;
    }
于 2012-11-02T08:46:02.503 に答える