中易网

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

答案:1  悬赏:40  
解决时间 2021-02-13 10:52
如何在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,建议大家下载尝试。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
麻烦看下肝胆脾彩超
华为翻译中心的工作体验是什么样子
朝阳银行北票南山支行这个地址在什么地方,我
小时候看过一个动画片,好像是奥特曼?有一集
苹果手机外屏怎么更换
贝贝童装(琯溪路)地址在什么地方,想过去办事
夏家三千金昊天的孩子是谁生的?
郑州郑东新世界的房子怎么样?现在什么价位
对于制作引力技术,我提出大胆设想!
李明三门课分别为96,89,85。他的平均分是多少
air max day是什么意思
广联达4.0 定额怎么转清单
公安交警的交通肇事案件,什么时候移交检察院
格力专卖地址有知道的么?有点事想过去
是诈骗!那我应该在哪里报警呢?当地吗?
推荐资讯
晨光文具用品店地址有知道的么?有点事想过去
汽车未发动时显示屏上的时间是什么时间
嘉兴市洪波宾馆在哪里啊,我有事要去这个地方
问一下电脑开一天会花多少钱。?
stc89c51和iap15w4k58s4的区别
iPhone6 64g 要不要升级ios10.3.3 升级后会不
生化危机三爱丽丝最后从超级计算机得知有拯救
三桃计生服务所在哪里啊,我有事要去这个地方
任性付提额怎么每次都失败说使用记录太少我都
海之声的助听器的好吗
启东市公路应急处置管理中心在哪里啊,我有事
优麦村传统美食我想知道这个在什么地方
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?