2016-05-23 12 views
0

ピクセル(カメラプレビュー)のスワップを行うアンドロイドアプリケーションを開発しようとしました。< => top swap diagramOpenGL ESのスワップピクセル

私はこの頂点シェーダを書きましたが、非常に奇妙なもの(デジタルノイズのある黒い画面)を表示します。

attribute vec4 vPosition; 
attribute vec2 inputTextureCoordinate; 
varying vec2 textureCoordinate; 
void main() 
{ 
    if (vPosition.y > 0.0) 
    { 
     gl_Position = vPosition - vec4(0.0, 1.0, 0.0, 0.0); 
    } 
    else 
    { 
     gl_Position = vPosition + vec4(0.0, 1.0, 0.0, 0.0); 
    } 
    textureCoordinate = inputTextureCoordinate; 
} 

しかし、この頂点シェーダは機能しますが、上のピクセルだけが下に移動します。

attribute vec4 vPosition; 
attribute vec2 inputTextureCoordinate; 
varying vec2 textureCoordinate; 
void main() 
{ 
    if (vPosition.y > 0.0) 
    { 
     gl_Position = vPosition - vec4(0.0, 1.0, 0.0, 0.0); 
    } 
    else 
    { 
     gl_Position = vPosition; 
    } 
    textureCoordinate = inputTextureCoordinate; 
} 

ピクセルをスワップする方法を知っていますか(私の最初の頂点シェーダを機能させる)? ありがとう

答えて

1

シェイダーを避けるperformanceが劣化することがあります。

簡単な解決策は、フラグメントシェーダーでテクスチャ座標を入れ替えることです。私はあなたのvテクスチャの座標は、カメラ画像がレンダリングされるクワッドの全体の高さに沿って0から1に向かうと仮定します。フラグメントシェーダの次のコードでは、このトリックを行う必要があります。

textureCoordinate = vec2(textureCoordinate.u, 1 - textureCoordinate.v); 

しかし、実際のテクスチャ座標のスワップは、クワッドの頂点でテクスチャ座標を定義する方法によって決まります。

+0

私はそれです。頂点の位置ではなく、テクスチャの座標を入れ替える必要があります。あなたが画面上でゴミを得る理由は、いくつかの頂点を画面から動かすためです。 –

+0

ありがとう! しかし、フラグメントシェイダーでは?スワップ後にイメージの一部を拡大する必要があるため、フラグメントシェーダでの処理を避けなければならないと思うので... 頂点シェーダですべてを行うことは可能でしょうか? – far38

+0

フラグメントまたは頂点シェーダのスワップおよびズームが可能です。入力ユニフォームを使用してズーム(min_u、max_u、min_v、max_v)を定義します。次に、頂点シェーダで、(min_u、max_v)、左上(min_u、min_v)、右上(max_u、min_v)、右下(max_u、max_v)の左下頂点テクスチャ座標を割り当てます。テクスチャの座標は変化する必要があります。この方法で両方を達成します。頂点シェーダのズームとスワップ – plastique