标签:opengl opengl es android opengl mapping coordinates 纹理压缩
Android 目前支持下面几个版本的OpenGL ES API :OpenGL ES 1.0 和 1.1 :Android 1.0和更高的版本支持这个API规范。支持OpenGL ES 3.0的API需要实现设备生产厂家提供的图形管道,所以一个Android4.3或者更高版本的设备可能并不支持OpenGL ES 3.0.
OpenGL ES 2.0 : Android 2.2(API 8)和更高的版本支持这个API规范。
OpenGL ES 3.0 : Android 4.3(API 18)和更高的版本支持这个API规范。
OpenGL ES 3.1 : Android 5.0(API 21)和更高的版本支持这个API规范。
Android在framework API和NDK都提供了对OpenGL的支持
OpenGL ES包:
1、OpenGL ES 1.0/1.1 API 包
android.opengl -- 这个包提供了OpenGL ES 1.0/1.1包含类的静态接口,比javax.microedition.khronos 包里的接口有更好的性能
javax.microedition.khronos.opengles -- 这个包里提供了OpenGL ES 1.0/1.1的标准实现
2 . OpenGL ES 2.0的API类
3. OpenGL ES 3.0/3/1的API包
android.opengl -- 这个包提供了OpenGL ES 3.0/3.1的类接口。
为绘制对象映射坐标(Mapping Coordinates for Drawn Objects)
public void onSurfaceChanged(GL10 gl, int width, int height) {
gl.glViewport(0, 0, width, height);
// make adjustments for screen ratio
float ratio = (float) width / height;
gl.glMatrixMode(GL10.GL_PROJECTION); // set matrix to projection mode
gl.glLoadIdentity();// reset the matrix to its default state
gl.glFrustumf(-ratio, ratio, -1, 1, 3, 7); // apply the projection matrix
}
public void onDrawFrame(GL10 gl) {
...
// Set GL_MODELVIEW transformation mode
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();// reset the matrix to its default state
// When using GL_MODELVIEW, you must set the camera view
GLU.gluLookAt(gl, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
...
}
在ES 2.0或者3.0的API里面,应用投影和相机视图时,首先要向图形对象的顶点着色器添加一个矩阵成员对象,当矩阵对象添加后,就可以向对象生成和应用投影和相机视图矩阵。
private final String 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
// Note that the uMVPMatrix factor *must be first* in order
// for the matrix multiplication product to be correct.
" gl_Position = uMVPMatrix * vPosition; \n" +
"} \n";
注意:上面的示例在顶点着色器中定义了一个矩阵变换成员,你可以给这个矩阵应用一个投影和相机视图的结合矩阵。根据你的需求,可能会需要定义分开的投影矩阵和相机视图矩阵成员,以方便分开自由的改变它们。
public void onSurfaceCreated(GL10 unused, EGLConfig config) {
...
muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
...
}
public void 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);
}
public void 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);
}
public void 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
...
}
纹理压缩支持
ATITC (ATC) - ATI纹理压缩在许多设备上面都支持,它支持RGB纹理压缩但不包含alpha通道,一些OpenGL扩展名可以代表这种格式,比如:
GL_AMD_compressed_ATC_texture
GL_ATI_texture_compression_atitc
PVRTC-PVRTC纹理压缩在许多设备上面都支持,支持每个像素2位或者4位的纹理,包含或者不包含alpha通道都可以。下面的OpenGL扩展名可以代表这种格式,比如:
GL_IMG_texture_compression_pvrtc
S3TC (DXTn/DXTC)-S3有一些格式变化(从DXT1到DXT5),使用并不是很广泛。它支持包含4位或者8位alpha通道的RGB纹理。下面的OpenGL扩展名可以代表这种格式,比如:
GL_OES_texture_compression_S3TC
GL_EXT_texture_compression_s3tc
GL_EXT_texture_compression_dxt1
GL_EXT_texture_compression_dxt3
GL_EXT_texture_compression_dxt5
3DC - 3DC纹理压缩是比较少使用的支持包含alpha通道的RGB纹理,下面的OpenGL扩展名可以代表这种格式:
GL_AMD_compressed_3DC_texture
确定OpenGL扩展
通过下面方法可以确定特定的一个设备上面支持哪些纹理压缩格式和OpenGL扩展:
1.在目标设备上面执行下面的代码来确定设备支持哪些纹理压缩格式,不同的机型上面结果不一样,所以你应该在多个机型上面运行这个代码,来确定哪些压缩格式是被广泛支持的:String extensions = javax.microedition.khronos.opengles.GL10.glGetString(GL10.GL_EXTENSIONS);2.查看这个方法的输出,来确定设备支持哪些OpenGL扩展
boolean deviceSupportsAEP = getPackageManager().hasSystemFeature (PackageManager.FEATURE_OPENGLES_EXTENSION_PACK);
标签:opengl opengl es android opengl mapping coordinates 纹理压缩
原文地址:http://blog.csdn.net/fanfanxiaozu/article/details/45245683