@@ -96,14 +96,16 @@ GLES作为我们与着色器连接的工具类提供了丰富的api。了解一
9696
9797### 获取着色器程序内成员变量的id(句柄、指针)
9898
99- - mPostionHandler = GLES30.glGetAttribLocation(mProgram, "aPosition"):获取着色器程序中,指定为attribute类型的变量id。
100- - mMatrixHnadler = GLES30.glGetUniformLocation(mProgram, "uMVPMatrix"):获取着色器程序中,指定为uniform类型的变量id。
99+ ``` java
100+ mPostionHandler = GLES30 . glGetAttribLocation(mProgram, " aPosition" ): 获取着色器程序中,指定为attribute类型的变量id。
101+ mMatrixHnadler = GLES30 . glGetUniformLocation(mProgram, " uMVPMatrix" ): 获取着色器程序中,指定为uniform类型的变量id。
102+ ```
101103
102104### 向着色器传递数据
103105
104106上面获取到指向着色器中相应数据成员的各个id后,就能将我们要设置的顶点数据、颜色数据等传递到着色器中了。
105107
106- ```
108+ ``` java
107109// 将最终变换矩阵传入shader程序
108110GLES30 . glUniformMatrix4fv(muMVPMatrixHandle, 1 , false , MatrixState . getFinalMatrix(), 0 );
109111// 顶点位置数据传入着色器
@@ -117,18 +119,18 @@ GLES30.glVertexAttribPointer(maTextureHandle, 2, GLES20.GL_FLOAT, false, 20, mRe
117119### 定义顶点属性数组
118120
119121
120-
121- /**
122- * glVertexAttribPointer()方法的参数分别为:
123- * index:顶点属性的索引.(这里我们的顶点位置和颜色向量在着色器中分别为0和1)layout (location = 0) in vec4 vPosition; layout (location = 1) in vec4 aColor;
124- * size: 指定每个通用顶点属性的元素个数。必须是1、2、3、4。此外,glvertexattribpointer接受符号常量gl_bgra。初始值为4(也就是涉及颜色的时候必为4)。
125- * type:属性的元素类型。(上面都是Float所以使用GLES30.GL_FLOAT);
126- * normalized:转换的时候是否要经过规范化,true:是;false:直接转化;
127- * stride:跨距,默认是0。(由于我们将顶点位置和颜色数据分别存放没写在一个数组中,所以使用默认值0)
128- * ptr: 本地数据缓存(这里我们的是顶点的位置和颜色数据)。
129- */
130- GLES30.glVertexAttribPointer(1, 4, GLES30.GL_FLOAT, false, 0, colorBuffer);
131-
122+ ``` java
123+ /**
124+ * glVertexAttribPointer()方法的参数分别为:
125+ * index:顶点属性的索引.(这里我们的顶点位置和颜色向量在着色器中分别为0和1)layout (location = 0) in vec4 vPosition; layout (location = 1) in vec4 aColor;
126+ * size: 指定每个通用顶点属性的元素个数。必须是1、2、3、4。此外,glvertexattribpointer接受符号常量gl_bgra。初始值为4(也就是涉及颜色的时候必为4)。
127+ * type:属性的元素类型。(上面都是Float所以使用GLES30.GL_FLOAT);
128+ * normalized:转换的时候是否要经过规范化,true:是;false:直接转化;
129+ * stride:跨距,默认是0。(由于我们将顶点位置和颜色数据分别存放没写在一个数组中,所以使用默认值0)
130+ * ptr: 本地数据缓存(这里我们的是顶点的位置和颜色数据)。
131+ */
132+ GLES30 . glVertexAttribPointer(1 , 4 , GLES30. GL_FLOAT , false , 0 , colorBuffer);
133+ ```
132134
133135### 启用或禁用顶点属性数组
134136
@@ -138,13 +140,15 @@ GLES30.glVertexAttribPointer(maTextureHandle, 2, GLES20.GL_FLOAT, false, 20, mRe
138140
139141Matrix就是专门设计出来帮助我们简化矩阵和向量运算操作的,里面所有的实现原理都是线性代数中的运算。
140142
141- 我们知道OpenGl中实现图形的操作大量使用了矩阵,在OpenGL中使用的向量为列向量,我们通过利用矩阵与列向量(颜色、坐标都可看做列向量)相乘,得到一个新的列向量。利用这点,我们构建一个的矩阵,与图形所有的顶点坐标坐标相乘,得到新的顶点坐标集合,当这个矩阵构造恰当的话,新得到的顶点坐标集合形成的图形相对原图形就会出现平移、旋转、缩放或拉伸、抑或扭曲的效果。Matrix是专门为处理4* 4矩阵和4元素向量设计的,其中的方法都是static的,不需要初始化Matrix实例。
143+ 我们知道OpenGl中实现图形的操作大量使用了矩阵,在OpenGL中使用的向量为列向量,我们通过利用矩阵与列向量(颜色、坐标都可看做列向量)相乘,得到一个新的列向量。
144+ 利用这点,我们构建一个的矩阵,与图形所有的顶点坐标坐标相乘,得到新的顶点坐标集合,当这个矩阵构造恰当的话,新得到的顶点坐标集合形成的图形相对原图形就会出现平移、旋转、缩放或拉伸、抑或扭曲的效果。
145+ Matrix是专门为处理4* 4矩阵和4元素向量设计的,其中的方法都是static的,不需要初始化Matrix实例。
142146
143147- multiplyMM
144148
145149 两个4x4矩阵相乘,并将结果存储到第三个4x4矩阵中。
146150
147- ```
151+ ``` java
148152 public static native void multiplyMM(float [] result, int resultOffset,
149153 float [] lhs, int lhsOffset, float [] rhs, int rhsOffset);
150154 ```
@@ -153,7 +157,7 @@ Matrix就是专门设计出来帮助我们简化矩阵和向量运算操作的
153157
154158 将一个4x4矩阵和一个四元素向量相乘,得到一个新的四元素向量
155159
156- ```
160+ ``` java
157161 public static native void multiplyMV(float [] resultVec,int resultVecOffset,
158162 float [] lhsMat, int lhsMatOffset,
159163 float [] rhsVec, int rhsVecOffset);
@@ -164,21 +168,29 @@ Matrix就是专门设计出来帮助我们简化矩阵和向量运算操作的
164168 获取逆矩阵
165169
166170
171+ ### 相机
167172
168173顶点着色器可赋予程序员一次操作一个顶点(“按顶点”处理)的能力,片段着色器(稍后会看到)可赋予程序员一次操作一个像素(“按片段”处理)的能力,几何着色器可赋予程序员一次操作一个图元(“按图元”处理)的能力。
169174
170175到目前为止,我们所接触的变换矩阵全都可以在3D空间中操作。但是,我们最终需要将3D空间或它的一部分展示在2D显示器上。为了达成这个目标,我们需要找到一个有利点。正如我们在现实世界通过眼睛从一点观察一样,我们也必须找到一点并确立观察方向作为我们观察虚拟世界的窗口。这个点叫作视图或视觉空间,或“合成相机”(简称相机)。
171176
172- 观察3D世界需要:(a)将相机放入世界的某个位置;(b)调整相机的角度,通常需要一套它自己的直角坐标轴u、v、n(由向量U,V,N构成);(c)定义一个视体(view volume);(d)将视体内的对象投影到投影平面(projection plane)上。
177+ 观察3D世界需要:
178+ - 将相机放入世界的某个位置;
179+ - 调整相机的角度,通常需要一套它自己的直角坐标轴u、v、n(由向量U,V,N构成);
180+ - 定义一个视体(view volume);(d)将视体内的对象投影到投影平面(projection plane)上。
173181
174182![ image] ( https://raw.githubusercontent.com/CharonChui/Pictures/master/opengl_eye.jpg?raw=true )
175183
176- OpenGL有一个固定在原点(0,0,0)并朝向z轴负方向的相机,如下图所示。
184+ OpenGL有一个固定在原点(0,0,0)并朝向z轴负方向的相机,如下图所示:
185+
177186![ image] ( https://raw.githubusercontent.com/CharonChui/Pictures/master/opengl_eye_00.jpg?raw=true )
178- 为了应用OpenGL相机,我们需要将它移动到适合的位置和方向。我们需要先找出在世界中的物体与我们期望的相机位置的相对位置(如物体应该在由图3.12所示相机U、V、N向量定义的“相机空间”中的位置)。给定世界空间中的点PW,我们需要通过变换将它转换成相应相机空间中的点,从而让它看起来好像是从我们期望的相机位置CW看到的样子。我们通过计算它在相机空间中的位置PC实现。已知OpenGL相机位置永远固定在点(0,0,0),那么我们如何变换来实现上述功能?
179- ![ image] ( https://raw.githubusercontent.com/CharonChui/Pictures/master/opengl_eye_01.jpg?raw=true )
180187
181- 当我们设置好相机之后,就可以学习投影矩阵了。我们需要学习的两个重要的投影矩阵:透视投影矩阵和正射投影矩阵。透视投影通过使用透视概念模仿我们看真实世界的方式,尝试让2D图像看起来像是3D的。物体近大远小,3D空间中有的平行线用透视法画出来就不再平行。我们可以通过使用变换矩阵将平行线变为恰当的不平行线来实现这个效果,这个矩阵叫作透视矩阵或者透视变换。
188+ 为了应用OpenGL相机,我们需要将它移动到适合的位置和方向。我们需要先找出在世界中的物体与我们期望的相机位置的相对位置。
189+ 给定世界空间中的点PW,我们需要通过变换将它转换成相应相机空间中的点,从而让它看起来好像是从我们期望的相机位置CW看到的样子。
190+
191+
192+ 当我们设置好相机之后,就可以学习投影矩阵了。我们需要学习的两个重要的投影矩阵:透视投影矩阵和正射投影矩阵。
193+ 透视投影通过使用透视概念模仿我们看真实世界的方式,尝试让2D图像看起来像是3D的。物体近大远小,3D空间中有的平行线用透视法画出来就不再平行。我们可以通过使用变换矩阵将平行线变为恰当的不平行线来实现这个效果,这个矩阵叫作透视矩阵或者透视变换。
182194
183195在正射投影中,平行线仍然是平行的,即不使用透视,如下图所示。正射与透视相反,在视体中的物体不因其与相机的距离而改变,可以直接投影。正射投影是一种平行投影,其中所有的投影过程都沿与投影平面垂直的方向进行。
184196![ image] ( https://raw.githubusercontent.com/CharonChui/Pictures/master/opengl_zheng.jpg?raw=true )
0 commit comments