宣言型プログラミング言語QMLを使用すると、要素、そのプロパティをシェーダプログラム記述の汎用変数と接続できます。これらの目的のために、例えば、ShaderEffectItemのような要素が存在する。ここでは、たとえば、特定の画像image.jpg
を定義します。また、source
プロパティでは、このイメージが画像内で変更され、さらにこのプロパティがフラグメントシェーダプログラムの説明fragmentShaderでuniform sampler2Dソースとして既に設定されていることを設定しました。 qt_TexCoord0
は、テクスチャの初期座標を定義します。すべてのテクスチャスカラー積に灰色を与えます。lowp float gray = dot(textureColor、vec4(0.299,0.587,0.114,0.0));また、出力変数gl_FragColorにフラグメントの色をインストールします。シェーダを使用してテクスチャの一部の色を変更する
....
Item {
id: main
Image {
id: img
source: "images/image.jpg"
}
ShaderEffectItem {
id: effect
property real ratio: 1.0
property variant source: ShaderEffectSource {
sourceItem: img;
hideSource: true
}
fragmentShader:
"
varying highp vec2 qt_TexCoord0;
uniform sampler2D source;
uniform highp float ratio;
void main(void)
{
lowp vec4 textureColor = texture2D(source, qt_TexCoord0.st);
lowp float gray = dot(textureColor, vec4(0.299, 0.587, 0.114, 0.0));
gl_FragColor = vec4(gray * ratio + textureColor.r * (1.0 - ratio), gray * ratio + textureColor.g * (1.0 - ratio), gray * ratio + textureColor.b * (1.0 - ratio), textureColor.a);
}
"
}
SequentialAnimation on ratio {
id: ratioAnimation
running: true
loops: Animation.Infinite
NumberAnimation {
easing.type: Easing.Linear
to: 0.0
duration: 500
}
PauseAnimation {
duration: 500
}
NumberAnimation {
easing.type: Easing.Linear
to: 1.0
duration: 500
}
PauseAnimation {
duration: 500
}
}
}
テクスチャ(画像)の性能色が徐々に完全に灰色で通過し、全ては、それが無限ループに満たされ、逆その後、後。今:
実際にここで何に質問:私は何とかテクスチャ(マイピクチャ画像/ image.jpg)、すなわち、任意の特定のセクションの一部のいずれかの定性の色を変更することができます。たとえば、QMLで2つの変数xColor、yColorを定義し、シェーダの説明と同様にそれを転送します。次に、テクスチャは、座標が左上隅の[xColor - 10、yColor - 10]および[ xColor + 10、yColor + 10] - 右下隅。私がしたい:
私はそれを実現することができることを知っています。それはより最適にどのように作るのですか?私はどの方向に考えるべきか?類似の例があるかどうか?混合色(このセクションでは赤色から灰色)を追加するといいでしょう。あなたはテクスチャをチェックする必要が矩形の