思路一: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矩阵如何。