当前位置: 首页 > article >正文

OpenGL ES简述(1)

OpenGL ES简述(1)

简述

这个章节我们会来介绍一下OpenGL ES,学习OpenGL ES主要是为了了解GPU为我们提供了怎样的能力,Android系统中使用的是OpenGL ES,但是核心是一样的,了解OpenGL ES后我们可以对Android渲染有更深的理解。
Android上我们知道我们是通过Canvas来描述一个View需要渲染成什么效果的,其实Canvas的指令最终都是由Vulkan实现的,而现在新版本中的Android,Vulkan也会将渲染指令转化成OpenGL ES的指令,以便使用GPU渲染得到硬件加速。而对于3D的渲染则是直接使用OpenGL ES来实现的。

OpenGL 是什么,OpenGL ES和OpenGL的区别是什么?说简单一点其实OpenGL就是一个图形渲染库,它提供了一套渲染图形的接口,它可以用来控制GPU,使用GPU来根据我们的指令渲染图像,所以它的实现需要显卡厂商来实现,它则是一套通用标准,显卡厂商都会遵循它的标准提供这样的接口能力。
而OpenGL ES则是为移动设备定制的OpenGL,是OpenGL的一个子集,他们的核心其实差不多,只是api有一些不同。
还有一个缩写EGL,EGL其实是OpenGL ES的一套封装,他的目的是跨平台,也就是说,EGL提供的接口是一套平台无关的接口,可以在不同的操作系统上使用,比如Android和Linux。

涉及的概念

  • 顶点缓冲区
    顶点就是几何中的点,两个点可以确定一个线,三个点可以绘制一个三角形。顶点缓冲区就是用于存储顶点的,这个缓冲区指的是显存(显卡内存),我们买显卡的时候经常会会说显存16G之类的,GPU会使用自己的内存,即显存。而我们调用OpenGL的逻辑是在CPU上的,所以OpenGL提供了方法,创建顶点缓冲区就是在显卡上分配内存,我们会将顶点数据先放到顶点缓冲区,后续告诉GPU以一定的格式去读取顶点数据。
    顶点数据可以包含很多数据,位置,颜色,纹理等等,其实本质就是一段内存,想怎么用就看开发时候的需求,这个后面我们会详细讲。
  • 着色器(shader)
    着色器其实就是一段程序,只不过这段程序是给GPU执行的。
    我们主要去了解顶点着色器和片段着色器。
    在渲染的时候,每个像素都会执行一次顶点着色器和片段着色器,顶点着色器是用于计算位置信息的,而片段着色器是计算每个像素点需要渲染的颜色。
  • 统一变量
    统一变量用于CPU和GPU中的数据传递,顶点缓冲区的本质其实也是用于CPU和GPU的数据传递,区别就是统一变量每次渲染前设置后就是一个固定值,而顶点缓冲区每个顶点都可以设置一个值,这个描述可能有点难懂,后续我们在使用的时候会详细介绍。
  • 纹理
    纹理其实类似于Android里面的Bitmap,可以理解为图片,OpenGL如果需要渲染一张图片,则需要使用纹理来实现。
  • 相机/投影
    同样一个物体,我们在不同角度看,会不一样,我们的眼睛就好比一个相机,移动相机位置最终渲染的结果也会不同。另外OpenGL可以用来渲染3D图像,而我们最终呈现在屏幕上其实还是一个2D的图片,就需要一个透视的投影,2D的则是正交投影。其实这些都是通过一些线性代数的计算来获得结果的,通过将原来的坐标乘以一个特定的矩阵,进行一个映射得到结果。

涉及内容

我们将基于Android来举例学习OpenGL ES。
主要会介绍一下的内容:

  • 绘制一个三角形
  • EGL使用介绍
  • 顶点缓冲区的使用
  • 顶点着色器和片段着色器的使用
  • 索引缓冲区
  • 加载纹理
  • MVP(变换矩阵)

http://www.kler.cn/a/324418.html

相关文章:

  • 【软件测试】一个简单的自动化Java程序编写
  • 超全超详细使用SAM进行高效图像分割标注(GPU加速推理)
  • Zero、Zero-Offload、Zero-Infinity是什么
  • C++中特殊类设计/单例模式
  • Node.js GET/POST请求、WEB模块使用介绍 (基础介绍 八)
  • 【Redis】Redis的一些应用场景及使用策略
  • 如何使用 WebRTC 获取摄像头视频
  • 组播基础-2-IGMP协议
  • ★ C++进阶篇 ★ map和set
  • 个人健康管理小程序(源码+参考文档+定制)
  • python中序列化和反序列化
  • 一步一步优化一套生成式语言模型系统
  • docker简介、安装、基础知识
  • 基于webComponents的纯原生前端框架
  • Xcode 16 上传AppStore遇到第三方库 bitcode 的问题
  • Python爬虫bs4基本使用
  • Java编程基础:类与对象的探索之旅
  • C++学习笔记----8、掌握类与对象(一)---- 对象中的动态内存分配(6)
  • 【球形空间产生器】
  • 解决 Java 中由于 parallelStream 导致的死锁
  • BUG项目管理
  • 【MAC】安装realsense
  • HttpServletRequest简介
  • 美团中间件C++一面-面经总结
  • 25维谛技术面试最常见问题面试经验分享总结(包含一二三面题目+答案)
  • 基于两分支卷积和 Transformer 的轻量级多尺度特征融合超分辨率网络 !