如何在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,建议大家下载尝试。
如果你看到类似如下代码,基本上你已经掉坑里了。
··· 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,建议大家下载尝试。
相关文章推荐
- Android AsyncTask完全解析,带你从源码的角度彻底理解
- 去掉android二维码的边框
- android 开发第五弹---水波纹与自定义view实现绚丽粒子
- Android数据库安全解决方案,使用SQLCipher进行加解密
- 去除AndroidStudio中libpng关于iCCP的警告
- android.widget.FrameLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams
- Android5.0新控件CardView的介绍和使用
- 深入理解Android之Gradle
- Android SDK 在线更新镜像服务器资源
- Android 让图片等比例缩放的三种方法
- android studio 代理配置
- android之Handler用法
- Android SDK开发包国内下载地址
- Android TextView自动换行文字排版参差不齐的原因
- Android studio -- Throwable: Unable to locate adb within SDK
- Android - 序
- Android项目规范
- Android Studio六--Gradle多渠道打包
- Android实战简易教程-第五十九枪(EventBus小实例-传值、控制其他页控件显示)
- android各种服务链接