2011-12-05 14 views
4

宣言型プログラミング言語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 
      } 
     } 
    } 

テクスチャ(画像)の性能色が徐々に完全に灰色で通過し、全ては、それが無限ループに満たされ、逆その後、後。今:

enter image description here

実際にここで何に質問:私は何とかテクスチャ(マイピクチャ画像/ image.jpg)、すなわち、任意の特定のセクションの一部のいずれかの定性の色を変更することができます。たとえば、QMLで2つの変数xColor、yColorを定義し、シェーダの説明と同様にそれを転送します。次に、テクスチャは、座標が左上隅の[xColor - 10、yColor - 10]および[ xColor + 10、yColor + 10] - 右下隅。私がしたい:

enter image description here

私はそれを実現することができることを知っています。それはより最適にどのように作るのですか?私はどの方向に考えるべきか?類似の例があるかどうか?混合色(このセクションでは赤色から灰色)を追加するといいでしょう。あなたはテクスチャをチェックする必要が矩形の

答えて

3

座標:

  1. は、入力テクスチャは、ピクセル座標に変換します

    highp VEC2 pix_coords = qt_TexCoord0.st * image_sizeでは、 //あなたの矩形の

  2. チェック境界をシェーダにimage_sizeでは、変数を渡す必要があります。

    場合((pix_coords.x> rect_bottom_left.x)& &(pix_coords.y> rect_bottom_left.y)& &( pix_coords.x < rect_top_right.x)& &(pix_coords.y < rect_top_right.y))は

    {//行う階調

    }

    { //標準のカラールックアップ }最適化のためとして

は、テクスチャ空間に四角形を変換し、非変換テクスチャ座標をチェックする方が良いだろう。

関連する問題