您的位置:首页 > 移动开发 > Android开发

如何在Android上使用OpenGL ES 2.0绘制点。

2015-09-14 17:28 204 查看
如何在Android使用OpenGL ES 2.0绘制点,看上去并不是一个复杂的问题,但是上网一搜,满眼都是绘制点的代码。

如果你看到类似如下代码,基本上你已经掉坑里了。

··· c

  glBeging();

 ...

 glDrawPoint(...);

 ...

 glEnd();

```

如上是使用OpenGL ES 1.0绘制点的代码。因为架构不同,在OPENGL ES 2.0的世界里,这一套已经彻底不管用了。

在OpenGL ES 2.0里绘制点,要使用Shader,使用Shader,用Shader。。。。。。

具体怎么绘制呢,首先你要搞清楚,如何用Shader绘制一个普通带颜色的三角形。我这里假设你已经会了。

三角形显示出来的那一刻,你一定会有这样的代码:

  GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);

那么,只显示三角形的三个顶点该怎么办,说来简单,这行代码改成

 GLES20.glDrawArrays(GLES20.GL_POINTS, 0, vertexCount);

即可。

但是,理想和现实的差距总是很大,改完后三角形消失了但是顶点没有出现。正常OpenGL 2.0环境下应该怎么做呢?

1)首先调用 GL20.glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); 这样在Shader中可以访问glPointSize;

2)然后类似准备每个顶点色彩那样准备顶点的大小的数值,三角形是三个顶点,就准备3个float。把顶点数据像色彩数据那样,绑定到VOB,再绑定到Shader的参数中。基本上就是照准备色彩那样准备顶点大小数据,不同之处在于每个色彩4个float,每个顶点尺寸1个float。

3)最后,把你的顶点Shader文件改好,增加顶点大小的输入参数和gl_PointSize赋值。

4)另外,如果你打算显示圆形顶点,而不是方形的,还要用GL20.glEnable()函数设置其他参数,具体可查OpenGL官网。

比如:

 uniform mat4 matrix;

 attribute vec4 aVertex;

 attribute vec4 aColor;

 attribute float aPointSize;

 varying vec4 vColor;

void main(){

  vColor = aColor;

 gl_Position = matrix * aVertex;

 gl_PointSize = aPointSize;

}

这样,基本上就搞定了。

现在,坑爹的问题来了,在Android上你找不到GLES20.GL_VERTEX_PROGRAM_POINT_SIZE的常量,谷歌似乎认为在手机的3D环境下绘制点没多大必要性,所以并没有加上这个参数,好在缺省情况下,模拟器中Shader中的gl_PointSize是打开的(Android 4.4.x)。所以你可以跳过第一步,直接传递点大小的参数,并把Shader改好就成。

那么,为什么你不写gl_PointSize = aPointSize,点就显示不出来呢。我估计缺省情况下,gl_PointSize = 0.0f,所以显示不出来。

如果你显示点的大小总是固定不变的,你甚至可以把传递顶点大小数值的步骤也省略掉,直接在Shader中写上gl_PointSize = 10.0f;即可。

阅读本文,当你打算在Android上用OPENGL ES 2.0显示点时,即可跳过谷歌的那些坑了。我想,手机GPU硬件厂商的开发包应该对OpenGL ES 2.0支持的更好些,比如高通的AdrenoSDK,建议大家下载尝试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: