有了解Unity这个看视频软件的吗

有了解Unity这个看视频软件的吗,第1张

Unity 是基于GNOME桌面环境的用户界面, 由Canonical公司开发,主要用于Ubuntu *** 作系统。

Unity 最初出现在Ubuntu Netbook 1010中。它最初的目的是更有效地利用上网本有限的屏幕尺寸。和 GNOME, KDE 不同,Unity并非一个完整桌面程序安装包,而采用了现有的方案。

Unity 环境利用了来自 GNOME 3 中的一些关键组件,包括 Mutter 混合型窗口管理器和 Zeitgeist活动记录引擎。

其启动器使用 Clutter 建立,这与构建 GNOME Shell所用的图形框架相同。虽然底层的技术相似,但 Unity 用户界面完全是不同的实现,它并没有使用来自 GNOME Shell 的任何代码。

Unity 这个新 Shell 主要被设计成可更高效的使用屏幕空间,与传统的桌面环境相比,消耗的系统资源更少。Unity 将成为 Ubuntu Netbook 版本及新的 Ubuntu Light 即时(instant-on) 计算平台的关键组件。

Unity 环境打破了传统的 GNOME 面板配置。它的左边包括一个类似 Dock 的启动器和任务管理面板;而顶面板则由应用程序 Indicator、窗口 Indicator、以及活动窗口的菜单栏组成。

截至2010年Unity开发人员使用的一个名叫Nux的工具替代了Clutter,实现了Unity变成了Compiz的窗口管理器一个插件,且运行速度要比Mutter快。

2011年1月14日又发布了一个技术预览版规范的基于Qt的Unity 2D版本。

Ubuntu原本使用的是完整的GNOME桌面环境。由于Ubuntu创始人Mark Shuttleworth对用户体验的哲学理念与GNOME团队有不同的理解。

从2011年4月的Ubuntu 1104起,Ubuntu使用Unity作为默认的用户界面,而不采用全新的GNOME Shell。但Ubuntu可通过PPA来安装GNOME Shell 。

这是Timeline系列的第三篇,前两篇分别是 Unity3D Timeline预览 和 Unity3D Timeline工作流 。本篇将会详细详解Timeline编辑器的具体功能,主要分为以下几个部分:

如果你还不熟悉timeline编辑器,强烈建议搜藏了以备不时之需。接下来还会有终篇,讲Timeline结合脚本在Runtime时候的一些进阶使用技巧。

在Timeline编辑器中,我们可以使用Timeline选择器来选中一个Timeline实例来进行查看、修改或者预览等 *** 作。预览按钮(左边红框)用来开启\关闭Timline在场景理的预览效果。

点击Timeline选择器,在d出的菜单中会列出当前场景所有的Timeline实例,菜单中的每一项显示Timeline资源的名字以及他所关联的GameObject的名字。例如,GroundTimeline关联了Ground这个GameObject,因此显示的名字为:“GroundTimeline(Ground)”。

Timeline控制区域的按钮用与播放Timeline实例,以及控制Timeline的播放指针。

点击Timeline的Start按钮,或按下Shift+<来把Timeline的播放指针移动到Timeline的开始位置。

点击Timeline的Previous按钮,或按下<键来把Timeline的播放指针移动到前一帧的位置。

点击Timeline播放按钮或按下空格键来在Timeline播放模式中预览Timline的动画内容。Timeline播放模式涉及下列具体的细节:

点击Timeline的Next Frame按钮,或者按下>键来把Timeline的播放指针移动到下一帧的位置。

点击Timeline的End按钮,或者按住Shift然后再按下>键,Timeline的播放指针会移动到Timeline的末尾。

激活Play Range按钮后,把Timeline限制在指定的范围内播放(帧或者秒,具体取决于设置)。Timeline编辑器用白色的高亮区域来显示播放区域,拖动白色高亮标记的两端可以调整播放的范围。

此时,Playable Director组件中的Warp Mode属性用于确定播放指针抵达播放范围的末尾时的行为。需要注意的是:这里指定的播放范围,只在Timeline编辑器窗口中有效。在Play模式下,Unity会忽略这个限制。

Timeline播放指针( 右边的红框 )代表了Timeline在预览时精确时间点。Timeline播放指针的位置输入框( 左边红色框里的值 )表示了当前在整个Timeline中的哪一帧或哪一秒。

要把Timeline播放指针放在特定的时间,你可以通过点击Timeline的时间轴,也可以通过在播放指针位置的输入框内输入时间值然后按下回车键。当输入值后,输入的数字会根据Timeline的具体设置转化成秒或者帧数。例如,假如Timeline的时间轴表示的是秒且每秒有30帧,那么输入180的时候,输入框里面的值会转化成秒,同时把Timeline的播放指针移动到6:00的位置。

本小节内容主要描写Track视图的各种功能。

Track列表用来添加、选择、复制、删除、锁定、屏蔽、重新排列组成Timeline资源的track。同时你也可以把多个track编成一个track组。

track前面的竖线的颜色表示track的类型。默认情况下,Activation track是绿色的,Animation track是蓝色的,Audio track是橙色的,Control track是蓝绿色的,以及Playable track是白色的。

track的绑定信息存储在timeline实例中。而Playable Director 组件把GameObject和Timeline关联在一起,这种关联被认为是Timeline资源的实例化,具体请参考Timeline预览篇。

在Timeline编辑器为我们提供了多种方法来添加track。最简单的方法是点击Add按钮,然后在d出的菜单里面选择要你想创建的track类型。也可以右键点击Track列表的空白区域,接下来的 *** 作和点击Add按钮之后一样。

Timeline编辑器也支持把GameObject拖拽进Track列表。拖拽一个GameObject到Track列表的空白区域之后,从d出的菜单里选择要添加的track类型。根据所选择的不同track类型,Timeline编辑器会根据对应track类型执行不同的 *** 作:

通过点击来选择单个track,在选择一个track的同时会反选其他的track。选中track的属性显示在Inspector窗口中,由于选择的track类型不用,因此在Inspector中可以修改的属性也会有所差别。

如果要选中相邻的几个track,可以在选择第一个track之后,按住Shift然后点击最后一个track。例如,要选择3个相邻的tracks,点击第一个track,然后按住Shift后点击第三个track。这样就完成了3个track的选择。

按住Command或者Control,然后点击track来选择不相邻的多个track。同样的 *** 作也可以用于反选不同的track。

Timeline编辑器提供了下列不同的方法来复制track:

需要注意的是:复制track会复制track里面的所有clip,blend,以及Inspector属性。如果被复制的track有绑定GameObject,复制出来的track,binding会设置成空值。

右键点击track,然后从d出的窗口中选择 Delete

删除track用来从timeline编辑器里面移除track,这个 *** 作会删除track包含的所有clip,blend,以及属性。这是一个有风险的 *** 作,它会修改Timeline资源和影响这个资源生成的所有Timeline实例。

删除一个Animation track同时也会从Timeline资源里面删除已经录制的Infinite clips。这里需要注意一点,在Save Project之前,在Project窗口中的Timeline资源下依然会显示已经被删除的Infinite clip

锁定track用于锁定track以及其使用的所有clip。当一个track的动画制作完成后,为了避免误 *** 作导致的修改,把这个track给锁定。锁定后的track无法编辑,它的clip无法被选中。track上显示的锁的图标,标志着当前track处于被锁定状态。

这里一定要注意:被锁定的track也是可以被删除的,所以删除track还是要仔细看清楚啦。

屏蔽track用于关闭track里所有的clip。当你制作的Timeline实例有很多个Track的时候,屏蔽track功能可以帮助你把注意力集中在你想重点关注的track上。track显示屏蔽图标的,标志着当前track处于屏蔽状态。

右键点击轨道,然后在d出界面中选择Mute。也可以选中一个track之后按下M键。你可以同时屏蔽多个track,要解除屏蔽,直接点击屏蔽的图标就可以了。

track的渲染和动画优先级是从按从上至下的顺序来排列的。重新排列track可以改变渲染或者动画的优先级。例如,Track列表包含两个Animation track,用于使GameObjec产生位移动画,第二个Track将会覆盖第一个track的动画。动画优先级很好地解释了为什么Animation Override tracks是作为Animation track的child track来创建的,因为如果不是child track的话,它会完全覆盖第一个track的动画。

要重新排列tracks,你需要先选择1个或者多个track,然后拖动他们,直到track列表中间出现一条白线。白线标志着被拖拽的track在松开鼠标后的目标位置。这里要注意的的是Animation Override track和它的父Animation track绑定的是同一个GameObject,重新摆列Animation Override track会把它转换成Animation track,同时也会把绑定值设置为空。

当我们的Timeline中有很多track的时候,我们可以使用Track Group来管理它们。例如,一个Timeline资源包含和同一个GameObject交互的Animation track和一个Audio track,我们可以把这两个track移动到为它们创建的Track group里面。

点击Add按钮,然后选择Track Group来创建一个Group。我们也可以右键点击Track列表的空白区域,然后在d出的菜单里面选择Track Group,一个新的Track group被添加在track列表的底部。

点击Track Group的名字,会出现一个工字型的光标,此时输入Track Group的新名字,然后按下回车。

选择一个或多个track,然后拖动到Track group的上面,此时Track group显示为高亮,松开鼠标后,被拖动的track就会被编组到Track Group里面去。

如果要把一个track放置到Track group中某个特定的track的前面,只需要拖动到那个特定的track上,等标志位置的白色插入线显示后,放开即可。

Track group同时也可以包含任意数量的子group。选择一个Track Group然后点击Add按钮,也可以点击Track group名字旁边的加号图标,然后选择Track Sub-Group。

点击Track group名字旁边的三角形图标来隐藏Track group内的所有track。这些track并没有被屏蔽,只是不在Timeline编辑器中显示。要显示它们的话,再次点击三角形图标就可以了。

Clip视图是我们用来 *** 作clip的视图,Clip视图中的clip必须是和track关联的。

每一个clip下有一条线用来显示track的类型。默认情况下,Activation clip为绿色,Animation clip为蓝色,Audio clip为橙色,Control clip是蓝绿色的,Playable clip是白色的。

使用下面的方法来平移、缩放、以及让Clip的大小自适应Clips视图:

同样,Timeline编辑器根据track的类型,支持多种不同的创建Clip的方法。最快的方法是点击Track的空白区域,在菜单里选择“Add ……”来创建。根据不同的track类型。,“Add ……”的选项内容有所不同。

也可以直接拖一个Animation Clip到Timeline编辑器窗口的空白区域,这会自动创建一个track,并把这个clip添加到轨道里。

通过点击clip来进行选择 *** 作,选中一个clip会反选之前选择的clip,被选中的clip会显示一个白色边框。选中一个clip之后,它的属性将显示在Inspector窗口中。你可以在Inspector窗口做一些细微的调整,具体可以调整的属性,取决于clip的类型。

按住Shift键然后点击clip用来选择连续相邻的clips。例如,我们要选择连续的3个clips,点击第一个clip,然后按住Shift键再点击第三个clip,这3个clips就全部被选中了。

按住Command/Control,再点击clip可以用选择/反选不相邻的clips。

点击Clip视图的空白区域然后拖动鼠标会在Clips视图里面绘制出一个选择矩形,和选择矩形相交的所有Clips都讲会被选中。如果在用矩形选择的过程中按住Shift键,在选择的时候不会反选之前选中的Clips。

还可以通过Timeline的播放指针来选择Clips。右键点击Timeline的播放指针,然后选择一个选择的选项。

选择track,通过拖动来调整Clip的位置,在拖拽的时候,黑色的参考线显示clip的范围,Timeline的时间轴上显示被调整位置的clip的开始时间和结束时间。

还可以选中clip后在Inspector窗口修改start或end的时间,也可以把一个clip移动到另外一个相同类型的track中去。

当调整一个clip的位置的时候,如果一个clip叠在了同一个track中的另外一个clip上,此时是产生blend还是overrie效果,取决于track的类型:

平铺Clips用于移除同一个track中的两个相邻clip之间的缝隙、融合,以及重叠。如果你想让每一个clip都紧接着它前一个clip开始的话,使用clip的平铺可以非常方便实现。在平铺clip的时候,需要在同一个track上至少选择2个 clip。

Timeline编辑器支持下面几种方法来复制Clips:

复制clip会拷贝选中的clip,然后把复制出的clip放在当前track的最后一个clip的后面。如果你复制的clip使用了融合,复制出的clip会消除融合,对齐放在track的末尾。

如果复制的Animation clip使用了recorded clip作为资源,那么在复制的时候,也会在TimelineAsset里面产生一个recorded clip的拷贝(这个拷贝在Save Project后出现在Timeline资源下)。

修剪 *** 作非常有用,就好比是在影视后期剪辑中,只引用某些拍好的影片片段的一部分。

我们可以拖动clip的起点和终点来调整clip的长度,此时会自动选中clip,并且在Inspector 窗口显示它的属性。我们可以使用Inspector窗口中的来精确的设置Clip的开始、结束、clip的长度、以及偏移(Clip In)。

在Clip窗口中调整Animation Clip或者Audio clip的起点时,Start只有在clip关联了资源之后才能被拖动。

修剪动画的 *** 作是安全的,可以反复修改动画的起点来调整clip包含的动画或者声音的波形。为了精确的调整clip的起点所在的帧或者时间,在Inspector窗口中直接设置Clip In的值有同样的效果。

和调整clip的起点一样,通过调整clip的终点也可以用来裁剪出原始资源在clip中使用的部分。

如果你设置的终点超过了clip所基于的原始资源的长度,那么clip的额外区域是处于保持还是循环,取决于资源的设置。举个例子,名为“End Move”的clip使用了动画文件“Recoreded(2)”。“Recorded(2)”的文件设置成的循环模式。当设置clip的终点超出了“Recorded(2)”的长度时,超出的部分,也会循环。下图中白色曲线表示是循环模式。

通过设置资源的循环模式来设置超出区域的是保持还是循环,如果你忘记当前clip是使用的哪一个clip,可以选中clip,然后点击右键,选择 Find Source Asset ,资源被高亮显示在Project窗口中。

timeline编辑器为循环模式的Animation clip或Audio clip提供了两种特殊的剪切方法:1、直接删除最后部分循环,2、补完最后的部分循环。例如run_away的长度超过了它基于的资源的三倍长度,由于资源文件的循环模式是设置成循环的,因此Animation Clip会循环播放动画。

如果想要补完动画结束时不完整的循环,选中Clip,然后右键点击并选择Editing->Complete Last Loop如果要剪掉最后不完整的循环,则使用Trim Last Loop。

Timeline编辑器还支持通过播放指针的位置来剪切clip,把Timeline的编辑器指针拖到要裁剪的位置,右键点击clip,然后选择Editing > Trim Start或者Editing > Trim End。Trim Start用于把clip的起点调整到播放指针的位置。Trim End用于把Clip的终点调整到播放指针的位置。

[上传失败(image-e111cc-1529590146702)]

Timeline编辑器支持把一个clip拆分成两个相同的clip,把播放指针放在Clip的中间,然后右键点击Clip选择Editing > Split(或者按下S),Clip就被分成两个分离的clip,它们可以各自的编辑,修剪,调整在Timline中的位置。这里要注意的是,拆分Clip的 *** 作不会修改到Clip所引用的原始资源,因此可以通过reset a clip或者手动调整clip的开头和结尾来扩展成包含全部的动画。

可以通过reset a clip *** 作把一个clip调整到其原始的长度,右键点击clip然后选择Editing-> Reset Editing。需要注意的是重置Clip并不会重置下列属性的和设置:

修改clip的播放速度来实现动作、动画、音效、粒子效果等的加速或者减速播放,改变clip的播放速度会影响clip的长度。在Timeline中,我们可以修改Animation,Audio,Control这三种类型的clip的播放速度,其他类型的Speed选项是无法修改的。

