GL绘制自定义样式线条

        由于使用GL_LINE绘制线条的局限性和误差都很大,甚至效果在不同的GPU驱动上都略有差异,因此试了一下自己推导一个基于多边形的曲线生成算法。使用GL生成线条还有一个好处,对比Android的Path,可以更方便地动态调整线条不同部位的粗细,甚至精准地定义线条哪里显示什么颜色,或者使用纹理贴图模仿毛笔效果等。

推导:

        已知多边形都可以通过三角形组合而成,那么曲线本身也可以视为多个三角形按照一定的规则而成。关键就在于找到这个规则。

         首先,曲线本身可以拆分为两个两个端点一对一对相连的组合,同时,基于GL_TRIANGLE_STRIP的绘制模式可知,只要列出组成曲线节点的两对节点,就可以自动补全为两个三角形面,从而组成一个四边形面。所以具体来说,问题的关键在于如何根据线条的点去生成这些端点对。

端点生成的过程:

        1、为了方便进行变换,首先设每个节点的端点开始时都在原点两侧。

        2、由于曲线绘制时会拐弯,所以要把1的初始端点,进行旋转。那么如何确定旋转的角度呢?由于旋转量的测量需要有两个向量才可以做到,于是设1的两端点的垂直线段(0,1)为参考向量,通过线条当前延申的方向向量,通过以下公式即可得到旋转量:

        

         然后再把按该角度把两个端点都进行一遍旋转变换,利用三角函数此消彼长一波即可。

                

        

        3、将旋转完成后的线条端点加上传入的位置向量,即可对这两个端点进行偏移,移动到线条指定的位置上。

        4、重复对所有传入的坐标执行以上步骤,即可得到一条指定粗细的线条。

最终效果:

        基本得到想要的效果了,但细节上还不是很完美,有些小误差。

具体代码:

app/src/main/java/com/cjztest/gldrawlinesByMultiVectors · lvlv/learnOpengl - 码云 - 开源中国 (gitee.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值