Skip to content

Commit 973889f

Browse files
committed
update
1 parent 7ddae18 commit 973889f

8 files changed

+178
-47
lines changed

VideoDevelopment/OpenGL/1.OpenGL简介.md

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,9 @@ OpenGL ES 3.0兼容了2.0,并丰富了更多功能。
5353

5454
OpenGL渲染管线的流程为: 顶点数据 -> 顶点着色器 -> 图元装配 -> 几何着色器 -> 光栅化 -> 片段着色器 -> 逐片段处理 -> 帧缓冲
5555

56-
如下图,阴影的表示OpenGL ES 3.0管线中可编程阶段。
56+
OpenGL ES 3.0实现了具有可编程着色功能的图形管线,有两个规范组成:OpenGL ES3.0 API规范和OpenGL ES着色语言3.0规范(OpenGL ES SL)。
57+
58+
如下图,展示了OpenGL ES 3.0的图形管线。阴影的表示OpenGL ES 3.0管线中可编程阶段。
5759

5860
![](https://raw.githubusercontent.com/CharonChui/Pictures/master/oepngl_es_pip.jpg)
5961

@@ -65,7 +67,6 @@ OpenGL渲染管线的流程为: 顶点数据 -> 顶点着色器 -> 图元装配
6567

6668
着色器(shader)是在GPU上运行的小程序。从名称可以看出,可通过处理它们来处理顶点。此程序使用OpenGL ES SL语言来编写。它是一个描述顶点或像素特性的简单程序。OpenGL最本质的概念之一就是着色器,它是图形硬件设备所执行的一类特殊函数。理解着色器最好的办法就是把它看做是专为图形处理单元(即GPU)编译的一种小型程序。任何一种OpenGL程序本质上都可以被分为两部分:CPU端运行的部分,采用C++、Java之类的语言编写;以及GPU端运行的部分,使用GLSL语言编写。
6769

68-
顶点着色器可以操作的属性有: 位置、颜色、纹理坐标,但是不能创建新的顶点。最终产生纹理坐标、颜色、点位置等信息送往后续阶段。
6970

7071
- 图元装配(Primitive Assembly)
7172

@@ -170,6 +171,8 @@ OpenGL是一个仅仅关注图像渲染的图像接口库,在渲染过程中
170171

171172
### EGL
172173

174+
OpenGL ES API没有提及如何创建渲染上下文,或者渲染上下文如何连接到原生窗口系统。EGL是Khronos渲染API(如OpenGL ES)和原生窗口系统之间的接口。
175+
173176
在OpenGL的设计中,OpenGL是不负责管理窗口的,窗口的管理交由各个设备自己完成。具体的来说就是iOS平台上使用EAGL提供本地平台对OpenGL的实现,在Android平台上使用EGL提供本地平台对OpenGL的实现。OpenGL其实是通过GPU进行渲染。但是我们的程序是运行在CPU上,要与GPU关联,这就需要通过EGL,它相当于Android上层应用于GPU通讯的中间层。
174177

175178
EGL为双缓冲工作模式,既有一个Back Frame Buffer和一个Front Frame Buffer,正常绘制的目标都是Back Frame Buffer,绘制完成后再调用eglSwapBuffer API,将绘制完毕的FrameBuffer交换到Front Frame Buffer并显示出来。
@@ -200,9 +203,7 @@ EGL为双缓冲工作模式,既有一个Back Frame Buffer和一个Front Frame
200203

201204
eglMakeCurrent(EGLDisplay display, EGLSurface draw, EGLSurface read, EGLContext context);该方法的参数意义很明确,该方法在异步线程中被调用,该线程也会被成为GL线程,一旦设定后,所有OpenGL渲染相关的操作都必须放在该线程中执行。
202205

203-
通过上述操作,就完成了EGL的初始化设置,便可以进行OpenGL的渲染操作。
204-
205-
206+
通过上述操作,就完成了EGL的初始化设置,便可以进行OpenGL的渲染操作。所有EGL命令都是以egl前缀开始,对组成命令名的每个单词使用首字母大写(如eglCreateWindowSurface)。
206207

207208
#### OpenGL纹理
208209

@@ -229,7 +230,7 @@ Android 框架中有如下两个基本类,用于通过 OpenGL ES API 来创建
229230

230231

231232

232-
233+
233234
[下一篇: 2.GLSurfaceView简介](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/2.GLSurfaceView%E7%AE%80%E4%BB%8B.md)
234235

235236
---

VideoDevelopment/OpenGL/10.GLSurfaceView+MediaPlayer播放视频.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ public class VideoActivity extends Activity {
114114

115115

116116

117-
[上一篇: 9.OpenGL ES纹理](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/9.OpenGL%20ES%E7%BA%B9%E7%90%86.md)
117+
[上一篇: 9.OpenGL ES纹理](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/9.OpenGL%20ES%E7%BA%B9%E7%90%86.md)
118118
[下一篇: 11.OpenGL ES滤镜](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/11.OpenGL%20ES%E6%BB%A4%E9%95%9C.md)
119119

120120
---

VideoDevelopment/OpenGL/11.OpenGL ES滤镜.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ RGB三个通道的颜色取反,而alpha通道不变。
2727

2828

2929

30-
[上一篇: 10.GLSurfaceView+MediaPlayer播放视频](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/10.GLSurfaceView%2BMediaPlayer%E6%92%AD%E6%94%BE%E8%A7%86%E9%A2%91.md)
30+
[上一篇: 10.GLSurfaceView+MediaPlayer播放视频](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/10.GLSurfaceView%2BMediaPlayer%E6%92%AD%E6%94%BE%E8%A7%86%E9%A2%91.md)
3131

3232
---
3333

VideoDevelopment/OpenGL/5.OpenGL ES绘制三角形.md

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ OpenGL ES的绘制需要有以下步骤:
99
- 顶点着色器
1010

1111
```glsl
12-
#version 330 core
12+
#version 300 core
1313
layout (location = 0) in vec3 position;
1414
1515
void main()
@@ -22,7 +22,9 @@ OpenGL ES的绘制需要有以下步骤:
2222

2323
下一步,使用in关键字,在顶点着色器中声明所有的输入顶点属性(Input Vertex Attribute)。现在我们只关心位置(Position)数据,所以我们只需要一个顶点属性。GLSL有一个向量数据类型,它包含1到4个float分量,包含的数量可以从它的后缀数字看出来。由于每个顶点都有一个3D坐标,我们就创建一个vec3输入变量position。我们同样也通过layout (location = 0)设定了输入变量的位置值(Location)你后面会看到为什么我们会需要这个位置值。
2424

25-
为了设置顶点着色器的输出,我们必须把位置数据赋值给预定义的gl_Position变量,它在幕后是vec4类型的。在main函数的最后,我们将gl_Position设置的值会成为该顶点着色器的输出。由于我们的输入是一个3分量的向量,我们必须把它转换为4分量的。我们可以把vec3的数据作为vec4构造器的参数,同时把w分量设置为1.0f(我们会在后面解释为什么)来完成这一任务。
25+
为了设置顶点着色器的输出,我们必须把位置数据赋值给预定义的gl_Position变量,它在幕后是vec4类型的。在main函数中只是将position的值转换后赋值给gl_Position。由于我们的输入是一个3分量的向量,我们必须把它转换为4分量的。我们可以把vec3的数据作为vec4构造器的参数,同时把w分量设置为1.0f(我们会在后面解释为什么)来完成这一任务。
26+
27+
这个position的值是哪里进行赋值的呢? 是通过后面java代码中的draw函数来进行赋值的。每个顶点着色器都必须在gl_Position变量中输出一个位置。这个变量定义传递给管线下一个阶段的位置。
2628

2729
- 编译着色器
2830

@@ -33,14 +35,14 @@ OpenGL ES的绘制需要有以下步骤:
3335
片断着色器全是关于计算你的像素最后的颜色输出。颜色使用RGBA。
3436

3537
```glsl
36-
#version 330 core
38+
#version 300 core
3739
out vec4 color;
3840
void main() {
3941
color = vec4(1.0f, 0.5f, 0.2f, 1.0f);
4042
}
4143
```
4244

43-
片段着色器只需要一个输出变量,这个变量是一个4分量向量,它表示的是最终的输出颜色,我们应该自己将其计算出来。我们可以用out关键字声明输出变量,这里我们命名为color。下面,我们将一个alpha值为1.0(1.0代表完全不透明)的橘黄色的vec4赋值给颜色输出。之后也是需要编译着色器。
45+
片段着色器只需要一个输出变量,这个变量是一个4分量向量,它表示的是最终的输出颜色,我们应该自己将其计算出来。我们可以用out关键字声明输出变量,这里我们命名为color。下面,我们将一个alpha值为1.0(1.0代表完全不透明)的橘黄色的vec4赋值给颜色输出。之后也是需要编译着色器。片段着色器声明的这个输出变量color的值会被输出到颜色缓冲区。,然后颜色缓冲区再通过EGL窗口显示。
4446

4547
- 着色器程序(Shader Program Object)
4648

@@ -54,7 +56,7 @@ OpenGL ES的绘制需要有以下步骤:
5456
glLinkProgram(shaderProgram);
5557
```
5658

57-
链接完后需要使用glUseProgram方法,用刚创建的程序对象作为参数,以激活这个程序对象。
59+
链接完后需要使用glUseProgram方法,用刚创建的程序对象作为参数,以激活这个程序对象。调用glUserProgram方法后,所有后续的渲染将用连接到这个程序对象的顶点和片段着色器进行。
5860

5961
- 链接顶点属性
6062

@@ -84,12 +86,13 @@ OpenGL ES的绘制需要有以下步骤:
8486

8587
下面需要实现GLSurfaceView.Render接口,实现要绘制的部分:
8688

89+
- 用EGL创建屏幕上的渲染表面(GLSurfaceView内部实现)
8790
- 写顶点着色器和片段着色器文件。
8891
- 加载编译顶点着色器和片段着色器。
8992
- 确定需要绘制图形的坐标和颜色数据。
9093
- 创建program对象,连接顶点和片断着色器,将坐标数据、颜色数据传到OpenGL ES程序中。]
9194
- 设置视图窗口(viewport)。
92-
- 使颜色缓冲区的内容显示到屏幕上
95+
- 使颜色缓冲区的内容显示到EGL窗口上
9396

9497

9598

@@ -252,7 +255,7 @@ class MyGLRenderer implements GLSurfaceView.Renderer {
252255
}
253256
public void onDrawFrame(GL10 unused) {
254257
/**********6.绘制************/
255-
//把颜色缓冲区设置为我们预设的颜色
258+
//把颜色缓冲区设置为我们预设的颜色,绘图设计到多种缓冲区类型:颜色、深度和模板。这里只是向颜色缓冲区中绘制图形
256259
GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT);
257260

258261
//绑定vertex坐标数据,告诉OpenGL可以在缓冲区vertextBuffer中获取数据
@@ -262,7 +265,7 @@ class MyGLRenderer implements GLSurfaceView.Renderer {
262265

263266
//准备颜色数据
264267
/**
265-
* glVertexAttribPointer()方法的参数分别为:
268+
* glVertexAttribPointer()方法的参数上面的也说过了,这里再按照这个场景说一下分别为:
266269
* index:顶点属性的索引.(这里我们的顶点位置和颜色向量在着色器中分别为0和1)layout (location = 0) in vec4 vPosition; layout (location = 1) in vec4 aColor;
267270
* size: 指定每个通用顶点属性的元素个数。必须是1、2、3、4。此外,glvertexattribpointer接受符号常量gl_bgra。初始值为4(也就是涉及颜色的时候必为4)。
268271
* type:属性的元素类型。(上面都是Float所以使用GLES30.GL_FLOAT);
@@ -860,8 +863,7 @@ class TriangleRender implements GLSurfaceView.Renderer {
860863

861864

862865

863-
864-
[上一篇: 4.GLTextureView实现](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/4.GLTextureView%E5%AE%9E%E7%8E%B0.md)
866+
[上一篇: 4.GLTextureView实现](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/4.GLTextureView%E5%AE%9E%E7%8E%B0.md)
865867
[下一篇: 6.OpenGL ES绘制矩形及圆形](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/6.OpenGL%20ES%E7%BB%98%E5%88%B6%E7%9F%A9%E5%BD%A2%E5%8F%8A%E5%9C%86%E5%BD%A2.md)
866868

867869
---

VideoDevelopment/OpenGL/6.OpenGL ES绘制矩形及圆形.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,7 @@ public class CircularRender implements GLSurfaceView.Renderer {
500500
```
501501

502502

503-
[上一篇: 5.OpenGL ES绘制三角形](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/5.OpenGL%20ES%E7%BB%98%E5%88%B6%E4%B8%89%E8%A7%92%E5%BD%A2.md
503+
[上一篇: 5.OpenGL ES绘制三角形](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/5.OpenGL%20ES%E7%BB%98%E5%88%B6%E4%B8%89%E8%A7%92%E5%BD%A2.md)
504504
[下一篇: 7.OpenGL ES着色器语言GLSL](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/7.OpenGL%20ES%E7%9D%80%E8%89%B2%E5%99%A8%E8%AF%AD%E8%A8%80GLSL.md)
505505

506506
---

VideoDevelopment/OpenGL/7.OpenGL ES着色器语言GLSL.md

Lines changed: 39 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 7.OpenGL ES着色器语言GLSL
22

3-
顶点着色器:
3+
### 顶点着色器:
44

55
```
66
#version 330 core
@@ -15,7 +15,24 @@ void main()
1515
}
1616
```
1717

18-
片段着色器:
18+
顶点着色器的输入包括:
19+
20+
- 属性:用顶点数组提供的逐顶点数据
21+
- 统一变量和统一变量缓冲区:顶点着色器使用的不变数据
22+
- 采样器:代表顶点着色器使用的纹理的特殊统一变量类型
23+
- 着色器程序:顶点着色器程序源代码或者描述在操作顶点的可执行文件
24+
25+
顶点着色器的输出称作顶点着色器输出变量。在图元光栅化阶段,为每个生成的片段计算这些变量,并作为片段着色器的输入传入。
26+
27+
内建变量包括:
28+
29+
- gl_VertexID: 一个输入变量,用于保存顶点的整数索引。
30+
- gl_InstanceID:一个输入变量,用于保存实例化绘图调用中图元的实例编号。
31+
- gl_Position:用于输出顶点位置的裁剪坐标。
32+
- gl_PointSize:用于写入以像素标示的点尺寸。
33+
- gl_FrontFacing:一个特殊变量,但不是由顶点着色器直接写入的,而是根据顶点着色器生成的位置值和渲染的图元类型生成的。
34+
35+
### 片段着色器:
1936

2037
```
2138
#version 330 core
@@ -29,7 +46,16 @@ void main()
2946
}
3047
```
3148

49+
片段着色器为片段操作提供了通用功能的可编程方法。片段着色器的输入由以下部分组成:
3250

51+
- 输入(或者可变值):顶点着色器生成的插值数据。顶点着色器输出跨图元进行插值,并作为输入传递给片段着色器。
52+
- 统一变量:片段着色器使用的状态,这些常量值在每个片段上不会变化。
53+
- 采样器:用于访问着色器中的纹理图像。
54+
- 代码:片段着色器源代码或者二进制代码,描述在片段上执行的操作。
55+
56+
片段着色器的输出是一个或者多个片段颜色,传递到管线的逐片段操作部分。
57+
58+
内建变量: gl_FragCoord:片段着色器中的一个只读变量。这个变量保存片段的窗口相对坐标。
3359

3460
### GLSL的特点
3561

@@ -81,9 +107,9 @@ GLSL中的数据类型主要分为标量、向量、矩阵、采样器、结构
81107
### 变量修饰符
82108

83109
- none:(默认的可省略)本地变量,可读可写,函数的输入参数既是这种类型
84-
- const:声明变量或函数的参数为只读类型
85-
- attribute:用于保存顶点或法线数据,它可以在数据缓冲区中读取数据,仅能用于顶点着色器
86-
- uniform:在运行时 shader 无法改变 uniform 变量,一般用来放置程序传递给 shader 的变换矩阵,材质,光照参数等等,可用于顶点着色器和片元着色器
110+
- const:常量
111+
- attribute:一般用于各个顶点各不相同的量。如顶点颜色、坐标等。用于保存顶点或法线数据,它可以在数据缓冲区中读取数据,仅能用于顶点着色器
112+
- uniform:统一变量。统一变量存储应用程序通过OpenGL ES API传入着色器的只读值。在运行时 shader 无法改变 uniform 变量,一般用来放置程序传递给 shader 的变换矩阵,材质,光照参数等等,可用于顶点着色器和片元着色器。如果统一变量在顶点着色器和片段着色器中均有声明,则声明的类型必须相同,且两个着色器中的值也需要相同。
87113
- varying:易变量,用于修饰从顶点着色器向片元着色器传递的变量。一般是在光栅化图元的过程中计算生成,记录在每个片段中(而不是从顶点着色器直接传递给片元着色器)
88114

89115

@@ -98,26 +124,17 @@ GLSL中的数据类型主要分为标量、向量、矩阵、采样器、结构
98124

99125
GLSL的类型转换与C不同。在GLSL中类型不可以自动提升,比如float a=1;就是一种错误的写法,必须严格的写成float a=1.0,也不可以强制转换,即float a=(float)1;也是错误的写法,但是可以用内置函数来进行转换,如float a=float(1);还有float a=float(true);(true为1.0,false为0.0)等,值得注意的是,低精度的int不能转换为低精度的float
100126

101-
### 限定符
102-
103-
与Java中的限定符类似,放在变量类型前面,并且只能用于全局变量。
104-
105-
- attritude:一般用于各个顶点各不相同的量。如顶点颜色、坐标等。
106-
- uniform:一般用于对于3D物体中所有顶点都相同的量。比如光源位置,统一变换矩阵等。
107-
- varying:表示易变量,一般用于顶点着色器传递到片元着色器的量。
108-
- const:常量。
109-
110-
- 流程控制
127+
### 流程控制
111128

112-
常用的与java基本一样
129+
常用的与java基本一样
113130

114-
- 函数
131+
### 函数
115132

116-
定义函数的方式也与C语言基本相同。函数的返回值可以是GLSL中的除了采样器的任意类型。对于GLSL中函数的参数,可以用参数用途修饰符来进行修饰,常用修饰符如下:
133+
定义函数的方式也与C语言基本相同。函数的返回值可以是GLSL中的除了采样器的任意类型。对于GLSL中函数的参数,可以用参数用途修饰符来进行修饰,常用修饰符如下:
117134

118-
- in:输入参数,无修饰符时默认为此修饰符。
119-
- out:输出参数。
120-
- inout:既可以作为输入参数,又可以作为输出参数。
135+
- in:输入参数,无修饰符时默认为此修饰符。
136+
- out:输出参数。
137+
- inout:既可以作为输入参数,又可以作为输出参数。
121138

122139
- 浮点精度
123140

@@ -205,7 +222,7 @@ GLSL的类型转换与C不同。在GLSL中类型不可以自动提升,比如fl
205222

206223

207224

208-
[上一篇: 6.OpenGL ES绘制矩形及圆形](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/6.OpenGL%20ES%E7%BB%98%E5%88%B6%E7%9F%A9%E5%BD%A2%E5%8F%8A%E5%9C%86%E5%BD%A2.md)
225+
[上一篇: 6.OpenGL ES绘制矩形及圆形](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/6.OpenGL%20ES%E7%BB%98%E5%88%B6%E7%9F%A9%E5%BD%A2%E5%8F%8A%E5%9C%86%E5%BD%A2.md)
209226
[下一篇: 8.GLES类及Matrix类](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/8.GLES%E7%B1%BB%E5%8F%8AMatrix%E7%B1%BB.md)
210227

211228
---

0 commit comments

Comments
 (0)