【我的安卓进阶之旅】Opengl Es(3)绘制多边形及圆形(附Github地址)

上篇博客中我们已经使用到了相机和投影,利用变换矩阵,绘制出了等腰直角三角形。在本篇博客中,我们绘制正方形和圆形同样少不了变换矩阵。

构建正方形和圆形

前面提到过,在OpenGLES的世界里面是没有正方形和圆形的,只有点、线、三角形。三角形就是OpenGLES提供的最复杂的图元单位。所以我们要绘制填充的正方形和圆形就需要利用三角形来实现。

正方形

正方形的构建比较简单,可以用两个三角形组成。当然,你也可以用很多很多三角形去合成一个正方形,只要你乐意。如下图所示,我们可以按照123组成的三角形和134组成的三角形,两个拼合成一个正方形。
这里写图片描述
可以设置正方形的坐标数组为:

static float triangleCoords[] = {
            -0.5f,  0.5f, 0.0f, // top left
            -0.5f, -0.5f, 0.0f, // bottom left
            0.5f, -0.5f, 0.0f, // bottom right
            0.5f,  0.5f, 0.0f  // top right
    };
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

圆形

圆形的构建,相对复杂一点,我们可以把圆形看成一个正多边形,边越多,圆越平滑。如下图所示,分别为正六边形、正八边形、正十六边形和正一百边形。
这里写图片描述
以六边形为例,由012、023,034、045、056、061六个三角形,更多变形同样如此。
我们观察到如果边数无限大,就会越接近圆形。在绘制过程中 我们取值N为360。当然,如果N越大,圆形周边的锯齿就越不明显。当我们把N取值为4的时候,其实也能得到一个正方形

利用数学知识,即可得到,以多边形中心建立直角坐标系,得到n变形的顶点坐标为:

private float[]  createPositions(){
    ArrayList<Float> data=new ArrayList<>();
    data.add(0.0f);             //设置圆心坐标
    data.add(0.0f);             
    data.add(0.0f);
    float angDegSpan=360f/n;
    for(float i=0;i<360+angDegSpan;i+=angDegSpan){
        data.add((float) (radius*Math.sin(i*Math.PI/180f))); 
        data.add((float)(radius*Math.cos(i*Math.PI/180f)));
        data.add(0.0f);
    }
    float[] f=new float[data.size()];
    for (int i=0;i<f.length;i++){
        f[i]=data.get(i);
    }
    return f;
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

图形的绘制

得到了坐标数组,剩下的工作就和三角形的绘制基本相同了。唯一不同的地方,是需要修改:

 GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 1);
 
 
  • 1

为:

GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, shapePos.length/3);
 
 
  • 1

GLES20.glDrawArrays的第一个参数表示绘制方式,第二个参数表示偏移量,第三个参数表示顶点个数。
绘制方式有:

int GL_POINTS       //将传入的顶点坐标作为单独的点绘制
int GL_LINES        //将传入的坐标作为单独线条绘制,ABCDEFG六个顶点,绘制AB、CD、EF三条线
int GL_LINE_STRIP   //将传入的顶点作为折线绘制,ABCD四个顶点,绘制AB、BC、CD三条线
int GL_LINE_LOOP    //将传入的顶点作为闭合折线绘制,ABCD四个顶点,绘制AB、BC、CD、DA四条线。
int GL_TRIANGLES    //将传入的顶点作为单独的三角形绘制,ABCDEF绘制ABC,DEF两个三角形
int GL_TRIANGLE_FAN    //将传入的顶点作为扇面绘制,ABCDEF绘制ABC、ACD、ADE、AEF四个三角形
int GL_TRIANGLE_STRIP   //将传入的顶点作为三角条带绘制,ABCDEF绘制ABC,BCD,CDE,DEF四个三角形
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

所以看到这里,正方形又多了个构建方式:按照途中坐标点1243的顺序传入,然后绘制时选择GL_TRIANGLE_STRIP的绘制方式。
最后绘制结果如下:
正方形 圆形

绘制小结

GL_TRIANGLE_STRIP

由上面的注释,我们可以知道,GL_TRIANGLE_STRIP的方式绘制连续的三角形,比直接用GL_TRIANGLES的方式绘制三角形少好多个顶点,效率会高很多。另外,GL_TRIANGLE_STRIP并不是只能绘制连续的三角形构成的物体,我们只需要将不需要重复绘制的点重复两次即可。比如,传入ABCDEEFFGH坐标,就会得到ABC、BCD、CDE以及FGH四个三角形

GL_TRIANGLE_FAN

扇面绘制是以第一个为零点进行绘制,通常我们绘制圆形,圆锥的锥面都会使用到,值得注意的是,最后一个点的左边应当与第二个点重合,在计算的时候,起点角度为0度,终点角度应包含360度。

顶点法和索引法

上述提到的绘制,使用的都是GLES20.glDrawArrays,也就是顶点法,是根据传入的定点顺序进行绘制的。还有一个方法进行绘制GLES20.glDrawElements,称之为索引法,是根据索引序列,在顶点序列中找到对应的顶点,并根据绘制的方式,组成相应的图元进行绘制。
顶点法拥有的绘制方式,索引法也都有。相对于顶点法在复杂图形的绘制中无法避免大量顶点重复的情况,索引法可以相对顶点法减少很多重复顶点占用的空间。

源码

附上github下载地址

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: opengles编程指南是一本介绍如何使用OpenGL ES进行图形渲染的书籍。OpenGL ES是一套跨平台的图形处理API,专门为移动和嵌入式设备设计。本书详细介绍了OpenGL ES 3.0及更高版本的基础知识和技术,并提供了丰富的示例和实地操作经验。这本书是一本非常实用的OpenGL ES编程入门指南。 同时,本书的作者也将pdf版放到了github上,方便读者进行在线阅读和下载。在github的页面上,读者可以通过查看文件的历史记录来了解每次更新的细节,可以通过Pull Request来提交修改建议和bug报告,也可以通过Fork功能将该书的源代码分支到自己的GitHub账号下进行开发或修改,这是非常方便的学习方式。 总的来说,opengles编程指南 pdf github是一本非常实用的OpenGL ES编程入门指南,书籍通过讲授基础知识和技术,同时也提供丰富的示例和实地操作经验,还可以通过github进一步获取更多信息和互动。对于从事OpenGL ES开发的程序员来说,这是一本非常值得阅读的书籍,并为他们提供了很好的学习和开发参考。 ### 回答2: opengles编程指南 pdf github是一个开源项目,提供了OpenGL ES编程指南的PDF版本和源代码。OpenGL ES是一款流行的图形渲染库,可以用于在移动设备上实现高性能3D图形渲染。通过该指南,开发者可以学习如何在Android、iOS和WebGL等平台上使用OpenGL ES开发应用程序。 该项目通过在GitHub上托管源代码和文档,使它更容易得到维护和更新。开发者们可以随时提交代码,分享自己的经验和知识。这个项目也有不少贡献者,他们提出了自己的建议和改进,使得OpenGL ES编程指南更加完善。 OpenGL ES编程指南pdf github项目也提供了一个完整的开发环境。开发者们可以使用该项目中的代码示例和示意图进行实践,从而更好地掌握OpenGL ES的编程方法。这个项目有很多开发者在使用,他们通过这个项目来提升自己的技能和开发能力。 总之,OpenGL ES编程指南pdf github项目是一个非常有用的资源,它为开发者们提供了一个学习OpenGL ES编程的良好平台。在这个项目中,开发者们可以轻松地获得指南、源代码和开发环境等一切必要的资源,使其更加方便高效地学习和应用OpenGL ES
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值