三个视频源,取出三个纹理,并将这三个纹理绘制到帧缓冲区,绘制每个纹理时,修改顶点坐标。
// 绑定第一个视频纹理并渲染
[self bindTexture:output1.textureID]
[self renderWithVertices:vertices textureCoords:textureCoords program:program]
// 绑定第二个视频纹理并渲染
[self bindTexture:output2.textureID]
[self renderWithVertices:vertices textureCoords:textureCoords program:program]
// 绑定第三个视频纹理并渲染
[self bindTexture:output3.textureID]
[self renderWithVertices:vertices textureCoords:textureCoords program:program]
单着色器单顶点多纹理👍🏻
三个视频源,取出三个纹理,将纹理绑定到着色器中,并通过uniform的4维向量设置每个纹理的rect[起始,宽高]
,并在片元着色器中根据rect去取纹理,着色器代码如下
void main()
vec2 uv = varyTextCoord.xy
// 纹理1铺满屏幕
// 纹理2的x、y在0.25~0.75之间
// rect的x,y,z,w分别表示起始位置x,y,宽高z,w
if (uv.x >= rect.x && uv.x <= rect.x+rect.z && uv.y >= rect.y && uv.y <= rect.y+rect.w) {
uv.x = (uv.x - rect.x) / rect.z
uv.y = (uv.y - rect.y) / rect.w
gl_FragColor = texture2D(texture4, uv)
} else {
gl_FragColor = texture2D(texture1, uv)
单个纹理多个着色器
将3个视频纹理合并成一个大的纹理,并使用多个着色器程序来处理它们。在渲染过程中,将大的纹理绑定到OpenGL ES中,并使用不同的着色器程序来处理它的不同部分。这种方案需要一些额外的处理来拼接和切割视频纹理,并且需要更多的GPU资源。
多个帧缓冲区单着色器
将3个视频纹理分别绑定到不同的FBO(帧缓冲对象)中,并使用单个着色器程序来渲染它们。在渲染过程中,将每个FBO的内容渲染到屏幕上,并使用混合模式来实现它们的重叠效果。这种方案需要更多的代码来设置和管理FBO,并且需要更多的GPU资源。
CoreVideo获取纹理
CVReturn cvResult = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,
sharedImageProcessingContext.m_coreVideoTextureCache,
imageBuffer,
**nil**,
GL_TEXTURE_2D,
internalFormat,
GLsizei(width),
GLsizei(height),
format,
GL_UNSIGNED_BYTE,
planeIndex,
&textureRef);
复制代码