跳转到主要内容

OpenGL ES ——概念整理

demi 提交于

<font size="4" style="line-height: 50px;"><strong>1 . 基础</strong></font>

<table border="1" style="padding: 10px;">
<tr><th style="padding: 10px;">基础</th><th style="padding: 10px;">概念</th></tr>
<tr><td style="padding: 10px;">CPU</td><td style="padding: 10px;">CPU的结构大概是,20%运算(Compute)单元,80%逻辑(Logic)单元</td></tr>
<tr><td style="padding: 10px;">GPU</td><td style="padding: 10px;">100%运算单元</td></tr></table><br>

<center><a href="http://imgtec.eetrend.com/files/2019-01/%E5%8D%9A%E5%AE%A2/100017450-58… width="600" src="http://imgtec.eetrend.com/files/2019-01/%E5%8D%9A%E5%AE%A2/100017450-58…; alt=""></a></center>

<font size="4" style="line-height: 50px;"><strong>2 . 图形渲染管线</strong></font>

<table border="1" style="padding: 10px;">
<tr><th style="padding: 10px;">图形渲染管线</th><th style="padding: 10px;">概念</th></tr>
<tr><td style="padding: 10px;">顶点着色器</td><td style="padding: 10px;">它把一个单独的顶点作为输入</td></tr>
<tr><td style="padding: 10px;">图元装配</td><td style="padding: 10px;">将顶点着色器输出的所有顶点作为输入,并所有的点装配成指定图元的形状,比如三角形</td></tr>
<tr><td style="padding: 10px;">几何着色器</td><td style="padding: 10px;">几何着色器把图元形式的一系列顶点的集合作为输入,它可以通过产生新顶点构造出新的图元来生成其他形状</td></tr>
<tr><td style="padding: 10px;">光栅化</td><td style="padding: 10px;">把图元映射为最终屏幕上相应的像素,生成供片段着色器(Fragment Shader)使用的片段(Fragment)。
在片段着色器运行之前会执行裁切(Clipping),裁切会丢弃超出你的视图以外的所有像素,用来提升执行效率</td></tr>
<tr><td style="padding: 10px;">片元着色器</td><td style="padding: 10px;">是计算一个像素的最终颜色,这也是所有OpenGL高级效果产生的地方。
通常,片段着色器包含3D场景的数据(比如光照、阴影、光的颜色等等),这些数据可以被用来计算最终像素的颜色</td></tr>
<tr><td style="padding: 10px;">Alpha测试与混合</td><td style="padding: 10px;">这个阶段检测片段的对应的深度,用它们来判断这个像素是其它物体的前面还是后面,决定是否应该丢弃。
这个阶段也会检查alpha值(alpha值定义了一个物体的透明度)并对物体进行混合(Blend)</td></tr></table><br>

<font size="4" style="line-height: 50px;"><strong>3 . 对象</strong></font>

<table border="1" style="padding: 10px;">
<tr><th style="padding: 10px;">对象</th><th style="padding: 10px;">概念</th></tr>
<tr><td style="padding: 10px;">VBO</td><td style="padding: 10px;">顶点数组对象</td></tr>
<tr><td style="padding: 10px;">VAO</td><td style="padding: 10px;">顶点缓冲对象</td></tr>
<tr><td style="padding: 10px;">EBO</td><td style="padding: 10px;">索引缓冲对象</td></tr>
<tr><td style="padding: 10px;">RBO</td><td style="padding: 10px;">渲染缓冲对象(Renderbuffer Object),一个可用的帧缓冲附件类型,渲染缓冲对象是一个真正的缓冲,即一系列的字节、整数、像素等,渲染缓冲对象附加的好处是,它会将数据储存为OpenGL原生的渲染格式,它是为离屏渲染到帧缓冲优化过的</td></tr>
<tr><td style="padding: 10px;">FBO</td><td style="padding: 10px;">用于写入颜色值的颜色缓冲、用于写入深度信息的深度缓冲和允许我们根据一些条件丢弃特定片段的模板缓冲。这些缓冲结合起来叫做帧缓冲</td></tr></table><br>

<font size="4" style="line-height: 50px;"><strong>4 . 纹理</strong></font>

