如果现在传入顶点着色器的顶点数组的元素分别为:v0,v1,v2,v3,v4,v5,v6,v7,那么对应的图元效果图如下所示:
相信在做列位看官都能理解它们的区别了,接下来就实践分别瞥一瞥它们各自的风采。
这次传4个点,依次每种图元看看效果:
//四个点坐标
static float lineVer[] = {
0.8f, -0.8f, 0.0f,
-0.8f, -0.8f, 0.0f,
0.0f, 0.8f, 0.0f,
0.4f, 0.8f, 0.0f,
};
不过画线之前,别忘了要指定线段的宽度,不然宽度就是0,即一条抽象到看不见的线段。
//设置线段宽度
glLineWidth(20);
GL_LINES:
glDrawArrays(GL_LINES, 0, 4);
从第0个顶点开始,读取4个顶点,每两个组成一对连成线。
是屏幕下方两条红色横线,下面一条的顶点分别为0.8f, -0.8f, 0.0f和-0.8f, -0.8f, 0.0f,上面的线段顶点分别为0.0f, 0.8f, 0.0f和0.4f, 0.8f, 0.0f。
GL_LINE_STRIP:
glDrawArrays(GL_LINE_STRIP, 0, 4);
这种是从第一个顶点开始一路连到到最后一个顶点。
GL_LINE_LOOP:
glDrawArrays(GL_LINE_LOOP, 0, 4);
还是这种给力,一路连成闭环。
绘制三角形
画完线段,接下来就是开始令人兴奋的三角形了。而三角形,就更能体现OpenGL就开始展现他武器库之丰富,简直是东风快递、民兵、白杨皆有之。
顶点属性数组改为传入3个顶点属性(当然你要传4个也行,在后面读取的时候指定读取几个就可以了):
static float triangleVer[] = {
0.8f, -0.8f, 0.0f,
-0.8f, -0.8f, 0.0f,
0.0f, 0.8f, 0.0f,
};
三角形的图元类型也是三种,我们也来一一领略一番:
三角形的就比较复杂了:
这是官网的解释:
第一种GL_TRIANGLES是每三个顶点就分别连成一个三角形,也就是说把顶点数组每三个为一组分,互相之间没有瓜葛。
第二种GL_TRIANGLE_STRIP就比较牛逼了,从第0个顶点开始,每3个顶点连在一起形成三角形, v0,v1,v2为一个三角形,v1,v2,v3为一个三角形,v2,v3,v4为一个三角形依此类推。
如果顶点个数为n,则可以生成n-2个三角形。
第三种GL_TRIANGLE_FAN是谁是第一个顶点谁就拥有优先的绘图权(排在第一位的果真是大佬),第一个顶点会和后面每2个顶点为一组绘制三角形。v0,v1,v2为一个三角形,v0,v2,v3为一个三角形,v0,v3,v4为一个三角形依此类推。最后形成一个扇形形状。
用代码一一感受它们的风采吧:
首先用最简单的三个点绘制:
static float triangleVer[] = {
0.8f, -0.8f, 0.0f,
-0.8f, -0.8f, 0.0f,
0.0f, 0.8f, 0.0f,
};
//对于三个点来说,GL_TRIANGLES,GL_TRIANGLE_STRIP和GL_TRIANGLE_FAN绘制结果都一样
glDrawArrays(GL_TRIANGLES, 0, 3);
开始玩点好玩的了。
将传入的顶点属性数组改为6个元素:
static float triangleVer[] = {
0.8f, 0.8f, 0.0f,
0.0f, 0.8f, 0.0f,
0.4f, 0.4f, 0.0f,
-0.8f, 0.5f, 0.0f,
-0.4f, 0.8f, 0.0f,
-0.8f, 0.8f, 0.0f,
};
绘制顶点数目也改为6:
glDrawArrays(GL_TRIANGLES, 0, 6);
尝试下GL_TRIANGLE_STRIP:
惊奇发现已经面目全非了,几乎看不到三角形的痕迹了。
再看下GL_TRIANGLE_FAN:
更加没有三角形痕迹了,v5还被抛弃了什么鬼。
为什么呢?按照前面对GL_TRIANGLE_FAN的讲解,v0,v4,v5会连成一个三角形,不过仔细看坐标就会发现,它们三个点是在一条直线上的,连不了三角形,索性直接抛弃了v5。
其实OpenGL之前是有四边形的图元类型的,但是在OpenGL3.1之后就被移除了,那这次就不讲了,那么问题来了,四边形要怎么绘制呢?
C++音视频学习资料免费获取方法:关注音视频开发T哥,+正在跳转即可免费获取2023年最新C++音视频开发进阶独家免费学习大礼包!
其实答案已经在上面了,通过GL_TRIANGLE_STRIP或者GL_TRIANGLE_FAN,只要给四个任何三个点不共线的点,就可以绘制出来。
三角形是最基本的图形,三角形三个点必然是共面的,所以在OpenGL的世界里,任何图形都可以通过三角形来构建。
举个例子,画个正方形瞧瞧?
static float triangleVer[] = {
0.8f, 0.8f, 0.0f,
0.8f, -0.8f, 0.0f,
-0.8f, 0.8f, 0.0f,
-0.8f, -0.8f, 0.0f,
};
使用GL_TRIANGLE_STRIP绘制:
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
show you the rectangle:
嗯?说好的正方形怎么变成长方形了。坐标上确实是正方形,但是因为坐标是按照比例系数传的并且手机屏幕是长方形的,所以无奈被拉长。不过也是有办法解决的,后面讲矩阵的博文就告诉你们答案。
总结
本文主要详细介绍了OpenGL es各种基本图元的绘制,通过本文的学习,各种基本图图元的绘制相信不在话下了,而且通过一些图元类型还可以玩出一些花了。现在距离一看就懂的OpenGL ES教程——这或许是你遇过最难画的三角形(一)中绘制三角形的终极任务只差那种看起来酷毙的绚烂的渐变色彩了,别急,还是那句话,*欲知后事如何*,*且听下回分解* 哈哈。下一篇文章一看就懂的OpenGL ES教程——这或许是你遇过最难画的三角形(五)
代码地址
opengl-es-study-demo (不断更新中)
参考
OpenGL官网Primitives Learn OpenGL
梦三国灵音这预判我就问你们 怕不怕
灵音需要操作技巧嘛?肯定呀,梦三国任何英雄都需要一定的操作水平,不过小编还是很喜欢这样操作系数难度低易上手的英雄,黄忠这类的除外,手残还真难玩出核心英雄的成就感,话不多说,下面开启今天话题灵音预判如何让自己在频频遇险化宜。
小编的灵音还真不是吹,在队友的配合下往往能够发挥出惊人的效果,前期的黄舞蝶在没有BKB的情况下还真是很容易被切菜你以为是黄忠的战撸性嘛?极音壁的预判限制,传送过来又能怎么样?极音壁配合五音迭奏消耗性伤害,直接让黄舞蝶少了半个血,大招无音之域范围性禁咒与持续伤害,再配合赶来支援的张莺莺,反手就是一个五音迭奏完美释放,人头就是这么轻易。
灵音的神预判再次显现,这不在敌方英雄孙坚赶来支援的情况下,小编可以轻易利用极音壁的天然屏障对孙坚做出眩晕控制,短暂时间足够小编利用跳石逃脱,不好意思张莺莺这就怨不得我卖你,黄舞蝶还在对小编穷追猛打是为了一报血仇嘛?
这不在看到敌方陆逊中路强压兵线,小编果断转移战场,不过没有TP的传送这种到嘴肥肉只能看着流口水了,隐藏在树林后的董卓可谓是真的阴险至极,恰到好处的钩子不知是等待技能的冷却还是对陆逊攻击范围,恰到好处时间段,刚从家思考人生的马腾传送过来瞬间抢夺一枚肥肉,可喜可贺。