Unity Shader 公告板, billborad的实现思路们--------------马上发车,去往东莞的路上,你我不在孤独

思路一:CPU实现

思路二:GPU实现


思路1.1不是有个LookAt么?!

transform.LookAt(Camera.main.transform);

貌似有些许问题。。

思路1.2那就同步相机的旋转如何?

transform.rotation = Camera.main.transform.rotation;

思路2.1,shader去做。。。呃。。。。

先把一个测试模型上一下,模式是两个三角面的quad,max做的,1m*1m的,就是unity里1unit * 1unit的,

这次测试我们默认公告板的原始模型的长宽是1unity*1unity,不考虑其他长度的问题。

这次测试我们默认公告板的原始模型的povit在中心,不考虑其他情况。

我上一下uv图:

图1,图2

图3 ,图4

以后就直接叫1234了。

再上一下,unlitshader的贴图状况

从左往右分别对于的是1234号模型。

好了,废话说的有点多了。


先来一种思路,基于uv去做一下试试。(我们用最常规的1去做测试。其他的做特殊的测试用)

我们首先拿到物体(transform)的position,然后让顶点在V空间下的右上平面上就可以了。

float4 worldPos = mul(unity_ObjectToWorld,float4(0,0,0,1));
float2 bias = v.uv.xy *2-1;
worldPos.xyz += normalize(UNITY_MATRIX_V[0].xyz) * bias.r * 0.5+ normalize(UNITY_MATRIX_V[1].xyz)*bias.g * 0.5;

为啥bias要把uv*2-1。。。。

我是这么去理解的:偏移到中心,后面的V[0].xyz是V的右轴,也就是X轴的朝向,现在的bias.r是uv的x轴向,他们两相乘得到的是uv在V空间下X的坐标。

为啥要乘以0.5呢?

不要忘了,uv*2-1这一步,我们把uv的xy各放大了一倍,如果不乘以0.5,得到的面片面积会是原来的4倍。这样也就知道了

这个billborad的大小的参数就是xy乘的这个0.5,把他拿出去就可以正常调整大小了。

以上这是我个人的理解,毕竟数学太烂,解释不了。

弊端:

1.不能动态批处理。这个就不上图了

2.上一下测试模型234的图。

问题很明显。元宝一样大的模型,因为我们修改了vertex,产生的一个问题。

在这个问题中,还有一个疑似好玩的发现。

似乎可以减少一下overdraw呀。这是我瞎说的。

似乎可以做图片裁切呀,这也是我瞎说的。

那么修正一下

float2 bias = v.vertex.xy*2;

乘以2,只是我不想去写一遍,把0.5去掉的那行。这次只是测试,不做优化。

这次的修改,就是基于vertex本身的修改,并没有用到uv的数据,那么就应该可以batch了。

弊端:

如果强制关掉batch( "DisableBatching" = "True" ),还会有问题呢。


这个问题每太弄明白。。有知道的欢迎拍砖留言。

-------------------------

我自己想了这么个原因,肯定是V矩阵的问题。呵呵,算了当我没说。

-------------------------

接下来我们复杂化上面的代码,解释就不解释了,这辈子也不会解释的。

float4 worldPos = mul(unity_ObjectToWorld,float4(0,0,0,1));
float2 bias = v.vertex.xy *2;
float3 forward = normalize(_WorldSpaceCameraPos- worldPos.xyz);
float3 up = normalize(UNITY_MATRIX_V[1].xyz);
float3 right = cross(forward,up);
worldPos.xyz += right * bias.r * 0.5+ up*bias.g * 0.5;

禁用datch之后。


有些许lookat的意思。这个问题就很明确了。

偏差都在这里

float3 forward = normalize(_WorldSpaceCameraPos- worldPos.xyz);

禁用batch之后。每一个物体的worldPos不一样,但是相机的位置确是一样的。

通过这里,可以稍微了解了上面的那个问题的所在了。


然后我们在简化一下。

o.pos = mul(UNITY_MATRIX_P,mul(UNITY_MATRIX_MV, float4(0, 0, 0, 1)) + float4(v.vertex.x, v.vertex.y, 0, 0)) ;

结果挺完美的。强制关掉batch也很OK的。


然后我们在回到最初的问题上。

然后。。。。我就有点懵逼了。。。。再也找不到刚才那个显示上有点问题的情况了。

对,就是这个情况。

我无法复现了。。。Unreal unity。

这个时候我又想到了shaderfore ase等一堆可视化插件。可以巴拉巴拉,说不定有其他方案的。

是的,真有,自己写个mv矩阵如何。











猜你喜欢

转载自blog.csdn.net/u012871784/article/details/80483318
今日推荐