在Inspector窗口中,Speed Multiplier属性显示的是clip的原始速度的倍率。例如,把一个长度为80帧的动画修改为两倍速播放的话,需要把Speed Multiplier设置成2,此时该动画的长度为40帧。

也可以通过右键点击clip,然后选择下面的方法来修改Clip的播放速度:

Gap extrapolation指的是Animation track在Animation clip的前后如何接近动画数据。它的主要作用是在两个Animation clip之间的间歇中间进行插值来避免动画的异常。这种异常包括GameObject在两个坐标间抖动或者类人形动画在不同的两个姿态之间抖动。每一个Animation clip 都有两个gap extrapolation设置:pre-extrapolate和post-extrapolate前者控制在Animation clip之前的间隙如何接近动画数据,后者控制Animation clip后面的缝隙如何接近动画数据。默认情况下,两个都设置成的Hold,指的是在Animation clip之前,保持动画数据的第一帧,在Animation clip之后保持动画数据的最后一帧。Animation clip前后的图标表示所选的gap extrapolation的模式。

在Clip视图中选择Clip,然后修改Inspector窗口中的Animation Extrapolation来修改pre-extrapolate和post-extrapolate模式。

如果被选中的Animation clip所在的track只有这个clip,那么对于Pre-Extrapolate模式有以下可选项:

如果被选中的Animation clip所在的track只有这个clip,那么对于Post-Extrapolate模式有以下可选项:

Ease-in和Ease-Out用于创建clip和包围它的间隙之间的平滑过渡,选中clip,然后在Inspector 窗口中设置Ease In Duration或Ease Out Duration来创建。(在Unity的官方用户手册中还提到了按住Control/Command, 然后把clip的起点往右拖来创建ease-in。但是我在Unity20174中实这个功能,发现没有效果,只能猜测是Unity的Bug了。)

ease-in和ease-out的具体效果取决于track的类型:

可以通过点击下拉菜单把值从Auto修改成Manual来自定义ease-in或ease-out过渡的曲线。设置成Manual后,Inspector窗口中出曲线的预览。点击曲线预览,在Inspector窗口下方会打开曲线编辑器窗口。

需要从shader 中获取深度值,主要涉及到渲染流水线中的以下几个节点

1观察空间:观察空间是以摄像机所在位置为原点的空间。我们尝试获取的深度信息就是在这个空间之下。

2裁剪空间(投影空间、齐次裁剪空间):将顶点转换到此空间下来判断是否在视椎体内,从而裁剪掉不在摄像机视野内的顶点;将顶点变换到此空间下可以方便做后续的投影工作。

3屏幕空间:将没有被裁剪的顶点从裁剪空间转换到此空间,从而最终呈现在屏幕上。

主要涉及到的术语

1裁剪矩阵(投影矩阵):

用于将顶点从观察空间转换到裁剪空间的矩阵。

经过裁剪矩阵的 *** 作后,顶点的x、y、z分量则被转换到裁剪空间中。

裁剪空间下的顶点满足以下条件的,即为在视野内的顶点:

-w<=x<=w;

-w<=y<=w;

-w<=z<=w;

以上裁剪原理与深度获取关系不大,只需要注意:

经过裁剪矩阵的 *** 作后,顶点的w 分量保存了顶点在观察空间下的深度信息(观察空间的顶点的z 分量)。

2齐次除法(透视除法):

经过裁剪矩阵的 *** 作之后,将裁剪空间下的顶点的x、y、z 分量分别除以w 分量的过程。此过程完成后,裁剪空间下的顶点将会转换到NDC 中,即变换到一个各分量从-1到1长度为2的立方体内部。如果使用的是透视摄像机,因为z 分量保留了深度信息,经过透视除法以后,越远离摄像机的顶点其xy分量数值将越小(因为w 分量是观察空间中顶点的z 分量,对于两个顶点,如果他们x、y 分量相同,而w 分量不同即深度不同,越远的顶点经过透视除法后,其数值也就越小)。齐次除法完成后,顶点的x、y 分量再经过简单的缩放映射即可投射到屏幕空间二维坐标中,而z 分量通过d = 05z + 05 转变为0-1 范围并作为最终会存贮于深度图中的数据。

