相关文章推荐
怕老婆的钱包  ·  SQL ...·  1 年前    · 
刚失恋的炒面  ·  MockK:Kotlin Mocking ...·  1 年前    · 
空虚的生姜  ·  Sqlalchemy.exc.Invalid ...·  1 年前    · 
欢乐的足球  ·  sql - IN/EXISTS ...·  1 年前    · 

三个视频源,取出三个纹理,并将这三个纹理绘制到帧缓冲区,绘制每个纹理时,修改顶点坐标。

// 绑定第一个视频纹理并渲染 
[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);
复制代码
分类:
iOS
标签: