06|移动平台的视频渲染(三):OpenGL ES实操
GLSL 语法与内建函数
- 深入了解
- 翻译
- 解释
- 总结
本文深入介绍了移动平台视频渲染中的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归属地:越南