Uncategorized
-

以前自己已经摸索过libGDX逐像素效果的用法了,但一直没有认真研究过顶点绘制的相关逻辑。现在借着AI问了一下,也算是入门了,写个文章记录一下。 画三角形 虽然底层是画三角形,但这里用画直线来举例子。 实际上画直线就是画一个矩形罢了,而一个矩形可以分割成两个三角形,所以实际上绘制一条直线就是绘制两个三角形。在直线的头尾增加以一半宽度向法线方向扩展,这样就能形成4个点。理论上很简单,不好理解的主要是Mesh的接口实现。 Mesh可以认为只是一个传给GPU的顶点数组,但这个数组要怎么读取要看具体参数怎么设置。 下面直接来看一个例子就好了: 这个例子很简单,看看注释就懂了,需要注意的是,VertexAttribute的构造参数最后一个是alias,会绑定到vert(点着色器)的入参,在这个例子里ShaderProgram.POSITION_ATTRIBUTE其实就是字符串”a_position”,所以数组里的坐标就成了vert里a_position参数了。这下我也总算是知道了这些莫名其妙约定俗成的参数是怎么来的。 填充颜色 虽然上面的例子解决了画形状的问题,但是实际绘制的时候,肯定还需要给形状填充颜色,比如说渐变色,我可以直接通过例如x坐标的变化生成一套渐变。 但是如果我想要让渐变沿线段的方向变化该怎么办?虽说我可以在frag(面着色器)上对屏幕坐标进行判断,但这样做就需要对每个像素点屏幕坐标进行一次计算,性能开销会增大。实际上,这个逻辑应该可以通过点着色器进行插值,从而避免计算下降到面着色器中。 可以在Mesh中提供顶点的uv数值空间,实际操作就是在Mesh中,给每个顶点增加一个新的Attribute: 这样子,就知道材质坐标的(0, 0)是“绘制材质”的左下角,而(1, 1)是右上角。如果我想沿绘制的线的方向着色,只需要保证起点是0,终点是1,那么对照着计算渐变颜色的插值就行了,在这个例子中取x或y作渐变插值都行。 扇形绘制 如果绘制的图形是圆形或者扇形,有个单独的绘制类型GL_TRIANGLE_FAN来绘制。在这种绘制类型下,可以省略传递顶点坐标,将固定第一个点为圆心,其余的点依次相连作为三角形的对边来绘制,如果总共要绘制N个三角形,那么实际上要传递N+1个点。 三角带绘制 与扇形绘制相似,三角带绘制方式也是一种用来省略顶点坐标的绘制方式,其解析逻辑是直接以数组上邻近的三个点作为坐标依次绘制,所以如果要绘制N个三角形,那么就需要传递N+2个顶点。下面用一个绘制圆环的代码做例子: 性能优化 虽然有三种绘制方法,但是其实更多的时候还是只用最通用的三角形绘制方法,因为这个方法最通用,可以把所有绘制都整合到一次Mesh的DrawCall中。而且需要注意,因为Mesh也是单独的一次DrawCall,所以不能跟Batch混用,必须首先结束当前事务。
