一看就懂的OpenGL ES教程——这或许是你遇过最难画的三角形(二)

如果现在传入顶点着色器的顶点数组的元素分别为: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的传送这种到嘴肥肉只能看着流口水了,隐藏在树林后的董卓可谓是真的阴险至极,恰到好处的钩子不知是等待技能的冷却还是对陆逊攻击范围,恰到好处时间段,刚从家思考人生的马腾传送过来瞬间抢夺一枚肥肉,可喜可贺。

本站内容来自用户投稿,如果侵犯了您的权利,请与我们联系删除。联系邮箱:835971066@qq.com

本文链接:http://news.xiuzhanwang.com/post/2058.html

发表评论

评论列表

还没有评论,快来说点什么吧~

友情链接: