【问题标题】:OpenGL-ES 2.0 blend 2 textures and save the result into a original textureOpenGL-ES 2.0 混合 2 个纹理并将结果保存到原始纹理中
【发布时间】:2013-08-23 06:57:48
【问题描述】:

我是 OpenGL ES 2.0 的新手,我已经阅读了这篇关于如何将 2 个纹理混合到最终帧缓冲区结果中的帖子。 How do I blend two textures with different co-ordinates in OpenGL ES 2.0 on iPhone?

我目前的要求有点不同。

我想混合名为 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中。

宾果游戏。

【问题讨论】:

    标签: opengl-es-2.0 alphablending


    【解决方案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 : use an additional texture unit to blend this image with the current one

    【讨论】:

    • 经过一番调查,我发现这是一条死路。没有办法合成纹理(顶部)+纹理(底部)并更改为纹理(顶部)。但是,有一种方法可以合成纹理(顶部)+纹理(底部)并将其保存到纹理(目标)。这样做的方法是将目标纹理绑定到纹理顶部和纹理底部使用的相同帧缓冲区。添加下面的代码将完成这项工作: glActiveTexture(GL_TEXTURE0);绑定纹理(纹理目标); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureTarget, 0);
    • 有人可以解禁我的帐户吗?我在问题中发布了答案。不知何故,我的帐户被禁止了。请做。 B/c 这是一个有效的答案,我解决了问题。
    猜你喜欢
    • 2011-05-19
    • 2015-11-30
    • 2012-04-08
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    相关资源
    最近更新 更多