首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

GPUImage详细解析(二)

需要注意是startRunning函数花费一定时间,所以不能在主线程(UI线程)调用,防止卡顿。 sessionPreset 属性可以自定义一些设置。...其中Y与YUV 中Y含义一致,Cb,Cr 同样都指色彩,只是表示方法不同而已。YUV 家族中,YCbCr 是计算机系统中应用最多成员,其应用领域很广泛,JPEG、MPEG均采用此格式。...glActiveTexture(GL_TEXTURE1); glGenTextures(1, &_texture); glBindTexture(GL_TEXTURE_2D, _texture...setDisplayFramebuffer()绑定GPUImageView帧缓存,同时调试视口大小view大小。 glActiveTexture上面已经介绍过,是选择一个纹理单元。...先选择纹理单元4,然后把源图像数据绑定到GL_TEXTURE_2D位置。最后告诉片元着色器,纹理单元是4。

1.5K30
您找到你想要的搜索结果了吗?
是的
没有找到

OpenGL ES实践教程(二)摄像头采集数据和渲染

glActiveTexture(GL_TEXTURE1); err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault...1、黑屏 黑屏现象出现多次,首先是 CVOpenGLESTextureCacheCreateTextureFromImage failed (error: -6683) 纹理创建失败导致黑屏,...正确配置好颜色格式,解决; 解决所有报错后,仍常黑屏; 检查纹理代码,正常; 检查颜色缓冲区代码,正常; 检查顶点坐标代码,正常; 检查纹理坐标代码,正常; 采用最后手段,capture...[EAGLContext setCurrentContext:_context]; 疑惑:为何之前调用过一次设置context之后,需要再次调用context?...检查了创建纹理过程,没有发现错误; 修改颜色空间,导致颜色更加异常; 检查是否顶点着色器偏移有误差,没有问题; 最后发现图片偏绿,顶点着色器找到问题代码: yuv.yz = (texture2D

2.2K50

如何渲染最原始yuv视频数据?

这个时候,之前学过纹理单元就可以派上用场了,我们可以定义3个纹理单元,分别读取yuv图像3个通道数据,最后片段着色器中进行合成,然后转化为RGBA值即可。...ByteBuffer对象,对返回ByteBuffer对象所做更改反映在原始字节数组,因为它们共享相同存储区域 bufferY=ByteBuffer.wrap(y...由于我们之前设置格式是GL_LUMINANCE,假设传入y分量对应坐标位置r,则在片段着色器中纹理单元中读出(r,r,r,1),那么我们取r就是取第一个元素值,其实这里前3个值都是一样...opengl es2.0编程中,用于绘制顶点数组数据首先保存在cpu内存,调用glDrawArrays函数进行绘制时,需要将顶点数组数据从cpu内存拷贝到gpu显存中。...ByteBuffer对象,对返回ByteBuffer对象所做更改反映在原始字节数组,因为它们共享相同存储区域 bufferY=ByteBuffer.wrap(y

15210

NDK OpenGL ES 3.0 开发(十六):相机预览

作为预览载体 SurfaceTexture 绑定纹理需要是 OES 纹理,使用 OES 纹理后,我们不需要在片段着色器中自己做 YUV to RGBA 转换,因为 OES 纹理可以直接接收 YUV...类似于普通 2D 纹理创建,OES 纹理创建实现如下: private int createOESTexture(){ int[] texture = new int[1]; GLES20...,着色器脚本头部增加扩展纹理声明: #extension GL_OES_EGL_image_external : require 并且纹理采样器不再使用 sample2D ,需要换成 samplerExternalOES...CPU 算法做一些滤镜或者美颜特效就很不方便,图像数据需要多次在内存与显存之间拷贝,造成性能和功耗问题。...相机预览数据常见格式是 YUV420P 或者 YUV420SP(NV21) ,需要将图像数据对应 YUV 3 个分量使用 3 个纹理传入显存,片段着色器中将 YUV 数据转为 RGBA ,相关原理可参考

2.7K40

AVPlayer初体验之视频解纹理

不同性能设备,甚至相同设备不同iOS版本,AVPlayer最大支持清晰度都会不一样,例如在iOS10某些机器不支持4k播放,但是到iOS11就支持了,关于测定视频是否可以用AVPlayer...输出纹理 YUV纹理 由于视频编码格式基本都是YUV420,可以查看苹果Demo代码 ,通过AVPlayerItemVideoOutput获取Y-Pannel和UV-Pannel两张纹理,最后Shader...首先要明白一点,上图中明确说明,BGRA输出格式是420v两倍多带宽(More than 2x bandwidth),并且该图来源,WWDC这个视频27:00位置明确说明420v输出格式效率明显高于...,重新构造播放器显然是最简单易行,但是测试发现,频繁构造和销毁AVPlayer对象虽然不会导致内存增加,但是很奇怪是,导致OtherProccesses内存增大,从而导致Free内存减小,减小到某个值时候...当要切换播放源时,需要指定新AVPlayerItem,这时候又会面临状态问题,之前说过只有AVPlayerItemStatus变成readyToPlay时候才可以调用play和seek等函数,可以使用

3.3K40

面试中,被反复提及 OpenGL NV21 图像渲染

YUV 渲染原理 前面文章一文掌握 YUV 图像基本处理介绍了 YUV 常用基本格式,本文以实现 NV21/NV12 渲染例。...前文提到,YUV 图不能直接用于显示,需要转换为 RGB 格式,而 YUV 转 RGB 是一个逐像素处理耗时操作, CPU 端进行转换效率过低,这时正好可以利用 GPU 强大并行处理能力来实现 YUV...YUV 与 RGB 之间转换公式 YUV 与 RGB 之间转换矩阵 需要注意是 OpenGLES 内置矩阵实际是一列一列地构建,比如 YUV 和 RGB 转换矩阵构建是: mat3 convertMat...OpenGLES 常用纹理格式类型。 OpenGLES 常用纹理格式类型 GL_LUMINANCE 纹理着色器中采样纹理像素格式是(L,L,L,1),L 表示亮度。...GL_LUMINANCE_ALPHA 纹理着色器中采样纹理像素格式是(L,L,L,A),A 表示透明度。

1.8K20

Qt音视频开发22-通用GPU显示

之前用ffmpeg解码时候,已经做了硬解码处理,比如支持qsv、dxva2、d3d11va等方式进行硬解码处理,但是当时解码出来以后,还是重新转成了QImage来绘制,这样就大打折扣了,尽管可以看到...GPU使用率有了,但是依然耗时操作还是CPU绘制显示,这就显得很尴尬了,Qt封装了大部分opengl操作,直接做成了QOPenGLWidget,既支持ffmpeg解码出来yuyv格式数据显示...如果开启了opengl绘制,则对应内存增加不少,可能opengl绘制需要开辟很多内存来交换数据吧。...测试发现ffmpeg4性能要优于ffmpeg3,64位性能要优于32位64位操作系统,UDP协议性能要优于TCP性能,但是可能丢包。...支持图片地图,设备按钮可以图片地图上自由拖动自动保存位置信息。 百度地图和图片地图上,双击视频可以预览摄像头实时视频。 堆栈窗体,每个窗体都是个单独qwidget,方便编写自己代码。

1.3K40

NDK OpenGLES 3.0 开发(三):YUV 渲染

YUV 渲染原理 前面文章一文掌握 YUV 图像基本处理介绍了 YUV 常用基本格式,本文以实现 NV21/NV12 渲染例。...前文提到,YUV 图不能直接用于显示,需要转换为 RGB 格式,而 YUV 转 RGB 是一个逐像素处理耗时操作, CPU 端进行转换效率过低,这时正好可以利用 GPU 强大并行处理能力来实现 YUV...YUV 与 RGB 之间转换矩阵 需要注意是 OpenGLES 内置矩阵实际是一列一列地构建,比如 YUV 和 RGB 转换矩阵构建是: mat3 convertMat = mat3(1.0...OpenGLES 常用纹理格式类型。 ? OpenGLES 常用纹理格式类型 GL_LUMINANCE 纹理着色器中采样纹理像素格式是(L,L,L,1),L 表示亮度。...GL_LUMINANCE 纹理着色器中采样纹理像素格式是(L,L,L,A),A 表示透明度。

1.5K10

12.QT-通过QOpenGLWidget显示YUV画面,通过QOpenGLTexture纹理渲染YUV

在上章11.QT-ffmpeg+QAudioOutput实现音频播放器,我们学习了如何播放音频,接下来我们便来学习如何通过opengl来显示YUV画面 1.为什么使用QOpenGLWidget显示YUV...需要学习: 2.通过QOpenGLWidget绘制三角形 3.QOpenGLWidget-通过着色器来渲染渐变三角形 4.QOpenGLWidget-对三角形进行纹理贴图、纹理叠加 项目流程如下所示:...,存是一个画面的颜色值,对应还有sampler3D等 texture2D(texY, TexCoord): 其实等价于texture()函数,第一个参数纹理采样器,第二个参数是对应纹理坐标,该函数就会根据当前所在纹理坐标去获取对应颜色...FragColor : 控制输出颜色(rgba),(3.3版本后需要通过out方式来声明) texture2D(texU, TexCoord).r-0.5: 由于opengl接受颜色值(0.0...以R例: 由于R=yuv第1行(y,u,v)和mat3()内第1列(1.0,0.0,1.4075)相乘和、 所以R=1.0Y+0*(U-128)+1.4075(V-128) 3.myglwidget

3.3K40

OpenGL 学习系列 --- 纹理

接下来探索纹理了。 纹理,简单理解就是一副图像。而把一副图像映射到图形过程,叫做纹理映射。 比如有如下图形和三角形,想要把图形中一部分映射到三角形。 ? ? 结果就是这样: ?...纹理映射基本思想就是:首先为图元中每个顶点指定恰当纹理坐标,然后通过纹理坐标纹理图中可以确定选中纹理区域,最后将选中纹理区域中内容根据纹理坐标映射到指定图元。...所以代码最后调用了 glBindTexture(GL_TEXTURE_2D, 0) 来解除绑定。...当一个纹理被绑定时,绑定目标上 OpenGL 操作将作用到绑定纹理上,并且,对绑定目标的查询也将返回其绑定纹理状态。...总结 & 名词混淆点 在上面既是纹理单元又是纹理目标的很容易搞混,梳理一下概念: 形如 GL_TEXTURE0、GL_TEXTURE1、GL_TEXTURE2 就是纹理单元,一台机子纹理单元数量是有限

1.3K10

GPUImage详细解析(三)- 实时美颜滤镜

这部分在上一篇介绍也有提到,再详细阐述:glActiveTexture()选择纹理单元,和glGenTextures()返回数字没有关系,可以纹理单元2上面绑定纹理12。...调用newFrameReadyAtTime: atIndex: 通知GPUImageBilateralFliter输入纹理已经准备好; 3、GPUImageBilateralFliter 绘制图像后...调用renderToTextureWithVertices: textureCoordinates:绘制图像, 完成后把图像设置GPUImageView输入纹理,并通知GPUImageView输入纹理已经绘制完毕...; 9、GPUImageView把输入纹理绘制到自己帧缓存,然后通过 [self.context presentRenderbuffer:GL_RENDERBUFFER];显示到UIView。...绘制流程图过程中,对GPUImage响应链有了更清晰认识。

1.9K50

Qt编写安防视频监控系统27-GPU显示

一、前言 之前用ffmpeg解码时候,已经做了硬解码处理,比如支持qsv、dxva2、d3d11va等方式进行硬解码处理,但是当时解码出来以后,还是重新转成了QImage来绘制,这样就大打折扣了,尽管可以看到...GPU使用率有了,但是依然耗时操作还是CPU绘制显示,这就显得很尴尬了,Qt封装了大部分opengl操作,直接做成了QOPenGLWidget,既支持ffmpeg解码出来yuyv格式数据显示...如果开启了opengl绘制,则对应内存增加不少,可能opengl绘制需要开辟很多内存来交换数据吧。...测试发现ffmpeg4性能要优于ffmpeg3,64位性能要优于32位64位操作系统,UDP协议性能要优于TCP性能,但是可能丢包。...默认采用opengl绘制视频,超低CPU资源占用,支持yuyv和nv12两种格式绘制,很牛逼。 高度可定制化,用户可以很方便在此基础衍生自己功能,支持linux和mac系统。

1.2K00

二维纹理映射(2D textures)【转】

纹理映射就是这样一种方法,程序中通过为物体指定纹理坐标,通过纹理坐标获取纹理对象中纹理,最终显示屏幕区域,已达到更加逼真的效果。...另外一个问题是,纹理应用到物体,最终要绘制显示设备,这里存在一个纹素到像素转换问题。...原始纹理必须自己通过读取纹理图片来加载,这个后面会介绍。 如果直接在不同等级MipMap之间切换,形成明显边缘,因此对于Mipmap也可以同纹素一样使用滤波方法不同等级Mipmap之间滤波。...4.width和height参数指定存储纹理大小,我们之前利用SOIL读取图片时已经获取了图片大小,这里直接使用即可。 5. border 参数历史遗留参数,只能设置0. 6....);glUniform1i(glGetUniformLocation(shader.programId,"tex1"),0);// 使用1号纹理单元glActiveTexture(GL_TEXTURE1

1.1K20

一文搞懂 OpenGL 多重采样抗锯齿,再也不怕面试被问到了

锯齿效应是由于屏幕渲染图形对象边缘处像素颜色变化突然而导致,它使得图形看起来不够平滑,影响了视觉质量。...多重采样抗锯齿原理 多重采样抗锯齿通过渲染过程中对图像进行额外抽样来解决这个问题。...多重采样抗锯齿实现 通过 EGL 设置多重采样 我们知道 EGL 创建 OpenGL 渲染上下文,会调用一系列 egl 函数,例如 eglGetDisplay() ,eglInitialize()...setEGLContextClientVersion(3); setEGLConfigChooser(new MyConfigChooser()); // 注意在 setRenderer 之前调用...流程比较简单,就是创建一个多重采样纹理或者多重采样缓冲区,作为帧缓冲区颜色附着 GL_COLOR_ATTACHMENT0 ,涉及 3D 场景的话也需要创建对应多重采样深度和模版缓冲区。

41410

OpenGL ES纹理详解

使用纹理就是纹理图中进行采样,因此需要将选定纹理坐标穿进顶点着色器,经过插值片元着色器中从纹理图中指定位置采样即可,纹理数据通过往片元插值器传递纹理单元指定。...后续操作将影响绑定纹理对象。一旦纹理被绑定到一个特定纹理目标,再删除之前就一直保持着绑定状态。...// 要激活纹理单元 ); 对这两个函数理解:显卡中有N个纹理单元(GL_TEXTURE0,GL_TEXTURE1,GL_TEXTURE2…),每个纹理单元中保存着很多纹理目标(targetTexture1D...,默认激活就是0号纹理单元 //GLES20.glActiveTexture(GLES20.GL_TEXTURE0); // 将纹理对象ID绑定到当前活动纹理单元0GL_TEXTURE_2D目标...gl_FragColor = (vColor*vDiffuse + vColor*vec4(0.6,0.6,0.6,1))*texture2D(uTexture, vTextureCoord);" // 纹理基础还考虑到光照

1.7K40

OpenGL ES_手把手教你打造VR全景播放器

学习是一件开心额事情 学习目标 打造全景视频,以及VR 眼镜专用双屏显示框架! 你应该知道 ?...网络截图 全景显示原理 通俗将,好比红色区域就是你手机屏幕,当你旋转手机时候,我们球体向相反方向旋转,这样,你就可以看到球体画面了. 准备工作 找一个全景视频,添加到项目中去。...,之前教程中都讲过,这里就不赘述了。...代表GL_TEXTURE1 在这里我有必要提醒你,这两个方法,一定要放在着色器程序链接成功之后,不然你调用这个两个方法,没有效果。...1 glActiveTexture(GL_TEXTURE1); err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault

1.9K31

Qt创建一个OpenGL窗口

深度缓存不断对物体进入屏幕内部有多深进行跟踪。我们本节程序其实没有真正使用深度缓存,但几乎所有屏幕显示3D场景OpenGL程序都使用深度缓存。它排序决定那个物体先画。...任何您所想在屏幕显示东东都将在此段代码中出现。以后每个教程中我都会在例程此处增加新代码。...如果您对OpenGL已经有所了解的话,您可以 glLoadIdentity()调用之后,函数返回之前,试着添加一些OpenGL代码来创建基本形。如果您是OpenGL新手,等着我下个教程。...它将所选矩阵状态恢复成其原始状态。调用glLoadIdentity()之后我们场景设置透视图。...甚至您无法改变窗口大小时(例如您在全屏模式下),它至少仍将运行一次——程序开始时设置我们透视图。OpenGL场景尺寸将被设置成它显示时所在窗口大小。

2.2K20
领券