由于使用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)