1) Нет, это не так.Если вы просто хотите увеличивать и уменьшать изображение (без использования библиотеки масштабирования), то рендеринг с другой текстурой будет пустой тратой времени.Вы можете увеличивать масштаб прямо в своем виде.
2) Шейдеры - это программы, которые способны вычислять и преобразовывать координаты (что обычно делается в вершинных шейдерах) и могут использовать эти координаты для чтения из текстуры (чтоможет быть сделано только во фрагментном шейдере)1009 *
Что вы можете сделать, это включить параметр масштабирования (так называемый равномерный) в вершинный шейдер:
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
Надеюсь, это поможет ...