shader制作图表时,关于UV的几个坑

发表于2017-08-30
评论0 4.4k浏览

在开发过程中我们时不时的遇到一个比较常见的需求,那就是在一个平面上画线。画线分为好多种情况。直线,曲线,回环等等。但总会遇到一种问题,那就线粗细dw(宽度)的问题,因为已知dw你就可以根据点到线段最短距离决定点的去留。在讲述下面问题 的时候我们先回忆一下UV值的特性。那就是在Tiling默认的情况下,无论你是正方形还是长方形UV值都是均分[0,1]。UV不同平面情况如下图。

(1)在正方形区域画线

当在正常的正方形区域画线的时候非常简单的。只要你设定好线的宽度dw(宽度),因为平面是正方形网格,无论水平垂直还是斜对角,都是正常的。也不会出现什么异常,如下图。

 (2)在长方形区域画线

当你在长方形区域画线的时候如果不对UV值做调整,效果就会怪怪的。假定线的宽度dw(宽度),我们只拿垂直和水平两条直线来说吧。呈现效果如下图。

解决问题:我们需要引入一个宽高的比值WidthDivHeight。对当前的UV的y值进行一个转变。y = WidthDivHeight * y;注意这个修改后的y值,只决定你这个像素的去留,或者说是alpha值。  不参与其他操作,比如采样。

(3)妄想在极坐标系中实现雷达图一样的效果图

雷达图其实就是折线图首位相连,首先我们会联想到极坐标系。想法没有问题。但实际是有问题的。我们假定线宽为dw(宽度)。坐标系变换之后。y变成P(到原点距离),x变成e(角度)。在线水平情况下。并没有产生宽度走样的现象,因为之前的Y值在变换成p(到原点距离)后dy是定值。现象如下图。

当在非水平情况下变换之后,会出现走样的现象。因为在之前的X值变换成e(角度)后dx是根据p的值成线性增大的。因为 弧长 = K*半径*弧度。懂我意思吧。现象如下图。

上述问题有办法解决吗?

答案:

(1)竖直情况下,根据p的值来控制dw(宽度)这样可以解决走样。因为dx和p是呈线性增大的。很简单!

(2)在任意倾斜情况下:xLen = yLen*2*pi;  那么=> WidthDivHeight = 2*pi; 做一个规整之后,再根据dx和p是呈线性,来动态的更改 dw(宽度)

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论