3屏幕空间:

渲染管线中最后一个流程将裁剪空间中的顶点通过透视除法和屏幕映射映射最终从3D 的裁剪空间转换到2D 的空间中,这个2D 空间就是屏幕空间。屏幕空间是左下角为(0,0),右上角为(screenwidth, screenheight)的二维空间。

Shader 中获取深度(unity 2019419 urp)

Shader 中将顶点从裁剪空间转换到屏幕空间(即齐次除法和屏幕映射)由底层完成,而获取深度的原理就是再现这一 *** 作中某些步骤的过程。

通过顶点数据可以直接获得顶点的深度;通过顶点数据和屏幕映射公式可以逆推获得屏幕纹理坐标,使用屏幕纹理坐标可以采样深度图,然后将深度图中的数据逆推回模型空间就可以获得需要的场景深度。

1顶点着色器中需要完成将顶点从模型空间转换到裁剪空间下的任务。

2来到片元着色器中,经过Unity 渲染流程的处理,顶点输出的裁剪空间顶点(SV_POSITION 语义)坐标的xy 分量已经做了透视除法和屏幕映射处理转换到了屏幕空间当中,z 分量也做了透视除法并转换到(0,1)范围内,w 分量仍然是观察空间下的深度值。

获取顶点的深度值:

裁剪空间顶点坐标w 分量就是视角空间下的深度值,将其除以远裁面就是0-1 的深度值。

远裁剪面的距离可以通过内置的_ProjectionParamsz 变量来获取。 

或者比较傻的办法:

1上面讲到片元着色器中,裁剪空间中的顶点(SV_POSITION 语义)坐标的z 分量已经做了透视除法并转换到了(0,1)范围中,此时只需要将其逆推回观察空间即可;

2利用公式:(n表示远裁剪面;f表示近裁剪面;d表示ndc中重映射后的深度值,即第2步骤计算出的数值)

zv = 1/((n-f/nf)d + 1/n) 计算出观察空间下的深度值,将其除以远裁剪面就是0-1范围的观察空间下的深度值,公式:

z01=1/((n-f)/nd + f/n)

以上公式实际上是将渲染管线处理后的顶点逆推回观察空间中,实际上是结合了投影矩阵z 分量上的处理公式、透视除法公式、屏幕映射公式三个步骤逆推出来的公式。

之所以说这个方法很傻,是因为绕了一个圈,因为顶点从裁剪空间转到屏幕空间下又逆推回了观察空间,之所以要介绍这种办法,是因为在遇到需要获取场景深度值的需求时,我们可以拿到的数据(即深度图)存储的正是步骤1 中顶点z 分量的值。

由于顶点在转换到裁剪空间时,其w 分量就是观察空间下的z 分量,如果只需要顶点的深度,还是建议直接使用裁剪空间顶点的w 分量作为深度值。

 

获取场景的深度值:

1上面提到在片元着色器中,顶点坐标的xy 分量已经从裁剪空间转换到了屏幕空间。

2直接将顶点坐标的xy 分量除以屏幕的长宽就可以得到0-1 范围的uv 坐标(屏幕纹理坐标),屏幕的长宽可以通过内置变量_ScreenParams 获取。

3对深度图进行采样: SAMPLE_TEXTURE2D_X(_CamearaDepthTexture, sampler_CameraDepthTexture, uv)

采样深度图需要在shader 中作如下声明:

TEXTURE2D_X_FLOAT(_CameraDepthTexture);

SAMPLER(sampler_CameraDepthTexture);

4 利用公式:(n表示远裁剪面;f表示近裁剪面;d表示深度图中的数据,即第四步结果的x分量)

zv = 1/((n-f/nf)d + 1/n) 计算出模型空间下的深度值,将其除以远裁剪面就是0-1范围的深度值,公式:

z01=1/((n-f)/nd + f/n)