<table border="1" style="padding: 10px;">
<tr><th style="padding: 10px;">纹理</th><th style="padding: 10px;">概念</th></tr>
<tr><td style="padding: 10px;">纹理</td><td style="padding: 10px;">物体表面的图案</td></tr>
<tr><td style="padding: 10px;">纹理环绕方式</td><td style="padding: 10px;">纹理坐标的范围通常是从(0, 0)到(1, 1),那如果我们把纹理坐标设置在范围之外的循环,分为<code>GL_REPEAT</code>,<code>GL_MIRRORED_REPEAT</code>,<code>GL_CLAMP_TO_EDGE</code>,<code>GL_CLAMP_TO_BORDER</code></td></tr>
<tr><td style="padding: 10px;">纹理过滤(Texture Filtering)</td><td style="padding: 10px;">分辨率很低的时候,我们把纹理像素映射到纹理坐标。分为邻近过滤(Nearest Neighbor Filtering)和线性过滤((Bi)linear Filtering)</td></tr>
<tr><td style="padding: 10px;">多重渐远纹理</td><td style="padding: 10px;">它简单来说就是一系列的纹理图像,后一个纹理图像是前一个的二分之一。多级渐远纹理背后的理念很简单:距观察者的距离超过一定的阈值,OpenGL会使用不同的多级渐远纹理,即最适合物体的距离的那个</td></tr>
<tr><td style="padding: 10px;">纹理单元</td><td style="padding: 10px;">OpenGL至少保证有16个纹理单元供你使用,也就是说你可以激活从<code>GL_TEXTURE0</code>到<code>GL_TEXTRUE15</code>。它们都是按顺序定义的,所以我们也可以通过<code>GL_TEXTURE0 + 8</code>的方式获得<code>GL_TEXTURE8</code>,这在当我们需要循环一些纹理单元的时候会很有用</td></tr></table><br>

<font size="4" style="line-height: 50px;"><strong>5 . 坐标系统</strong></font>

<table border="1" style="padding: 10px;">
<tr><th style="padding: 10px;">坐标系统</th><th style="padding: 10px;">概念</th></tr>
<tr><td style="padding: 10px;">局部空间(Local Space)</td><td style="padding: 10px;">局部坐标是对象相对于局部原点的坐标,也是物体起始的坐标</td></tr>
<tr><td style="padding: 10px;">世界空间(World Space)</td><td style="padding: 10px;">世界空间坐标是处于一个更大的空间范围的。这些坐标相对于世界的全局原点,它们会和其它物体一起相对于世界的原点进行摆放</td></tr>
<tr><td style="padding: 10px;">观察空间(View Space)</td><td style="padding: 10px;">每个坐标都是从摄像机或者说观察者的角度进行观察的</td></tr>
<tr><td style="padding: 10px;">裁剪空间(Clip Space)</td><td style="padding: 10px;">裁剪坐标会被处理至-1.0到1.0的范围内,并判断哪些顶点将会出现在屏幕上</td></tr>
<tr><td style="padding: 10px;">屏幕空间(Screen Space)</td><td style="padding: 10px;">视口变换(Viewport Transform)的过程。视口变换将位于-1.0到1.0范围的坐标变换到由glViewport函数所定义的坐标范围内。最后变换出来的坐标将会送到光栅器,将其转化为片段</td></tr></table><br>

<font size="4" style="line-height: 50px;"><strong>6 . 摄像机</strong></font>

<table border="1" style="padding: 10px;">
<tr><th style="padding: 10px;">摄像机</th><th style="padding: 10px;">概念</th></tr>
<tr><td style="padding: 10px;">LookAt矩阵</td><td style="padding: 10px;">&nbsp; </td></tr>
<tr><td style="padding: 10px;">欧拉角</td><td style="padding: 10px;">被定义为偏航角(Yaw),俯仰角(Pitch),和滚转角(Roll)从而允许我们通过这三个值构造任何3D方向</td></tr></table><br>

本文摘自:<a href="http://www.iosxxx.com/blog/2017-09-29-OpenGLES%E4%B9%8B%E5%9F%BA%E7%A1%…;