渲染到纹理OpenGL ES 2.0
我正在尝试使用硬件优化的2D库来缩放(非插值缩放)进出图像。 现在我是
我无法上传图像(但),但是这里有一个截图的链接。 http://img.photobucket.com/albums/v336/prankstar008/zoom.png
我想放大和缩小每帧图像的右侧,而不是每次使用glTexImage2D来杀死我的表现,我想渲染到纹理。 我的问题是
谢谢。
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
}
你可以做的是在顶点着色器中包含一个缩放参数(所谓的uniform):
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
我希望这有帮助 ...
链接地址: http://www.djcxy.com/p/34051.html