首页 > 其他分享 >Unity中从顶点着色器输出到片段着色器中间的顶点变换

Unity中从顶点着色器输出到片段着色器中间的顶点变换

时间:2023-02-02 01:33:34浏览次数:53  
标签:Unity 视口 坐标 空间 顶点 着色器

Unity中从顶点着色器输出到片段着色器中间的顶点变换

image-20230202003630324

上图来自《shader入门精要》,是渲染流水线中顶点的完整空间变换过程。

在顶点着色器中,主要完成了前三个阶段,即顶点坐标乘以MVP矩阵,把顶点变换到了裁剪空间中,然后作为顶点着色器的输出。

在顶点着色器到片元着色器中间,也就是裁剪空间到屏幕空间,是Unity自动帮我们完成的,但是这个过程不只有一个阶段。

变换到NDC空间

首先要把顶点变换到NDC空间,裁剪空间中,各个顶点的x,y,z分量的范围是【-w,+w】,因此首先进行了透视除法,把各个顶点从裁剪空间变换到了NDC空间,这时各个分量的取值范围为【-1,1】。

视口变换

之后,需要进行视口变换,把各个分量先乘以1/2,再加上1/2,这时各个分量的取值范围就变成了【0,1】,这里就是视口空间的坐标。

屏幕空间

把各个顶点的x,y值分别乘以屏幕的宽和高,就得到了顶点最终在屏幕空间的位置。

因此整个过程就是裁剪空间坐标=>NDC空间坐标=>视口空间坐标=>屏幕空间坐标

Unity Shader中的ComputeScreenPos

Shader中这个函数的输入是裁剪空间中的某个顶点坐标,但是输出的并不是视口空间中的坐标,视口空间坐标的范围是【0,1】,但是这个函数输出的范围是【0,w】,因此,在除以w之后,把范围映射到了【0,1】才得到了视口空间的坐标。

image-20230202005628939

上图同样来自《shader入门精要》,注意除法要在片元着色器中进行。

Unity之所以不自动执行这个除法,首先是因为在顶点着色器中进行这个除法会影响插值,投影空间不是线性空间,在顶点着色器中计算x/w和y/w,顶点着色器到片元着色器中的插值就会影响这个结果,而保留x,y,w,经过插值之后再计算,结果就正确了。

另外一个原因是Unity希望你把该坐标值用作tex2Dproj指令的参数值,tex2Dproj会在对纹理采样前除以w分量。

这两种方法是等价的

tex2Dproj(_Tex, projCoord) == tex2D(_Tex, projCoord.xy / projCoord.w)

当我们需要采样某张屏幕空间的投影图时(深度图),后面是手动进行除法,效率没有前面的方法高。

标签:Unity,视口,坐标,空间,顶点,着色器
From: https://www.cnblogs.com/luoxiaozhu1998/p/17084624.html

相关文章

  • Unity性能优化(三) 垃圾回收,Garbage Collection,GC
    Unity的内存管理Unity由两部分内存来组成,原生内存(NativeMemory)和托管内存(ManagedMemory)。其中NativeMemory是引擎管理的内存,大家接触的会比较少,而且可操控性也比较......
  • 【unity】基于命令模式的剧情系统
    前言回想某次项目,我负责一个剧情模块的搭建。当时才疏学浅,只会用链式结构绑定每个UI对象,这种做法非常费事而且耦合过高。现在我的这个系统也算是给当年一个交代吧,以后有类......
  • Unity声音
    (音乐)(音效)......
  • unity UnityEngine.Object 和 == ?. ??.的关系。
    参考:https://answers.unity.com/questions/1705335/how-can-throw-missing-reference-exception-this-gam.htmlhttps://docs.unity3d.com/ScriptReference/Object.html......
  • 关于unity使用导入 .unitypackage报错的解决技巧
    在开发过程中,大家难免会下载网络demo用来参考,但是网络上的demo,有很大一部分demo在导入时是报错的,此时就需要修复它让它可以顺畅地运行起来。 在使用demo时,就遇到了一种报......
  • unity monobehaviour constructor function和SerializationCallbackReceiver对应
    https://answers.unity.com/questions/862032/c-constructor-in-monobehaviour.html See,serializationoftheobjectsinthescene(andthescriptsonthem)happ......
  • unity 骨骼物理 头发 布料模拟
    能够实现模拟布料效果的现在通常使用的有两种:DynamicBoneMagicaCloth(https://magicasoft.jp/magica-cloth/)一般现在使用的布料模拟,会选择这两种,第一种是直接对骨骼节点添加......
  • unity 皮肤材质效果实现分析
    相关资料​​https://therealmjp.github.io/posts/sss-intro/​​​里面讲解了次表明散射的概念原理,以及发展过程。到了实时渲染,早期的基于纹理空间的扩散,到现在经常会应用......
  • unity urp 衣服渲染
    正常衣服的布料分类:棉,羊毛,绒丝绸尼龙皮革还有一些特殊的比如富贵的貂那种绒毛,还有一些闪闪发光的那种。首先说一下基础的棉类的衣服。质地偏软,和之前默认的硬表面有很......
  • unity URP前向渲染流程以及获取屏幕空间UV和深度
    前向渲染流程cpu上进行剔除和排序,剔除为,相机的视椎体剔除,将相机视角外的模型剔除掉,不再渲染。遮挡剔除,将视椎体内不可见的模型剔除掉,不再渲染。排序为了保证性能,不透明为从......