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

如题所述

如何在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,建议大家下载尝试。
温馨提示:内容为网友见解,仅供参考
无其他回答

如何在Android上使用OpenGL ES 2.0绘制点
1)首先调用GL20.g笭窢蒂喝郦估垫台叮郡lEnable(GL_VERTEX_PROGRAM_POINT_SIZE);这样在Shader中可以访问glPointSize;2)然后类似准备每个顶点色彩那样准备顶点的大小的数值,三角形是三个顶点,就准备3个float。把顶点数据像色彩数据那样,绑定到VOB,再绑定到Shader的参数中。基本上就是照准备色彩那样准...

如何在Android上使用OpenGL ES 2.0绘制点
Android的本地代码位于frameworks\/base\/opengl下,JNI代码位于frameworks\/base\/core\/com_google_android_gles_jni_GLImpl.cpp和frameworks\/base\/core\/com_google_android_gles_jni_EGLImpl.cpp,java类位于opengl\/java\/javax\/microedition\/khronos下本地测试代码位于frameworks\/base\/opengl\/tests。包括angeles、fill...

如何使用Android中的OpenGL ES媒体效果
1.一款支持Android开发的IDE,如果你没有的话,可以在Android Developer website下载最新版本的Android studio。 2.一款运行Android4.0之上Android手机,并且GPU支持OpenGL ES2.0 3.对OpenGL的基本知识了解设置OpenGL ES环境创建GLSurfaceView为了显示OpenGL的图形,你需要使用GLSurfaceView类,就像其他任何的View子类意义,你可以将它...

请问高手们 Android程序用openGL ES2.0编写 请问openGL ES2.0是可以...
在onCreate()方法里面主要是创建OpenGL ES 2.0上下文以及做一些初始化工作。在onCreate()中,调用超类之后的第一件事情就是创建GLSurfaceView。然后确定系统是否支持 OpenGL ES 2.0。因此,我们需要一个可以与全局系统状态相交互的ActivityManager实例,以及使用这个实例来得到设备配置信息,该信息将通知我们...

OpenGL ES2.0在onDrawFrame用线程画图可以吗
在android中,要实现动画效果,要么通过循环调用canvas.draw系统方法,要么通过调用opengl es中的GLSurfaceView.Renderer实现方法onDrawFrame方法。 这个方法大体的原理是开起一个线程,在此线程内不断的调用onDrawFrame,实现效果。

opengl es 2.0 为什么不在ondrawframe 中调用gclear背景颜色就不刷新...
一、在Manifest文件中声明使用OpenGL ES 为了能够使用OpenGL ES 2.0 API,你必须在manifest文件中添加以下声明:[html] view plaincopyprint?如果你的应用需要使用纹理压缩功能,还要声明设备需要支持什么样的压缩格式:[html] view plaincopyprint?更多关于纹理压缩格式的信息,请参阅OpenGL开发人员指南。二、...

Android 3D游戏开发(基础篇)——Opengl ES游戏引擎实现项目介绍_百度...
首先,我们需要明确项目的开发平台。这个项目主要是在Windowsxp操作系统环境下进行开发,同时,目标平台是Android设备。使用的是Java语言,因为它在Android生态系统中占据主导地位,提供了丰富的开发工具和资源。开发工具方面,我们选择的是Eclipse集成开发环境,它与Android SDK和ADT(Android Developer Tools)紧密...

OpenGL ES 2.0 android哪个版本开始支持的
Android NDK第三版支持OpenGL ES 2.0

如何用OpenGL ES 2.0渲染一个透明surface-Android开发问答
你看这样行不,把V2的surface属性改一下,例如:1、GLSurfaceView v2= new GLSurfaceView();this.getHolder().setFormat(PixelFormat.TRANSLUCENT);2、在渲染器类OnSurfaceCreated函数中设置清屏的颜色:gl.glClearClolor(0,0,0,0);最后,在画的时候OnDrawFrame 开启混合 也就是我上面写的那几句 ...

在Android上,Unity3d底层是调用opengl es库吗
1或者2.0来渲染。在Windows(MAC、Linux)上,Unity会根据自己跑的来决定用DX还是OpenGL,因为是你来做,也会想着尽量能把最好的硬件都利用上,对吧?!所以,OpenGLES跟Unity的关系也就很明了,Unity会根据不同的运行环境,选择不同的渲染库,OpenGLES是其中的一个库,而已。

相似回答