快手 · 移动端音视频开发实战
展晓凯
快手回森技术负责人
12246 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 25 讲
快手 · 移动端音视频开发实战
15
15
1.0x
00:00/00:00
登录|注册

06|移动平台的视频渲染(三):OpenGL ES实操

你好,我是展晓凯。今天我们来继续学习移动平台的视频渲染。
第 4 讲中,我们学习了 OpenGL ES 的基础概念,并且用 OpenGL ES 提供给我们的接口构建出了一个 GLProgram;第 5 讲,我们学习了如何在移动平台搭建 OpenGL ES 的上下文环境。有了之前的准备,我们终于迎来了收获成果的时刻——让 GLProgram 在上下文环境中跑起来。

GLSL 语法与内建函数

在让 GLProgram 跑起来之前,我们还需要学习一下 GLSL 的语法和内建函数,这样才能够学会用 GLSL 书写着色器。
GLSL 是 OpenGL 的着色器语言,开发者自己能够编写着色器来完成渲染管线的顶点变换阶段和片元处理阶段。——第 4 讲内容回顾
我们这个部分的目标就是实现一组着色器来完成增强对比度的功能,但是这组着色器还不能直接看到效果,因为着色器是需要运行到显卡中的,要想看到效果还得等这节课学完之后,所以不要着急,我们慢慢来。
前面我们已经粗略地介绍过 GLSL 是什么了,但是一直没有准确地给它下过定义,其实就是担心你看到它的定义之后,觉得难以理解,而学到这里我们已经了解了渲染管线以及着色器的职责,GLSL 理解起来也就容易多了。
GLSL(OpenGL Shading Language)就是 OpenGL 为了实现着色器给开发人员提供的一种开发语言。接触一门新的编程语言,一般要先看一下它的数据类型和修饰符,然后再学习这种语言的内嵌函数,最终再构建一个完整的程序,让它跑起来。我们先来看一下基本的数据类型。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了移动平台视频渲染中的OpenGL ES实操,包括GLSL语法与内建函数、纹理坐标系、纹理创建与绑定、纹理的上传与下载以及物体坐标与纹理绘制。作者首先详细介绍了GLSL的修饰符与数据类型,以及纹理类型的声明方式和客户端代码传递纹理的方法。接着,文章详细讲解了纹理坐标系的构造和OpenGL ES中纹理对象的创建、绑定以及设置过滤方式和超出范围的纹理处理规则。此外,还介绍了将图片数据上传到纹理对象中以及显存数据回传回内存的操作。最后,文章还涉及了物体坐标系的概念。总体来看,本文内容涵盖了GLSL的语法和内建函数,以及OpenGL ES的纹理操作,对于想要了解移动平台视频渲染的读者来说,是一篇值得深入阅读的技术文章。 文章还提到了OpenGL ES的环境搭建、顶点着色器和片元着色器的代码示例,以及绘制纹理的具体操作步骤。此外,还对纹理对象的删除、绘图指令的执行以及性能优化方面进行了说明。最后,文章提出了思考题,引导读者进一步思考GPUImage框架的设计思路。 总的来说,本文通过具体的代码示例和实操步骤,深入解析了移动平台视频渲染中的关键技术,对于想要深入了解OpenGL ES和移动平台视频渲染的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《快手 · 移动端音视频开发实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(5)

  • 最新
  • 精选
  • cc
    老师,咨询个问题: glActiveTexture(GL_TEXTURE0); // 第一行 glBindTexture(GL_TEXTURE_2D, texId); // 第二行 glUniform1i(mGLUniformTexture, 0); // 第三行 我自己实测不要第一行和第三行,也能绘制出来,请问下是什么原因。

    作者回复: 这是标准写法,如果你在复杂的场景(有多个纹理需要绑定的时候)如果仅写第二行就会有问题。

    2022-10-25归属地:北京
  • 冰冰的冻结
    老师 android 平台部分设备在执行 GLES20.glDrawArrays 函数时 报 fault addr 0x0 问题 一般这种问题 你是怎么解决的呢

    作者回复: 从你这个Crash地址应该是访问空指针了,可以check一下哪个地方没有初始化。

    2022-08-10归属地:北京
    3
  • geek
    我们这个部分的目标就是实现一组着色器来完成增强对比度的功能,但是这组着色器还不能直接看到效果,因为着色器是需要运行到显卡中的,要想看到效果还得等这节课学完之后,所以不要着急,我们慢慢来。 老师这节课的GLSL代码,也没有实现增强对比度的功能。还要在片段shader中加上对比度的操作呀?

    作者回复: 你看的很细,当时是由于篇幅关系没引入太多细节,这里我后面修改一下。

    2022-08-06归属地:北京
    2
  • peter
    请教老师几个问题啊: Q1:客户端是相对谁的? 文中几次提到了“客户端”,有“客户端”,就要有“server”。请问Server是谁? (我的理解:”Server”是指OpgenGL ES,“客户端”是指调用OpenGL ES的上层应用) Q2:安卓坐标系怎么会是0到1? 安卓两个坐标轴表示像素个数,像素个数都是几百的整数值,怎么会是0到1? Q3:GL_NEAREST 的过滤方式,缩小的时候,效果是什么?

    作者回复: A1:“客户端”一般指的是调用者,这是一些程序员或者架构师的叫法,比如你写一个接口或者框架,谁调用你这个借口或者框架了可以称之为客户端代码;具体你这个问题中,“Server”的话可以理解为OpenGL引擎,我们绑定纹理等指令都是告诉OpenGL引擎我们想要做的操作是什么; A2: 0~1时归一化的意思,也就是你的任意值除以屏幕宽度或者高度,可以归一化到0~1这个范围; A3: 缩小的时候也是取临近位置上的点。

    2022-08-05归属地:北京
    3
  • 臭屁哎
    老师,我想在实时播放视频(正在录制的视频)上显示自定义文字,为什么会报错glClear: GL error: 0x502,绘制的内容需要放在线程里面执行吗?是不是最后没有执行这句话glDeleteTextures(1, &texId)?还有就是我的顶点着色器和片段着色器这么定义是对的吗? 1)顶点着色器代码: "uniform mat4 uMVPMatrix;\n" + "attribute vec4 aPosition;\n" + "attribute vec2 aTextureCoordinate;\n" + "varying vec2 vTextureCoordinate;\n" + "void main() {\n" + " gl_Position = uMVPMatrix * aPosition;\n" + " vTextureCoordinate = aTextureCoordinate;\n" + "}"; 2)片段着色器代码: "precision mediump float;\n" + "uniform sampler2D uTexture;\n" + "varying vec2 vTextureCoordinate;\n" + "void main() {\n" + " gl_FragColor = texture2D(uTexture, vTextureCoordinate);\n" + "}";
    2023-04-14归属地:越南
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部