1

我是 OpenGL ES 2.0 的新手,我已经阅读了这篇关于如何将 2 个纹理混合到最终帧缓冲区结果中的帖子。如何在 iPhone 上的 OpenGL ES 2.0 中混合具有不同坐标的两个纹理?

我目前的要求有点不同。

我想混合名为 inputTextureTop(Varying) 的纹理和纹理 inputTextureBot(constant) 并将结果保存到纹理 inputTextureTop 中。

它应该足够简单。如何修改线程中的示例代码来尝试?

目标C代码...

    - (void) display {
        [EAGLContext setCurrentContext:context];

        glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);

        glUseProgram(program);

        glActiveTexture(GL_TEXTURE2);
        glBindTexture(GL_TEXTURE_2D, textureTop);

        glActiveTexture(GL_TEXTURE3);
        glBindTexture(GL_TEXTURE_2D, textureBot);

        glUniform1i(inputTextureTop, 2);
        glUniform1i(inputTextureBot, 3);

        glUniform1f(alphaTop, alpha);

        glEnable (GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

        glVertexAttribPointer(position, 2, GL_FLOAT, 0, 0, imageVertices);
        glVertexAttribPointer(inputTextureCoordinate, 2, GL_FLOAT, 0, 0, textureCoordinates);

        glClearColor(0.0, 0.0, 0.0, 0.0);
        glClear(GL_COLOR_BUFFER_BIT);

        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

        glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer);
        [context presentRenderbuffer:GL_RENDERBUFFER];
    }

顶点着色器代码:

    attribute vec4 position;
    attribute vec4 inputTextureCoordinate;

    varying vec2 textureCoordinate;

    void main()
    {
        gl_Position = position;
        textureCoordinate = inputTextureCoordinate.xy;
    }

片段着色器...

    varying highp vec2 textureCoordinate;

    uniform sampler2D inputTextureTop;
    uniform sampler2D inputTextureBot;

    uniform highp float alphaTop;

    void main()
    {
        lowp vec4 pixelTop = texture2D(inputTextureTop, textureCoordinate);
        lowp vec4 pixelBot = texture2D(inputTextureBot, textureCoordinate);

        gl_FragColor = someBlendOperation(pixelTop, pixelBot);
    }

非常感谢!

问候,

霍华德

======================== 8月22日更新。

经过一番调查,我发现这是一条死路。没有办法合成纹理(顶部)+纹理(底部)并更改为纹理(顶部)。

但是,有一种方法可以合成纹理(顶部)+纹理(底部)并将其保存到纹理(目标)。

这样做的方法是将目标纹理绑定到纹理顶部和纹理底部使用的相同帧缓冲区。

添加下面的代码将完成这项工作:

      glActiveTexture(GL_TEXTURE0); 
      bindTexture(textureTarget); 
      glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureTarget, 0);

结果将存储在 textureTarget 中。

答对了。

4

1 回答 1

1

渲染到纹理更复杂,因为您必须使用 FBO。这可以通过 OpenGL ES 2.0 或 1.1(带有扩展)来完成。这篇文章详细解释:

http://processors.wiki.ti.com/index.php/Render_to_Texture_with_OpenGL_ES

此外,有关在着色器代码中组合 2 个纹理的示例,请参见我的答案:

OpenGL ES 2:使用额外的纹理单元将此图像与当前图像混合

于 2013-08-14T23:27:20.197 回答