abi*_*bix 9 iphone textures opengl-es ios opengl-es-2.0
当两个纹理覆盖相同的矩形时,我可以在片段着色器中混合使用不同混合模式的两个纹理.但现在我的问题是,一个纹理是一个没有旋转的普通矩形,另一个纹理是另一个具有旋转/缩放和平移的矩形.如何以我想要的方式合并这些纹理?(在图片里)
我知道怎么做......

但不知道该怎么做......

为了在一个矩形(第一个图像)中混合纹理,我使用了以下代码..
目标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];
}
Run Code Online (Sandbox Code Playgroud)
顶点着色器......
attribute vec4 position;
attribute vec4 inputTextureCoordinate;
varying vec2 textureCoordinate;
void main()
{
gl_Position = position;
textureCoordinate = inputTextureCoordinate.xy;
}
Run Code Online (Sandbox Code Playgroud)
片段着色器......
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);
}
Run Code Online (Sandbox Code Playgroud)
您必须将2个纹理坐标传递给着色器并修改着色器
添加到ObjectiveC
glVertexAttribPointer(inputTextureCoordinate2, 2, GL_FLOAT, 0, 0, textureCoordinates2);
Run Code Online (Sandbox Code Playgroud)
顶点着色器
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;
}
Run Code Online (Sandbox Code Playgroud)
Frag Shader
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);
}
Run Code Online (Sandbox Code Playgroud)
BTW inputTextureCoordinate不一定是vec4,但可能是vec2
如果在同一个图元上混合两个纹理,则可以在着色器中混合颜色。
但是,如果您想混合两种不同的原语,那么您真正想要使用的是硬件混合 (GL_BLEND)。
自己绘制底部图片,然后启用混合并绘制顶部图片。顶部图片的 alpha 值控制它的透明度。
您真的不想尝试在同一个绘制调用中绘制两个四边形,因为它们不使用相同的坐标。