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
これが役立つことを願っています...