@@ -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---
0 commit comments