2012-03-02 12 views
1

カバーフローに使用されているものと同様のイメージを反映するシェーダを作成したいと思います。GLSL Shader - Coverflow 2Dオブジェクトのリフレクション

// Vertex Shader 
uniform highp mat4 u_modelViewMatrix; 
uniform highp mat4 u_projectionMatrix; 
attribute highp vec4 a_position; 
attribute lowp vec4 a_color; 
attribute highp vec2 a_texcoord; 
varying lowp vec4 v_color; 
varying highp vec2 v_texCoord; 
mat4 rot = mat4(-1.0, 0.0, 0.0, 0.0, 
        0.0, -1.0, 0.0, 0.0, 
        0.0, 0.0, 1.0, 0.0, 
        0.0, 0.0, 0.0, 1.0); 
void main() 
{ 
    gl_Position = (u_projectionMatrix * u_modelViewMatrix) * a_position * rot; 
    v_color = a_color; 
    v_texCoord = a_texcoord; 
} 

// Fragment Shader 
varying highp vec2 v_texCoord; 
uniform sampler2D u_texture0; 
uniform int slices; 
void main() 
{ 
    lowp vec3 w = vec3(1.0,1.0,1.0); 
    lowp vec3 b = vec3(0.0,0.0,0.0); 
    lowp vec3 mix = mix(b, w, (v_texCoord.y-(float(slices)/10.0))); 
    gl_FragColor = texture2D(u_texture0,v_texCoord) * vec4(mix, 1.0); 
} 

しかし、このシェーダは以下を作成します current result そして私はイメージが水平およびI(私もそう呼ばれるを使用しようとした回転行列で非常に多くの異なるパラメータを試してみましたどのように「フリップ」に知りません"ミラーマトリックス")しかし、私は元の画像の底に画像を反映する方法を知らない。

答えて

2

「カバーフロー」の結果としてimages.google.comが返すものについては、回転行列はまったく必要ありません。

void main() 
{ 
    gl_Position = (u_projectionMatrix * u_modelViewMatrix) * a_position; 
    v_color = a_color; 
    v_texCoord = vec2(a_texcoord.x, 1.0 - a_texcoord.y); 
} 

単純に反転してください。

マトリックスを使用することを主張し、「ミラー」シェーダ(オブジェクトを取り込み、反射を行うために「フロア」の下に置くシェーダ)を作成する場合、ミラーマトリックスが必要です(調整するのを忘れないでくださいフロントフェイス/バックフェースカリング):

mat4(1.0, 0.0, 0.0, 0.0, 
    0.0, -1.0, 0.0, 0.0, 
    0.0, 0.0, 1.0, 0.0, 
    0.0, 0.0, 0.0, 1.0); 

フロアがどこにあるかを知っている必要があります。

gl_Position = (u_projectionMatrix * u_modelViewMatrix) * (a_position * mirrorMatrix - floor); 

また、床の平行移動を同じマトリックスに置くこともできます。基本的に、任意の高さに対して鏡映するには、3つの変換(擬似コード)を組み合わせる必要があります。

translate(0, -floorHeight, 0) * scale(1, -1, 1) * translate(0, floorHeight, 0)

あなたのマトリックスに入れてください。

また、modelView行列を「モデル」(オブジェクト/ワールド)と「ビュー」行列に分割することも意味があります。このように、これらのような変換を実行する方が簡単になります。

+0

ありがとうございます!今私は透明なグラデーションを作る方法を理解しなければならないので、黒だけでなく黒をフェードアウトすることもできます:) Y軸上に画像を移動させる簡単な方法はありますか? – seveves

関連する問題