本文译自:http://developer.android.com/guide/topics/graphics/opengl.html
在OpenGL ES 2.0中的投影和照相视图
在ES 2.0的API中,首先要通过把一个矩阵成员添加给图形对象顶部的着色器(Vertex Shaders)来使用投影和照相视图。然后,这个被添加的矩阵成员能够生成并把投影和照相视图应用给图形对象。
1. 给顶层着色器(Vertex Shaders)添加矩阵---给视图投影矩阵创建一个有效的,并且要把它作为着色位置的倍增器。在下面的代码中,包含的uMVPMatrix成员允许把投影和照相视图的矩阵应用到使用该着色器的图形对象的坐标上:
privatefinalString vertexShaderCode =
// This matrix member variable provides a hook to manipulate
// the coordinates of objects that use this vertex shader
"uniform mat4 uMVPMatrix; \n"+
"attribute vec4 vPosition; \n"+
"void main(){ \n"+
// the matrix must be included as part of gl_Position
" gl_Position = uMVPMatrix * vPosition; \n"+
"} \n";
注意:在上例的顶层着色器(Vertex Shader)中定义了一个单一变换矩阵,你可以把投影矩阵和照相视图矩阵一起组合到这个变换矩阵中。根据应用程序的需要,也可以在顶层着色器(Vertex Shader)中分别定义投影矩阵和照相视图矩阵,这样就可以分别对它们进行改变。
2. 访问着色器矩阵---在顶层着色器(Veterx Shader)中创建了一个应用于投影和照相视图的回调之后,就能够访问这个应用于投影矩阵和照相视图矩阵的变量。下面的代码显示了如何编辑GLSurfaceView.Renderer类onSurfaceCreated()方法,来实现对定义在Vertex Shader中的矩阵变量的访问。
publicvoid onSurfaceCreated(GL10 unused,EGLConfig config){
...
muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram,"uMVPMatrix");
...
}
3. 创建投影和照相视图矩阵---生成应用与图形对象的投影和视图矩阵。下列代码显示了如何编辑GLSurfaceView.Renderer类的onSurfaceCreated()和onSurfaceChanged()方法,来实现基于设备的屏幕外观比率的照相视图矩阵和投影矩阵的创建:
publicvoid onSurfaceCreated(GL10 unused,EGLConfig config){
...
// Create a camera view matrix
Matrix.setLookAtM(mVMatrix,0,0,0,-3,0f,0f,0f,0f,1.0f,0.0f);
}
publicvoid onSurfaceChanged(GL10 unused,int width,int height){
GLES20.glViewport(0,0, width, height);
float ratio =(float) width / height;
// create a projection matrix from device screen geometry
Matrix.frustumM(mProjMatrix,0,-ratio, ratio,-1,1,3,7);
}
4. 应用投影和照相视图矩阵---要适用投影和照相视图的变换,就要把它们一起设置给Verter Shader。下面的代码显示了如果编辑GLSurfaceView.Render类的onDrawFrame()方法,来实现上面代码中创建的投影矩阵和照相视图的合成,然后,把它应用到由OpenGL来呈现的图形对象上。
publicvoid onDrawFrame(GL10 unused){
...
// Combine the projection and camera view matrices
Matrix.multiplyMM(mMVPMatrix,0, mProjMatrix,0, mVMatrix,0);
// Apply the combined projection and camera view transformations
GLES20.glUniformMatrix4fv(muMVPMatrixHandle,1,false, mMVPMatrix,0);
// Draw objects
...
}
关于如何使用OpenGL ES 2.0的完整的示例,请看OpenGL ES 2.0指南(http://developer.android.com/training/graphics/opengl/index.html)