渲染到纹理OpenGL ES 2.0

我正在尝试使用硬件优化的2D库来缩放(非插值缩放)进出图像。 现在我是

  • 加载原始图像
  • 制作原始图像的副本
  • 使用2D库“放大”到副本中
  • 使用glTexImage2D从图像生成纹理
  • 将它们应用于我绘制的矩形
  • 我无法上传图像(但),但是这里有一个截图的链接。 http://img.photobucket.com/albums/v336/prankstar008/zoom.png

    我想放大和缩小每帧图像的右侧,而不是每次使用glTexImage2D来杀死我的表现,我想渲染到纹理。 我的问题是

  • 这是渲染到纹理的有效应用程序吗? 为了说明起见,2D库采用指向充满原始RGB(A)数据的缓冲区的指针,并在应用2D操作时返回指向新数据的指针。
  • 我认为我的大部分困惑都与纹理如何与着色器相互作用有关。 有人可以解释在GLES2中将纹理应用于曲面的最简单方法吗? 我显然有一些工作,如果有必要,我可以发布代码片段。
  • 同样为了澄清,尽管我不确定它是否重要,但这是在Android上运行的。
  • 谢谢。


    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

    上一篇: Render to Texture OpenGL ES 2.0

    下一篇: OpenGL FrameBuffer Objects weird behavior