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
Надеюсь, это поможет ...
person
the swine
schedule
20.01.2012