也可以在顶点着色器中计算采样坐标 , 但是因为从顶点到片元着色器有一个插值过程,所以不能在顶点着色器中进行齐次除法,因此需要乘回w 分量,计算公式:(vc 为裁剪空间下的顶点坐标、vcw为该坐标的w分量)

vcw(vc/vcw05+05) => 05vc+05vcw

这也是内置函数ComputeScreenPos 的实现。

然后在片元着色器中进行齐次除法获得uv 坐标,然后从步骤3继续往下执行

如果在顶点着色器使用了ComputeScreenPos获得Vs;

那么对于步骤5 可以使用unity 内部提供的两个方法Linear01Depth、LinearEyeDepth 传入屏幕纹理坐标和_ZBufferParams 来获取观察空间的场景深度和0-1线性深度,函数内部的原理即为上述步骤5 。这也是shaderGraph 中SceneDepth 节点的做法。_ZBufferParams 是Unity 提供的内置变量,里面包含了远近裁剪平面相关的预计算。 同理,顶点的坐标也可以使用这种方式来获得,只不过顶点的深度我们可以直接通过齐次除法来取得。

源码

Shader "Custom/Depth"

{

Properties

{

}

SubShader

{

Tags { "RenderType"="Transparent" "Queue"="Geometry" "RenderPipeline" = "UniversalRenderPipeline"}

LOD 200

Pass

{

HLSLPROGRAM

#include "Packages/comunityrender-pipelinesuniversal/ShaderLibrary/Corehlsl"

#include "Packages/comunityrender-pipelinesuniversal/ShaderLibrary/Lightinghlsl"

#pragma vertex vert

#pragma fragment frag

struct a2v

{

float4 vertex : POSITION;

};

struct v2f

{

float4 vertex : SV_POSITION;

//结合ComputeScreenPos 使用

//float4 screenUV : TEXCOORD5;

};

CBUFFER_START(UnityPerMaterial)

CBUFFER_END

TEXTURE2D_X_FLOAT(_CameraDepthTexture);

SAMPLER(sampler_CameraDepthTexture);

v2f vert(a2v i)

{

v2f o;

overtex = TransformObjectToHClip(ivertexxyz);

//需要在片元中做透视除法

//oscreenUV = ComputeScreenPos(overtex,_ProjectionParamsx);

return o;

}

half4 frag(v2f i) : SV_TARGET

{

//顶点深度

half dv = ivertexw;

//顶点01 深度

half dv01 = ivertexw / _ProjectionParamsz;

//直接获取屏幕纹理坐标

float2 screenUV = ivertexxy / _ScreenParamsxy;

//结合ComputeScreenPos 计算屏幕纹理坐标

//float2 screenUV = iscreenUVxy / iscreenUVw;

//深度图中存储的深度,需要逆推回到观察空间

float dd = SAMPLE_TEXTURE2D_X(_CameraDepthTexture, sampler_CameraDepthTexture, screenUV)r;

//观察空间中的0-1场景深度

float ds01 = Linear01Depth(dd, _ZBufferParams);

//观察空间中的场景深度

float ds = LinearEyeDepth(dd, _ZBufferParams);

return ds01;

}

ENDHLSL

}

}

}

你是否想问unity加了脚本点播放没有反应会有哪些原因?加了脚本点播放没有反应会有如下原因:

1、脚本是要放在一个叫做OnAnimatorIK的事件下面,这个事件不是放在UPDATE下面,是一个基于MonoBehaviour持续在侦测的事件,都是需要每帧去计算它的新的位置和角度。

2、事件的脚本是必须要挂在你Animator所在的OBJ对象上的,不然以上脚本是不会执行的。

3、对象角色模型和动画资源应该是用的unity3d自己的动画骨骼系统。

满足了这三个细节点,你的脚本是一定运行的起来。如果仍有误差,可以在后期软件里面适当的调整视频的长度来配合。

以上就是关于有了解Unity这个看视频软件的吗全部的内容,包括:有了解Unity这个看视频软件的吗、[干货分享]Unity3D 深入解析Timeline编辑器、Unity shader 获取深度的详细数学原理等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9266908.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存