1

ハードウェアに最適化された 2D ライブラリを使用して、画像を拡大または縮小しようとしています。今、私は

  1. 元の画像の読み込み
  2. 元の画像のコピーを作成する
  3. 2D ライブラリを使用してコピーを「ズーム」する
  4. 画像から glTexImage2D を使用してテクスチャを生成する
  5. 私が描いた長方形にそれらを適用する

(まだ)画像をアップロードできませんが、スクリーンショットへのリンクを次に示します。 http://img.photobucket.com/albums/v336/prankstar008/zoom.png

右側の画像をフレームごとに一定量ズームインおよびズームアウトし、毎回 glTexImage2D を使用してパフォーマンスを低下させるのではなく、テクスチャにレンダリングしたいと考えています。私の質問は

  1. これはテクスチャへのレンダリングの有効なアプリケーションですか? 明確にするために、2D ライブラリは未加工の RGB(A) データで満たされたバッファーへのポインターを受け取り、2D 操作が適用された新しいデータへのポインターを返します。
  2. 私の混乱のほとんどは、テクスチャがシェーダーと相互作用する方法に関係していると思います。GLES2 で表面にテクスチャを適用する最も簡単な方法を誰か説明できますか? 私は明らかに何かが機能しており、必要に応じてコードのスニペットを投稿できます。
  3. また、明確にするために、問題があるかどうかはわかりませんが、これは Android で実行されています。

ありがとうございました。

4

1 に答える 1

2

1) いいえ、違います。(ズーム ライブラリを使用せずに) 画像をズーム インおよびズーム アウトするだけの場合は、別のテクスチャにレンダリングするのは時間の無駄です。ビューを直接ズームできます。

2) シェーダーは、座標の計算と変換 (通常は頂点シェーダーで行われる) が可能で、それらの座標を使用してテクスチャから読み取ることができるプログラムです (これは、その時点でフラグメント シェーダーでのみ行うことができます)。

シェーダーは次のようになると思います。

precision mediump float;

uniform matrix4 modelviewProjectionMatrix; // input transformation matrix

attribute vec3 position;
attribute vec2 texcoord; // input coordinates of each vertex

varying vec2 _texcoord; // output coordinate for fragment shader

void main()
{
    gl_Position = modelviewProjectionMatrix * vec4(position, 1.0); // transform position
    _texcoord = texcoord; // copy texcoord
}

それは頂点シェーダーでしたが、現在はフラグメント シェーダーです。

precision mediump float;

varying vec2 _texcoord; // input coordinate from vertex shader

uniform sampler2D _sampler; // handle of a texturing unit (e.g. 0 for GL_TEXTURE0)

void main()
{
    gl_FragColor = glTexture2D(_sampler, _texcoord); // read texture
}

できることは、頂点シェーダーにズームパラメーター (いわゆる均一) を含めることです。

precision mediump float;

uniform float zoom; // zoom
uniform matrix4 modelviewProjectionMatrix; // input transformation matrix

attribute vec3 position;
attribute vec2 texcoord; // input coordinates of each vertex

varying vec2 _texcoord; // output coordinate for fragment shader

void main()
{
    gl_Position = modelviewProjectionMatrix * vec4(position, 1.0); // transform position
    _texcoord = (texcoord - .5) * zoom + .5; // zoom texcoord
}

フラグメント シェーダーに変更はありません。これは、異なる座標を計算するだけであり、それがいかに簡単かです。ズームを設定するには、次のことが必要です。

int zoomLocation = glGetUniformLocation(yourProgram, "zoom");
// this is done in init, where you call glGetUniformLocation(yourProgram, "modelviewProjectionMatrix")
// also, zoomLocation is not local variable, it needs to be stored somewhere to be used later when drawing

glUniform1f(zoomLocation, 1 + .5f * (float)Math.sin(System.nanotime() * 1e-8f));
// this will set zoom that will animatically zoom in and out of the texture (must be called after glUseProgram(yourProgram))

これにより、両方のテクスチャがズームインおよびズームアウトします。これを修正するには (適切なテクスチャだけをズームしたいだけだと思います)、次のことを行う必要があります。

// draw the second quad

glUniform1f(zoomLocation, 1);
// this will set no zoom (1:1 scale)

// draw the first quad

これが役立つことを願っています...

于 2012-01-20T10:27:43.927 に答える