OpenGL绘制点的大小

转载:https://blog.csdn.net/schinta/article/details/48442167

https://my.oschina.net/sweetdark/blog/208024

着色器语言:https://blog.csdn.net/u013467442/article/details/50524498

如何在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;即可。


————————————————
版权声明:本文为CSDN博主「schinta」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/schinta/article/details/48442167

posted @ 2020-03-09 13:41  狂奔~  阅读(3403)  评论(0编辑  收藏  举报