如何在iPhone上的OpenGL ES 2.0中混合两种纹理与不同的坐标?

当两个纹理覆盖相同的矩形时,我可以在片段着色器中混合两种具有不同混合模式的纹理。 但现在我的问题是,一个纹理是一个没有旋转的普通矩形,另一个纹理是另一个旋转/缩放和平移的矩形。 如何以我想要的方式合并这些纹理? (图片中)

我知道如何做到这一点…

在这里输入图像说明

但不知道如何做到这一点…

在这里输入图像说明

为了在一个矩形(第一个图像)中混合纹理,我使用了下面的代码。

Objective 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); } 

你必须通过2个纹理坐标来着色和修改着色器

添加到ObjectiveC

 glVertexAttribPointer(inputTextureCoordinate2, 2, GL_FLOAT, 0, 0, textureCoordinates2); 

顶点着色器

 attribute vec4 position; attribute vec4 inputTextureCoordinate; attribute vec4 inputTextureCoordinate2; varying vec2 textureCoordinate; varying vec2 textureCoordinate2; void main() { gl_Position = position; textureCoordinate = inputTextureCoordinate.xy; textureCoordinate2 = inputTextureCoordinate2.xy; } 

碎片着色器

 varying highp vec2 textureCoordinate; varying highp vec2 textureCoordinate2; uniform sampler2D inputTextureTop; uniform sampler2D inputTextureBot; uniform highp float alphaTop; void main() { lowp vec4 pixelTop = texture2D(inputTextureTop, textureCoordinate); lowp vec4 pixelBot = texture2D(inputTextureBot, textureCoordinate2); gl_FragColor = someBlendOperation(pixelTop, pixelBot); } 

BTW inputTextureCoordinate不一定是vec4,但可以是vec2

如果在同一个图元上混合两个纹理,则可以在着色器中混合颜色。

但是如果你想混合两个不同的原语,那么你真正想要使用的是硬件混合(GL_BLEND)。

单独绘制底部图片,然后启用混合并绘制顶部图片。 顶部图片的alpha值控制着它的透明度。

你不想在同一个绘图调用中绘制两个四边形,因为它们不使用相同的坐标。