如何在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值控制着它的透明度。
你不想在同一个绘图调用中绘制两个四边形,因为它们不使用相同的坐标。