android最佳OpenGL ES语法

Best OpenGL ES syntax for android

本文关键字:语法 ES OpenGL 最佳 android      更新时间:2023-10-16

我运行了一个SurfaceView游戏,其中的角色和精灵可以沿着网格移动N/S或E/W。现在这还不够好,所以我决定在接下来的几个月里把它转换成GLSurfaceView。我57岁了,我想我活不了多久,就不能成为OpenGL的专家。要在设备屏幕上绘制位图纹理,需要SurfaceView:中的2行代码

Bitmap bmp_background = BitmapFactory.decodeResource(getResources(), R.drawable.backgroundimage_2000_1000,options);
canvas.drawBitmap(bmp_background, null, new Rect(0, 0, screenWidth, screenHeight), null);

Java Code Geeks的"OpenGL ES纹理映射"示例需要300多行obsure代码才能在GLSurfaceView中完成同样的操作。

因此,我的策略是寻找完整的代码示例,其中包括主活动中的所有代码,并从那里开始工作。我的完整代码示例的主要来源是安卓开发者网站和Java代码极客网站上的教程。不幸的是,每个网站使用的语法都大不相同。我想知道语法上的差异意味着什么,以及使用一种类型的语法相对于另一种类型语法的优势。以下是来自两个站点的GLRenderer-onDrawFrame方法的两个代码片段:

developer.android.com:

public void onDrawFrame(GL10 unused) {
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
android.opengl.Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
android.opengl.Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);
mSquare.draw(mMVPMatrix);

javacodegeekes.com:

public void onDrawFrame(GL10 gl) {
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
gl.glTranslatef(0.0f, 0.0f, -5.0f);
square.draw(gl);

您提供的示例实际上是针对OpenGL ES 1.x和2.x的。它们完全不同:ES 1(javacodegeeks示例)是一个具有固定功能管道的旧版本,而ES 2(developer.android示例)是较新的,具有可编程管道。可编程管道提供了更好的图形控制优势,允许您实现更多的图形效果,而且它不像ES 1那样受限制,尽管它可能需要更多的代码来设置。