1

カバーフローに使用されるものと同様の画像の反射を作成するシェーダーを作成したいと考えています。

// 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);
}

しかし、このシェーダーは以下を作成してい ます:元の画像の下部に画像を反映する方法を知っています。

4

1 に答える 1

2

「coverflow」の結果に対して 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 マトリックスを「モデル」(オブジェクト/ワールド) と「ビュー」マトリックスに分割することも理にかなっています。こうすることで、このような変換を実行しやすくなります。

于 2012-03-02T14:33:39.117 に答える