float3 worldTangent = UnityObjectToWorldDir(v.tangent.xyz); //世界副切线 float3 worldBinormal = cross(worldNormal,worldTangent)*v.tangent.w; 注意: 不同的数据类型需要用不同的命令转换空间 //世界空间顶点 float3 worldPos = mul(unity_ObjectToWorld, v.vertex).xyz; //世界空间法线 float3 world...
也就是UnityObjectToWorldNormal()里的两段代码南辕北辙,那么
UnityObjectToWorldDir用于把模型空间下的矢量转换到世界空间 UnityObjectToWorldNormal用于把模型空间下的法线向量转换到世界空间。因为必须保证法线垂直于模型的表面,所以缩放的时候与普通矢量不一样。 如果法线用UnityObjectToWorldDir,则会出现以下错误 , 而用UnityObjectToWorldNormal,则可得到正确的结果 详细解释如下 ...
问题描述:在学习《Shader入门精要》时,在顶点着色器中对法线和坐标的空间变换采用了不同的操作,进行坐标变换的矩阵为unity_ObjectToWorld,而进行法线变换的矩阵竟然是unity_WorldToObject,如下所示: f.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject); // 将顶点法线从模型空间变换到世界空间 f.wor...
o.pos = UnityObjectToClipPos(v.vertex); o.worldNormal = UnityObjectToWorldNormal(v.normal); o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz; o.worldViewDir = UnityWorldSpaceViewDir(o.worldPos); // Compute the reflect dir in world space ...
对于卡通渲染需要的高光反射光照模型,我们同样需要计算normal 和 halfDir 的点乘结果,但不同的是,我们把该值和一个阈值进行比较,如果小于该阈值,则高光反射系数为0,否则返回1。 float spec = dot(worldNormal, worldHalfDir); spec = step(threshold, spec) ...
转载自 冯乐乐的 《Unity Shader 入门精要》 尽管游戏渲染一般都是以照相写实主义作为主要目标,但也有许多游戏使用了非真实感渲染(NPR)的方法来渲染游戏画面。非真实感渲染的一个主要目标是,使用一些渲染方法使得画面达到和某些特殊的绘画风格相似的效果,例如卡通、水
o.worldPos = UnityObjectToWorldNormal(v.normal); o.worldNormal = UnityObjectToWorldNormal(v.normal); o.worldViewDir = UnityWorldSpaceViewDir(o.worldPos) ; //物体反射到摄像机中的光线方向,可以由光路可逆的原则来求反来取得。 //也就是说,我们可以计算视角方向关于顶点法线的反射方向来求得入射光线...
这两个函数名字已经写得非常清楚了,UnityObjectToWorldDir是把一个普通的矢量从模型空间变换到世界空间,UnityObjectToWorldNormal是专门用于把法向方向从模型空间变换到世界空间。至于为什么法线的方向变换与其他普通的矢量变换不同,这个在书里在4.7节就已经讲过了哦,而且UnityCG.cginc文件里面的代码也写得非常清楚了: ...
其实我感觉直接用现成的UnityObjectToWorldNormal(float3 norm)就完事了. 这个函数就是针对是否包含非等比缩放(非统一)封装了一下以上方法.还是神龙给力. 什么值得批 默默无闻 1 这是书中法线推导过程,这里有个疑问,为什么一个矩阵能直接等于他的转置矩阵。---你问错问题了, 并不是矩阵为什么等于它的转置. 非...