精华内容
下载资源
问答
  • opengles光照通道合成

    2016-08-11 11:09:04
    opengles光照通道合成
  • OpenGL + OptiX 合成示例演示了如何将交互式 OpenGL 渲染与 OptiX 叠加合成混合使用。 此特定示例演示了与 OpenGL 线框模型合成的 8 倍子采样、光线跟踪硬阴影。 阴影由 OptiX 计算,并将结果放置到代表屏幕空间...
  • 文章目录如何合成方案一方案二(HWComposer)使用OpenGL 如何合成 方案一 在Framebuffer上依次画出(使用opengl)每个app,然后把Framebuffer显示出来 方案二(HWComposer) 各个app写入不同的window,硬件合成后在...
    平台 内核版本 安卓版本
    RK3399 Linux4.4 Android7.1

    如何合成

    方案一

    在Framebuffer上依次画出(使用opengl)每个app,然后把Framebuffer显示出来

    方案二(HWComposer)

    各个app写入不同的window,硬件合成后在LCD上直接显示

    使用OpenGL

    void SurfaceFlinger::handleMessageRefresh() 
    展开全文
  • 我在用opengl着色语言,利用2D视频,深度视频和蒙版合成3D视频的时候,比如现在要填充(x,y)位置的像素,我用(x,y)这一点的深度值d和蒙版算出一个偏移量xShift,然后用x-xShift得到一个横坐标x0,再然后我就用...
  • OpenGL

    2017-08-24 19:50:42
    色彩的三原色:红色,绿色和蓝色,是我们通常所说的RGB颜色空间,在OpenGL中,我们通常会在这三个后面加上第四个,即Alpha,合成就是我们通常所说的RGBA.颜色空间的种类:RGBA,HSV(色调,饱和度,值),CM

    第一篇


    一,颜色像素和缓存
    A.基本颜色理论
    物理世界中,光是由光子所组成的,简单来说,细小的粒子沿着一条直线路径进行运动,每个粒子都有自己的色彩.

    图形学和OpenGL的关系:
    色彩的三原色:红色,绿色和蓝色,是我们通常所说的RGB颜色空间,在OpenGL中,我们通常会在这三个后面加上第四个,即Alpha,合成就是我们通常所说的RGBA.

    颜色空间的种类:RGBA,HSV(色调,饱和度,值),CMYK(靛,紫,黄,黑)
    B.颜色缓存
    颜色缓存:每个RGB分量所占用的位数,得到一个像素深度为24位的颜色缓存
    几乎所有的图形程序都有一个共同的目标,就是在屏幕上绘制图像.

    帧缓存:(屏幕)是由矩形的像素数组组成的,每个像素都可以在图像对应的点显示一小块的颜色值,经过光栅化之后,得到片元,每个片元都包含与像素位置对应的坐标数据,以及颜色和深度的存储值.

    颜色缓存:一般是屏幕分辨率的乘法结果就是像素个数,颜色缓存只是记录像素信息的多个缓存中的一个,一个像素可能会关联多个颜色缓存,也就是渲染缓存.
    C.深度缓存
    深度缓存为每个像素保存一个深度值。这里深度是物体与观察者眼睛的距离,因此深度值较大的像素会被深度值较小的像素所覆盖。深度缓存有时也叫做z缓存(z_buffer).
    D.模板缓存
    模板缓存来限制屏幕特定区域的绘制,模板缓存经典用途就是模拟汽车的后视镜视角.

    二.颜色与OpenGL
    A.颜色的表达与OpenGL
    OpenGL内部是如何使用颜色值的,OpenGL内部会使用浮点数来表示一个颜色分量,并且负责维护它的精度,直到保存数据到帧缓存为止。
    B.顶点颜色
    颜色数据也必须保存在顶点缓存对象中
    C.光栅化
    OpenGL的管线中,顶点着色阶段(顶点,细分和几何着色)以及片元着色阶段之间的过程被称为光栅化。它的主要职责是判断屏幕空间的哪个部分被几何体(点,线,三角形)所覆盖。

    展开全文
  • OpenGL ES实践教程1-Demo01-AVPlayerOpenGL ES实践教程2-Demo02-摄像头采集数据和渲染OpenGL ES实践教程3-Demo03-MirrorOpenGL ES实践教程4-Demo04-VR全景视频播放 其他教程请移步OpenGL ES文集。 有简书的开发者问...

    教程

    OpenGL ES实践教程1-Demo01-AVPlayer
    OpenGL ES实践教程2-Demo02-摄像头采集数据和渲染
    OpenGL ES实践教程3-Demo03-Mirror
    OpenGL ES实践教程4-Demo04-VR全景视频播放
    其他教程请移步OpenGL ES文集

    有简书的开发者问我如何使用在一张大图上贴一张小图,原始的需求是在检测人脸,在返回的范围(矩形)内贴上一张图片。
    有几点前提:

    • 尽量少消耗CPU;
    • 合成的数据是用于推流;
    • 图片大小不一致;

    说说如果没有上述几点前提下,可能的方案:

    • 1、使用UIKit,新建一个透明的View,大小和原图像一致,在View上面对应的位置添加图像;
    • 2、使用GPUImage,选择一个filter,添加两个原图像作为输入;
    • 3、使用OpenGL ES,多重纹理;

    因为数据要用于推流,故而最简单的方案1不行;
    方案2可行,但是需要对GPUImage较为熟悉;
    方案3相对方案2简单,同时对性能的要求最低,最为符合。

    本文探究如何使用OpenGL ES实现两个图片的混合。

    核心思路

    自定义shader,传入两个纹理和对应矩形的坐标;
    在像素着色器内判断当前点的范围,如果处于对应矩形内,则进行混合操作;

    效果展示

    具体细节

    1、编译链接GLProgram

    为了更方便开发,特引入Jeff LaMarche's GLProgram头文件

    This is Jeff LaMarche's GLProgram OpenGL shader wrapper class from his OpenGL ES 2.0 book.
    A description of this can be found at his page on the topic:
    http://iphonedevelopment.blogspot.com/2010/11/opengl-es-20-for-ios-chapter-4.html
    I've extended this to be able to take programs as NSStrings in addition to files, for baked-in shaders

    2、上传顶点数据以及矩形坐标

    通过GLProgram-uniformIndex:-attributeIndex:方法,可以便捷的取到对应属性的索引,再通过glUniform1iglUniform2f方法可以上次数据到OpenGL ES。

        GLuint texture0Uniform = [self.mProgram uniformIndex:@"myTexture0"];
        GLuint texture1Uniform = [self.mProgram uniformIndex:@"myTexture1"];
        GLuint leftBottomUniform = [self.mProgram uniformIndex:@"leftBottom"];
        GLuint rightTopUniform = [self.mProgram uniformIndex:@"rightTop"];
        GLuint displayPositionAttribute = [self.mProgram attributeIndex:@"position"];
        GLuint displayTextureCoordinateAttribute = [self.mProgram attributeIndex:@"textCoordinate"];
    

    注意,shader里面的attribute变量用-attributeIndex,uniform变量用-uniformIndex,纹理是uniform变量;
    从顶点shader传值到像素shader需要用varing变量。

    3、上传纹理数据

    这是本文的重点之一。

    • 1、首先通过UIKit的方法,拿到图像的UIImage对象;

    • 2、将UIImage转换成CGImage,通过CoreGraphics取到二进制数据;

    // 1获取图片的CGImageRef
        CGImageRef spriteImage = [UIImage imageNamed:fileName].CGImage;
        if (!spriteImage) {
            NSLog(@"Failed to load image %@", fileName);
            exit(1);
        }
        
        // 2 读取图片的大小
        size_t width = CGImageGetWidth(spriteImage);
        size_t height = CGImageGetHeight(spriteImage);
        
        GLubyte * spriteData = (GLubyte *) calloc(width * height * 4, sizeof(GLubyte)); //rgba共4个byte
        
        CGContextRef spriteContext = CGBitmapContextCreate(spriteData, width, height, 8, width*4,
                                                           CGImageGetColorSpace(spriteImage), kCGImageAlphaPremultipliedLast);
        
        // 3在CGContextRef上绘图
        CGContextDrawImage(spriteContext, CGRectMake(0, 0, width, height), spriteImage);
        
        CGContextRelease(spriteContext);
    
    • 3、选择对应的纹理单元,创建纹理对象并绑定;
        glActiveTexture(GL_TEXTURE0);
        glEnable(GL_TEXTURE_2D);
        glGenTextures(1, &_myTexture0);
        glBindTexture(GL_TEXTURE_2D, self.myTexture0);
    
    • 4、上传纹理数据,并释放原来申请的内存;
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
        
        float fw = width, fh = height;
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, fw, fh, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData);
        //    glBindTexture(GL_TEXTURE_2D, 0);
        free(spriteData);
    

    这里需要理解两个概念,纹理单元纹理对象
    纹理单元我没有找到很好的中文描述,讲下我自己的理解。
    纹理单元对应GPU支持的纹理数量,在shader的表现是以uniform变量的形式表现

    uniform sampler2D myTexture0;
    uniform sampler2D myTexture1;
    

    iOS对纹理单元的数量限制如下


    纹理对象指的是纹理的索引,通常是用glGenTextures生成,如下是生成一个纹理对象。

     

        glGenTextures(1, &_myTexture0);
    

    一个纹理单元上有1D、2D、3D、CUBE等几个目标,即是你可以在同一个纹理单元bind不同的纹理对象,但是不推荐刚开始就这么做。

        glActiveTexture(GL_TEXTURE1);
        glEnable(GL_TEXTURE_2D);
        glGenTextures(1, &(_myTexture1));
        glBindTexture(GL_TEXTURE_2D, self.myTexture1);
        ```
    如上,这是一段常用的使用纹理单元1的代码。
    先选择(你也可以按照词面意思理解为激活)纹理单元1,同时开启2D的纹理目标;
    然后生成一个纹理对象,把纹理对象绑定到纹理单元1的2D纹理上;
    接下来所有的操作都是针对纹理单元1上的纹理对象,直到你再次通过`glActiveTexture`选择其他纹理单元。
    
    ####4、实现着色器
    顶点着色器较为简单,只需把顶点数据转成varying变量,传给像素着色器即可;
    像素着色器,收到顶点着色器传过来的varyOtherPostion顶点数据,判断当前点是否在leftBottom变量和rightTop变量形成的矩形内。
    如果在矩形内,则通过自定义的操作来混合颜色,通常是使用alpha值,一个变量 \* alpha,一个变量 \* (1-alpha)。
    

    varying lowp vec2 varyTextCoord;
    varying lowp vec2 varyOtherPostion;

    uniform lowp vec2 leftBottom;
    uniform lowp vec2 rightTop;

    uniform sampler2D myTexture0;
    uniform sampler2D myTexture1;

    void main()
    {
    if (varyOtherPostion.x >= leftBottom.x && varyOtherPostion.y >= leftBottom.y && varyOtherPostion.x <= rightTop.x && varyOtherPostion.y <= rightTop.y) {

        lowp vec2 test = vec2((varyOtherPostion.x - leftBottom.x) / (rightTop.x - leftBottom.x), 1.0 -  (varyOtherPostion.y - leftBottom.y) / (rightTop.y - leftBottom.y));
        lowp vec4 otherColor = texture2D(myTexture1, test);
     //   otherColor.a = 0.8;
        gl_FragColor = otherColor * otherColor.a + texture2D(myTexture0, 1.0 - varyTextCoord) * (1.0 - otherColor.a);
    }
    else {
        gl_FragColor = texture2D(myTexture0, 1.0 - varyTextCoord);
    }
    

    }

    >0.8是为了测试,效果展示的图片就是alpha=0.8的效果图。
    
    
    ###总结
    最近几周都忙着[直播系列的补齐](http://www.jianshu.com/notebooks/5037333/latest),OpenGL ES的上一篇[OpenGL ES实践教程(四)VR全景视频播放](http://www.jianshu.com/p/0c8d080bb375)已经是一个月之前。
    接下来的文章主要还是以直播相关内容为主,图形图像的等简书的书友问道了再补上。
    
    
    ####附1
    CaptureGPUFrame突然不好用,查了下文档,发现可能是以下原因
    >Note: Some features of the FPS gauge and GPU report rely on a display link timer. If you do not use the CADisplayLink or GLKViewController classes to animate your OpenGL ES displays, the gauge and report cannot show performance relative to a target frame rate or provide accurate CPU frame time information.
    
    ####附2
    之前有书友问到,如何添加以下形状的图像。
    ![](http://upload-images.jianshu.io/upload_images/1049769-f492641d933b30a3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    这种格式不太试用本文的方法,需要引入一个新的shader变量`gl_LastFragData `。先绘制原来的图像,再绘制新的图像,通过`gl_LastFragData `来混合。
    ***有兴趣的来一份数据,弄个demo玩玩!!***

    产出不易,如果文章对你有所帮助,不如请我喝个可乐。



    作者:落影loyinglin
    链接:https://www.jianshu.com/p/f5c6593e1a44
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    展开全文
  • GLVideoCompositor 使用 OpenGL ES 创建自定义 iOS 视频合成器的小项目
  • 这是一个能实时播放多个视频、图片在一个GL容器里的控件,通过这个控件,可以在一个view中绘制固定坐标、自由随机滚动的视频和图片,然后从该view中截取数据帧,实时保存成YUV格式的文件,最后合成MP4。
        这是一个能实时播放多个视频、图片在一个GL容器里的控件,通过这个控件,可以在一个view中绘制固定坐标、自由随机滚动的视频和图片,然后从该view中截取数据帧,实时保存成YUV格式的文件,最后合成MP4。
    

    一、OpenGL 渲染视频模块

    1.结构简介
    a. GLEngine是一个全局控制GL绘制各个子view的类,结构图如下:
    GLEngine结构图

    b.Java层封装后的View控件结构如下:
    这里写图片描述

        GLEngine直接提供接口给上层调用,通过该对象实现创建、绘制、释放子view,和获取GL绘制结果,以及释放整个GL。
        MyGLView是对底层的封装,提供方法给Android直接使用。
    

    2.工作原理

        底层GLEngine实例化后,会返回一个long型的对象句柄给上层的MyGLView,MyGLView对象就可以通过该句柄实现对底层GLEngine的引用。
        MyGLView对象通过addStaticView()、addScrollView()方法调用底层对应的createStaticView()、createScrollView()函数,拿到子view long型的句柄,然提供给使用MyGLView的开发者保存下来,开发者就可以通过这些子view的句柄来绘制GL里面的各个子view。
    

    二、视频编解码模块

    1. 结构简介
      a. GetRgbFremer
      MP4解码器,能从MP4文件中取出RGB帧,类结构图如下:
      这里写图片描述

      b.RgbToYuv420P
      对RGB帧转换成YUV420P帧的转换,并保存为文件,结构图如下:
      这里写图片描述

      c.H264Encoder
      能把YUV编码成H264,结构图如下:
      这里写图片描述

      d.Mp4Muxer
      视频复合器,能把AAC音频流和H264视频流合成MP4,结构图如下:
      这里写图片描述

    三、视频编解码和OpenGL渲染整合使用指南

    1. 首选创建多个线程解码多个视频,获取到的帧数据缓存起来。
        /**
         * 解码线程1
         */
        private FFGetRgbFramer mFFGetRgbFramer = new FFGetRgbFramer(mInMp4Path, mVideoWidth1, mVideoHeight1);
        private byte[] mVideoData1;
        private void decodeThread1() {
            new Thread(new Runnable() {
                @Override
                public void run() {
    
                    while (mRun) {
                        if (mVideoData1 == null) {
                            mVideoData1 = mFFGetRgbFramer.getNextRgbFrame();
                            if (mVideoData1 == null) {
                                break;
                            }
                        }
                    }
                }
            }).start();
        }
    
    ……
    ……
    1. 在SurfaceView的Renderer下的回调onSurfaceChanged下初始化MyGLView,并添加子view,拿到句柄保存下来,在回调onDrawFrame下把调用MyGLView对象的drawFrame()方法,并且把要绘制的子view对应的句柄和RGB帧数据传进去,该方法返回获取到的GL绘制结果,然后使用FFRgbToYuv420p保存成YUV文件,以备后续合成MP4使用。例如:
    GLSurfaceView.Renderer mRenderer = new GLSurfaceView.Renderer() {
    
            @Override
            public void onSurfaceCreated(GL10 gl, EGLConfig config) {
                mGLView.initGL();
            }
    
            @Override
            public void onSurfaceChanged(GL10 gl, int width, int height) {
                mGLView.onChangeGL(width,height);
                mStaticHandle1 = mGLView.addStaticView(0, 0, mVideoWidth1, mVideoHeight1, width, height);
                ……
                ……
                mHandles.clear();
                mHandles.add(mStaticHandle1);
                mHandles.add(mStaticHandle2);
                ……
            }
    
            @Override
            public void onDrawFrame(GL10 gl) {
                if (mVideoData1 != null && mVideoData2 != null) {
                    List<byte[]> byteList = new ArrayList<>();
                    byteList.add(mVideoData1);
                    ……
                    mVideoData1 = null;
                    ……
                    byte[] rgbResultByte = mGLView.drawFrame(mHandles,byteList);
    
                    if (rgbResultByte != null) {
                        mFFRgbToYuv420p.pushRgbData(rgbResultByte);
                    }
                }
            }
        };

    最后再分别利用H264Encoder、Mp4Muxer合成MP4。

    OpenGL实现部分源码地址:https://github.com/hondameng/OpenGLES2Test

    展开全文
  • opengl

    2012-01-17 04:38:20
    opengl 2011年02月19日  OpenGL总结  OpenGL学习总结  一.OpenGL是做什么的  一种图形硬件的接口。而不是像C和C++一样的编程语言,更像是一个运行库,提供一些预先封装的函数。  二.OpenGL的主要功能...
  • 2、环境光、散射光、镜面光三种光照通道的合成 二、程序运行结果 三、镜面光    现实世界中,当光滑表面被照射时会有方向很集中的反射光。这就是镜面光(Specular)    与散射光最终强度仅依赖于入射光与被照射...
  • OpenGL中的变换: 平移:glTranslate3f(dx,dy,dz); 旋转:glRotate3f(angle, x, y, z); 缩放:glScale3f(sx, sy, sz); 练习内容: 在窗口中绘制一个圆形和矩形。 ; 再绘制一遍相同的圆和矩形,并作恰当的变换...
  • 浅谈OpenGLOpenGL ES

    2018-11-27 19:36:55
    最近研究安卓系统屏幕绘制这部分时,可谓是绞尽脑汁… 偶然得到家人的指点有了思路上的突破,实现了想要的功能。本篇文章结合&lt;OpenGL编程指南&...OpenGL的简易版本OpenGL ES应用与android...
  • bzzzbz是一种视频合成器,可以对音频输入做出动态React,以创建可为集成的视听表演而操纵的图像和视觉效果。 该产品旨在成为商用模拟视频合成器的一种更简单,更便宜的替代产品,同时仍提供灵活的界面来增强音乐表现...
  • OpenGL安装

    2014-12-02 20:04:02
    OpenGL版本与OpenGL扩展机制 1 opengl的版本区别(在opengl官方文档中有详细说明)  针对Opengl不同版本的升级是主要是扩展指令集。 1.1 opengl1.1 1995年,SGI推出了更为完善的OpenGL 1.1版本。OpenGL 1.1的...
  • 主要的变化在于shader中要对三种光照通道进行合成下面给出代码 顶点着色器 uniform mat4 uMVPMatrix; //总变换矩阵 uniform mat4 uMMatrix; //变换矩阵 uniform vec3 uLightLocation; //光源位置 uniform vec3...
  • OpenGL总结

    2020-05-02 14:52:29
    OpenGL学习总结 一.OpenGL是做什么的 一种图形硬件的接口。而不是像C和C++一样的编程语言,更像是一个运行库,提供一些预先封装的函数。 二.OpenGL的主要功能是什么 建模,变换,颜色模式设置,光照和材质设置,...
  • OpenGL版本与OpenGL扩展机制 1 opengl的版本区别(在opengl官方文档中有详细说明)针对Opengl不同版本的升级是主要是扩展指令集。现在版本是4.0啦1.1 opengl1.11995年,SGI推出了更为完善的OpenGL 1.1...
  • OpenGLES自定义相机

    2021-06-13 11:40:14
    本课程将教会大家如何使用OpenGLES完成自定义相机,提升学生在行业内的竞争
  • 初学OpenGL

    2013-02-04 14:02:46
    下学期是本科最后一个学期了,毕业设计选的题目是OpenGL三维动态场景的绘制。以前从没有接触过这方面的东西。于是去图书馆借了几本书。作为入门,打算读一下:OpenGL超级宝典和OpenGL红宝书。其他的就有选择的读一下...
  • OpenGL超级宝典源码

    热门讨论 2012-02-25 13:08:00
    第二部分“OpenGL渲染组成”深入阐述了0penGL的使用、高级特性及特殊效果,如处理光栅图形、纹理贴图、3D建模和物体合成、混色和雾化效果,处理三角形、曲线和曲面、交互式图形,另外还介绍了如何利用OpenGL制作图像...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,244
精华内容 3,697
关键字:

opengl合成