tangoyzx
论坛版主
论坛版主
  • UID343
  • 粉丝5
  • 关注0
  • 发帖数9
阅读:12008回复:31

动态映射屏幕四边形到UV空间

楼主#
更多 发布于:2015-11-02 17:20
欢迎转载,转载请注明:
来自AR学院(www.arvrschool.com),原文地址为:http://www.arvrschool.com/index.php?c=post&a=modify&tid=537&pid=0
谢谢合作!
AR/VR学院技术交流③群:470653189
AR/VR学院技术交流②群: 346836719(已满)
AR/VR学院技术交流①群:129340649(已满)

自己在学Shader
目前在找各种效果来实现练手
然后看到了这个

图片:tutule.gif




分析后,感觉核心技术就是把模型正常的UV映射到屏幕空间上的一个不规则四边形上就可以了
大概是

图片:image2015-10-29 15-28-27.png



(渣画风请忽略)



1、首先当然要得到屏幕空间里面识别图的坐标,贪图偷懒的我,直接放了四个Empty GameObject在识别图的四个角,然后通过Camera.WorldToViewportPoint获得四个点在屏幕空间的坐标,然后把它转换成UV(屏幕空间xy都是-1~1,UV空间是0~1,而且dx和opengl的rendertexture好像uv的v方向有所不同),顺便把深度保存起来之后有用,所以每个点就是三个数字(u,v,depth)。把这四个点传到shader的p0~p3中
2、由于四边形无法通过简单的变换变成另外一个四边形,所以我决定把UV空间以(x+y=1)为分隔线划成两个三角形来分别对应屏幕空间不规则四边形。
3、现在问题变成了三角形三个顶点分别都有一个uv值,求出三角形的中间某点由这三点插值出来的uv值。可以通过三角形内部线性插值方法来计算。
4、直接这么计算以后获得的UV会有类似于透视问题,如下图

图片:image2015-10-29 16-2-26.png



5、核心原因是屏幕空间算出来的UV是与透视后的屏幕坐标成线性关系,而我们现在是要反推算透视前的UV坐标,所以透视前的UV坐标和屏幕空间算出来的UV两个都乘以深度z以后成线性关系(与正常软渲染做UV映射所产生的透视修正刚好相反)。修正后的UV如下

图片:image2015-10-29 16-33-23.png



6、那么得到了正确的UV以后,就在Shader上把模型正常的UV映射过去就好。下图为模型加识别图(手头没有其他模型,只好用球体来表示)

图片:image2015-10-29 16-43-53.png



7、具体涂鸦效果(后面是电脑打开画图工具然后用刷子刷识别图,球就当做是模型了)

图片:DrawModel.gif






代码地址:https://github.com/Tangoyzx/PaintModel

(工程是5.2.1p4版本的,4.6好像都没效果,看看能不能自己领悟Scene然后搬过去吧……)
(有些人会看到CUBE上的贴图是个黑底白字的什么CAMERA VIDEO,首先要保证你有摄像头,然后一般是因为BackgroundPlane的Texture不会马上设置成摄像头的图像,我原本是设了30帧以后再去拿该Texture,不行的话看看自己改成点击拿Texture吧)

(大概发现移动端错乱的问题了,我个人用高通发布iOS,发现BackgroundPlane的Texture在大概uv大于0.66之后的位置会变黑,也就是摄像头的内容并没有铺满Texture,没有找到官方的获取摄像头满背景的Texture,也不知道这个问题在不同平台不同机种上会不会有不同,目前没有想到太好的解决方法……)



(EasyAR现在官方Unity例子有更简单的实现方案,大家去看那个吧)

欢迎分享

归海一啸
管理员
管理员
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
沙发#
发布于:2015-11-02 18:37
厉害
AR学院(www.arvrschool.com),从这里感触未来!
枫叶飘零
论坛版主
论坛版主
  • UID15
  • 粉丝0
  • 关注0
  • 发帖数28
板凳#
发布于:2015-11-02 19:43
研究shader都是大牛
shao_ming
侠客
侠客
  • UID236
  • 粉丝0
  • 关注1
  • 发帖数17
地板#
发布于:2015-11-02 22:05
相当的厉害
ht451358439
侠客
侠客
  • UID388
  • 粉丝0
  • 关注0
  • 发帖数7
  • 忠实会员
4楼#
发布于:2015-11-03 10:30
厉害
lcc2015
骑士
骑士
  • UID66
  • 粉丝0
  • 关注0
  • 发帖数29
  • 社区居民
  • 忠实会员
5楼#
发布于:2015-11-03 14:48
好东西,必须顶起来
康平梦
精灵王
精灵王
  • UID407
  • 粉丝0
  • 关注1
  • 发帖数30
  • 社区居民
  • 忠实会员
6楼#
发布于:2015-11-03 16:43
为什么我用工程文件没有出现效果呢。。。。。。。。。
康平梦
精灵王
精灵王
  • UID407
  • 粉丝0
  • 关注1
  • 发帖数30
  • 社区居民
  • 忠实会员
7楼#
发布于:2015-11-03 16:43
厉害!!!
lucky
贫民
贫民
  • UID408
  • 粉丝0
  • 关注0
  • 发帖数1
8楼#
发布于:2015-11-03 19:03
是不是scene没保存?想学习一下,但为何我4.6打开是空的,可否导一个unitypackage
归海一啸
管理员
管理员
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
9楼#
发布于:2015-11-03 22:31
lucky:是不是scene没保存?想学习一下,但为何我4.6打开是空的,可否导一个unitypackage回到原帖
5.2版本的,4.6打不开的,你升下版本
AR学院(www.arvrschool.com),从这里感触未来!
不跟随的脚印
贫民
贫民
  • UID410
  • 粉丝0
  • 关注0
  • 发帖数2
10楼#
发布于:2015-11-04 14:17
我使用5.0 32位 运行为什么没有效果?
肩负着巨人
新手
新手
  • UID302
  • 粉丝0
  • 关注0
  • 发帖数3
11楼#
发布于:2015-11-04 16:35
谁试过发布到移动端。。我PC端没问题,移动端,就出现UV错乱了。
ht451358439
侠客
侠客
  • UID388
  • 粉丝0
  • 关注0
  • 发帖数7
  • 忠实会员
12楼#
发布于:2015-11-04 18:57
肩负着巨人:谁试过发布到移动端。。我PC端没问题,移动端,就出现UV错乱了。回到原帖
我发布了移动端也是这样。你解决了吗。
tangoyzx
论坛版主
论坛版主
  • UID343
  • 粉丝5
  • 关注0
  • 发帖数9
13楼#
发布于:2015-11-05 09:17
肩负着巨人:谁试过发布到移动端。。我PC端没问题,移动端,就出现UV错乱了。回到原帖
移动端发布UV错乱应该是因为dx和opengl的uv  v坐标起点不同的原因= =~
肩负着巨人
新手
新手
  • UID302
  • 粉丝0
  • 关注0
  • 发帖数3
14楼#
发布于:2015-11-05 09:43
tangoyzx:移动端发布UV错乱应该是因为dx和opengl的uv  v坐标起点不同的原因= =~回到原帖
能说下解决方案么。。。。
上一页
游客

返回顶部