美文网首页
OpenGL ES 分屏滤镜

OpenGL ES 分屏滤镜

作者: 张墩墩 | 来源:发表于2020-08-12 17:42 被阅读0次
分屏

分屏滤镜的实现(分屏算法):主要渲染区域与纹理坐标映射对应关系。
解析案例中2、3、4、6、9分屏中纹理坐标与渲染区域的对应关系。

1、二分屏

分屏坐标对应

分屏坐标对应

按照上图进行上下分屏时,

  • x值:纹理坐标的x不需要进行变化。
  • y值:变换对应到截取显示部分 [0.25,0.75]之间。
    • (0,0.5)部分对应纹理(0.25,0.75) ,y+ 0.25
    • (0.5,1)部分对应纹理(0.25,0.75) ,y- 0.25

在片元着色器中完成上图的顶点变化操作

precision highp float;//精度
uniform sampler2D Texture;//纹理
varying highp vec2 TextureCoordsVarying;//顶点着色器桥接的纹理坐标

void main() {
    vec2 uv = TextureCoordsVarying.xy;
    float y;
    if (uv.y >= 0.0 && uv.y <= 0.5) {
        y = uv.y + 0.25;
    } else {
        y = uv.y - 0.25;
    }
    gl_FragColor = texture2D(Texture, vec2(uv.x, y));
}
2、三分屏
三分屏坐标对应
  • x值:纹理坐标的x不需要进行变化。
  • y值:
    • (0,1/3)对应纹理(1/3,2/3)。y + 1/3
    • (1/3,2/3)对应纹理(1/3,2/3)。y值不变
    • (2/3,1)对应纹理(1/3,2/3)。y - 1/3

片元着色器纹理坐标处理

precision highp float;
uniform sampler2D Texture;//纹理
varying highp vec2 TextureCoordsVarying;//顶点着色器桥接纹理坐标

void main() {
    vec2 uv = TextureCoordsVarying.xy;
    if (uv.y < 1.0/3.0) {
        uv.y = uv.y + 1.0/3.0;
    } else if (uv.y > 2.0/3.0){
        uv.y = uv.y - 1.0/3.0;
    }
    gl_FragColor = texture2D(Texture, uv);
}
3、四分屏
四分屏
  • x值:
    • (0,0.5)对应纹理(0,1),x = x * 2
    • (0.5,1)对应纹理(0,1),x = (x-0.5) * 2
  • y值
    • (0,0.5)对应纹理(0,1),y = y * 2
    • (0.5,1)对应纹理(0,1),y = (y-0.5) * 2

片元着色器纹理坐标处理

precision highp float;
uniform sampler2D Texture;
varying highp vec2 TextureCoordsVarying;

void main() {
    vec2 uv = TextureCoordsVarying.xy;
    if(uv.x <= 0.5){
        uv.x = uv.x * 2.0;
    }else{
        uv.x = (uv.x - 0.5) * 2.0;
    }
    
    if (uv.y<= 0.5) {
        uv.y = uv.y * 2.0;
    }else{
        uv.y = (uv.y - 0.5) * 2.0;
    }
    gl_FragColor = texture2D(Texture, uv);
}
4、六分屏
六分屏
  • x值:
    • (0,1/3)对应纹理(1/3,2/3),x = x + 1/3
    • (1/3,2/3)对应纹理(1/3,2/3),x = x,值不变
    • (2/3,1)对应纹理(1/3,2/3),x = x - 1/3
  • y值
    • (0,0.5)对应纹理(0.25,0.75),y = y + 0.25
    • (0.5,1)对应纹理(0.25,0.75),y = y - 0.25

片元着色器纹理坐标处理

precision highp float;
uniform sampler2D Texture;
varying highp vec2 TextureCoordsVarying;

