美文网首页OpenGL
OpenGL 分屏效果实现

OpenGL 分屏效果实现

作者: MonKey_Money | 来源:发表于2020-08-12 14:28 被阅读0次

分屏效果的实现就是通过改变纹理坐标对应关系。

二分屏

testDiagram.png
precision highp float;
uniform sampler2D Texture;
varying vec2 TextureCoordsVarying;

void main (void) {

    vec2 temp = TextureCoordsVarying.xy;
    float x;
    if (temp.x > 0.0 && temp.x < 0.5) {
        x = temp.x + 0.25;
    } else {
        x = temp.x - 0.25;
    }
    vec4 mask = texture2D(Texture, vec2(x,temp.y));
    gl_FragColor = vec4(mask.rgb, 1.0);
}
image.png

三分屏

image.png

把整个图片沿竖分三份,保留中间的1/3到2/3。让中间的分别填充上1/3和下面2/3到1.

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

void main (void) {

    vec2 temp = TextureCoordsVarying.xy;
    float x = temp.x;
    if (temp.x > 0.0 && temp.x < 1.0/3.0) {
        x = temp.x + 1.0/3.0;
    } else if(temp.x > 2.0/3.0){
        x = temp.x - 1.0/3.0;
    }
    vec4 mask = texture2D(Texture, vec2(x,temp.y));
    gl_FragColor = vec4(mask.rgb, 1.0);

四分屏

image.png
precision highp float;
uniform sampler2D Texture;
varying vec2 TextureCoordsVarying;

void main (void) {

    vec2 temp = TextureCoordsVarying.xy;
    float x = temp.x;
    float y = temp.y;
    if (temp.y > 0.0 && temp.y < 1.0/2.0) {
        y *=2.0 ;
    } else if(temp.y > 1.0/2.0){
        y = (y - 1.0/2.0)*2.0;
    }
    if (temp.x > 0.0 && temp.x < 1.0/2.0) {
          x *=2.0 ;
      } else if(temp.x > 1.0/2.0){
          x = (x - 1.0/2.0)*2.0;
      }
    vec4 mask = texture2D(Texture, vec2(x,y));
    gl_FragColor = vec4(mask.rgb, 1.0);
}

左下角s纹理坐标[0,0.5] t纹理坐标范围是[0,0.5]
因为左下角显示整个纹理,整个纹理坐标范围为[0,1],所以s和t都乘以2
如果纹理范围[0.5,1],先减去0.5,再乘以2.

六分屏

image.png

s坐标通过减去1/3的倍数,让s坐标的取值范围定位到[0,1/3],然后乘以3
t坐标通过减去1/2倍数,让t坐标的取值范围定位到[0,1/2],然后乘以2

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

void main (void) {

    vec2 temp = TextureCoordsVarying.xy;
    float x = temp.x;
    float y = temp.y;
    if (temp.y > 0.0 && temp.y < 1.0/2.0) {
        y *=2.0 ;
    } else if(temp.y > 1.0/2.0){
        y = (y - 1.0/2.0)*2.0;
    }
    if (temp.x > 0.0 && temp.x < 1.0/3.0) {
          x *=3.0 ;
    } else if(temp.x > 1.0/3.0 && temp.x < 2.0/3.0){
          x = (x - 1.0/3.0)*3.0;
    } else {
        x = (x - 2.0/3.0)*3.0;

    }
    vec4 mask = texture2D(Texture, vec2(x,y));
    gl_FragColor = vec4(mask.rgb, 1.0);
}

九分屏

image.png

s.t坐标通过减去1/3倍数,让t坐标的取值范围定位到[0,1/3],然后乘以3

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

void main (void) {

    vec2 temp = TextureCoordsVarying.xy;
    float x = temp.x;
    float y = temp.y;
    
   if (temp.y > 0.0 && temp.y < 1.0/3.0) {
             y *=3.0 ;
    } else if(temp.y > 1.0/3.0 && temp.y < 2.0/3.0){
        y = (y - 1.0/3.0)*3.0;
    } else{
          y = (y - 2.0/3.0)*3.0;

    }
    
    if (temp.x > 0.0 && temp.x < 1.0/3.0) {
          x *=3.0 ;
    } else if(temp.x > 1.0/3.0 && temp.x < 2.0/3.0){
          x = (x - 1.0/3.0)*3.0;
    } else {
        x = (x - 2.0/3.0)*3.0;

    }
    vec4 mask = texture2D(Texture, vec2(x,y));
    gl_FragColor = vec4(mask.rgb, 1.0);
}

相关文章

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

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

  • OpenGL 分屏效果实现

    分屏效果的实现就是通过改变纹理坐标对应关系。 二分屏 三分屏 把整个图片沿竖分三份,保留中间的1/3到2/3。让中...

  • OpenGL ES 如何实现分屏滤镜效果

    要想实现分屏滤镜效果,首先我们需要知道如何使用OpenGL ES GLSL加载一张图片,然后在片元控制器中处理加载...

  • vim之分屏使用

    分屏 左右分屏 在普通模式下,输入: 也可以上下分屏: 实现左右分屏,效果如下: 控制左右分屏大小 在普通模式下,...

  • 2020-06-06GLSurfaceView+openGL播放

    OpenGL ES/SDL渲染,FFmpeg ;VR分屏之OpenGL-OpenGL ES来播放视频.MediaP...

  • OpenGL ES 案例:分屏滤镜

    本案例最终实现的效果图如下(包括正常无分屏/2/3/4/6/9分屏) 实现一个正常无分屏的滤镜 需要使用 GLSL...

  • iOS OpenGL ES 图片分屏效果

    原图 二分屏效果 分析由二分屏效果图所示,二分屏截取的是纹理坐标中y轴0.25到0.75之间的图像,将中间的图像截...

  • OpenGL ES的滤镜效果 -- 分屏

    首先,我们看效果, 分屏的原理就是 。 iOS端代码 准备工作可以看之前的代码,GLSL绘制金字塔--纹理和颜色的...

  • 利用OpenGL ES在iPhone应用中实现分屏的滤镜效果

    实现的分屏效果如下 二分屏实现思路 从上面的动图中我们可以看到,二分屏滤镜展示的都是图中红色框出的区域(这个区域也...

  • 案例05:球的自转

    OpenGL + OpenGL ES +Metal 系列文章汇总 利用OpenGL中定时器,实现球体自转的效果,效...

网友评论

    本文标题:OpenGL 分屏效果实现

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