void main() {
    vec2 uv = TextureCoordsVarying.xy;
   
    if(uv.x <= 1.0 / 3.0){
        uv.x = uv.x + 1.0/3.0;
    }else if(uv.x >= 2.0/3.0){
        uv.x = uv.x - 1.0/3.0;
    }
    if(uv.y <= 0.5){
        uv.y = uv.y + 0.25;
    }else {
        uv.y = uv.y - 0.25;
    }
    gl_FragColor = texture2D(Texture, uv);
}
5、九分屏
九分屏
  • x值:
    • (0,1/3)对应纹理(0,1),x = x * 3
    • (1/3,2/3)对应纹理(0,1),x = (x - 1/3) * 3
    • (2/3,1)对应纹理(0,1),x = (x - 2/3) * 3
  • y值
    • (0,1/3)对应纹理(0,1),y = y * 3
    • (1/3,2/3)对应纹理(0,1),y = (y - 1/3) * 3
    • (2/3,1)对应纹理(0,1),y = (y - 2/3) * 3

片元着色器纹理坐标处理

precision highp float;
uniform sampler2D Texture;
varying highp vec2 TextureCoordsVarying;

void main() {
    vec2 uv = TextureCoordsVarying.xy;
    if (uv.x < 1.0 / 3.0) {
        uv.x = uv.x * 3.0;
    } else if (uv.x < 2.0 / 3.0) {
        uv.x = (uv.x - 1.0 / 3.0) * 3.0;
    } else {
        uv.x = (uv.x - 2.0 / 3.0) * 3.0;
    }
    if (uv.y <= 1.0 / 3.0) {
        uv.y = uv.y * 3.0;
    } else if (uv.y < 2.0 / 3.0) {
        uv.y = (uv.y - 1.0 / 3.0) * 3.0;
    } else {
        uv.y = (uv.y - 2.0 / 3.0) * 3.0;
    }
    gl_FragColor = texture2D(Texture, uv);
}

案例demo

相关文章

  • OpenGL ES动效滤镜:缩放、灵魂出窍、抖动、闪白、毛刺、幻

    原图如下: 这篇博客是在OpenGL ES滤镜:分屏滤镜和OpenGL ES滤镜:灰度、颠倒、马赛克的基础上进行讲...

  • OpenGL ES之滤镜处理(2)_灰度滤镜与马赛克滤镜

    上文 OpenGL ES之滤镜处理(1)_分屏滤镜 - 简书讲述了分屏滤镜的处理,本文介绍灰度滤镜与马赛克滤镜的处...

  • OpenGL ES案例-实现分屏滤镜

    分屏滤镜在现在的短视频中十分常见,今天我们就使用OpenGL ES来实现分屏滤镜的效果。 一、实现结果 二、分屏原...

  • OpenGL ES滤镜:分屏滤镜

    9分屏效果如下所示: 滤镜初始化 1. 初始化上下文并设置为当前上下文 2. 开辟顶点数组内存空间 3. 初始化4...

  • OpenGL ES 分屏滤镜

    想要绘制滤镜首先我们需要清楚如何绘制纹理,如果不了解的可以参考 OpenGL ES 纹理绘制。这篇文章中绘制的图片...

  • OpenGL ES 分屏滤镜

    分屏滤镜的实现(分屏算法):主要渲染区域与纹理坐标映射对应关系。解析案例中2、3、4、6、9分屏中纹理坐标与渲染区...

  • OpenGL ES 滤镜-分屏

    现在在抖音快手等平台常见的"左右分屏"的小视频是如何实现的呢?我们可以通过图片看下,分屏滤镜是如何实现的?因为这样...

  • OpenGL ES滤镜:灰度、颠倒、马赛克

    原图如下: 这篇博客是在OpenGL ES滤镜:分屏滤镜的基础上进行讲解的。其实不同滤镜效果显示就是加载编译不同的...

  • OpenGL ES分屏滤镜-静态分屏

    静态分屏是指每一个屏幕的图像都完全一样。 分屏滤镜实现原理是在片元着色器中修改纹理坐标和纹理的对应关系。分屏之后,...

  • OpenGL ES 案例:分屏滤镜

    本案例的目的是理解如何用GLSL实现分屏(2/3/4/6/9)滤镜 案例的效果图如下 准备工作 自定义着色器 完成...

网友评论

      本文标题:OpenGL ES 分屏滤镜

      本文链接:https://www.haomeiwen.com/subject/rlgedktx.html