只需在 Cg 着色器中获取对象的缩放比例

Simply get the scaling of an object inside the Cg shader

假设您有一个普通的 Unity 着色器。它根本不使用任何纹理。它只是抓住了位置..

void vert (inout appdata_full v, out Input o) 
{
    UNITY_INITIALIZE_OUTPUT(Input,o);
    o.localPos = v.vertex.xyz;
}

然后画正方形..

示例中的四边形已使用变换拉伸了大约 3:1。

如果在着色器中我们只知道缩放比例(或者只是比率),我们就可以很容易地绘制 "square squares"

这显然是广告牌、2D 图像和背景等常见的日常技术。

在当前的 unity (2018) 中,你如何简单地获取对象的当前缩放比例,在 Cg 中?

这是疯狂的 Unity 事物之一,它 (1) 完全没有记录 (2) 关于它的唯一可用信息是 13 岁 ,我的意思是一些相关人员可能已经去世 (3) 它在不同的 Unity 版本中发生了巨大变化,因此经常讨论它是完全错误的。唉。

怎么做?可以吗?

目前我只有一个简单的脚本传递值,这还可以,但有点粗制滥造。

变换的比例被烘焙到世界矩阵中。如果你的对象没有旋转,那么你可以通过稍微调整一下直接获取它,但很可能你想做这样的事情:

half3 ObjectScale() {
return half3(
    length(unity_ObjectToWorld._m00_m10_m20),
    length(unity_ObjectToWorld._m01_m11_m21),
    length(unity_ObjectToWorld._m02_m12_m22)
);

}

注意:此实现依赖于 API,您可能需要在 DX/OGL 中使用一些 DEFINE 来处理此问题,因为矩阵格式不同(行顺序与列顺序).

还有不同的方法来访问矩阵组件:https://docs.microsoft.com/en-us/windows/desktop/direct3dhlsl/dx-graphics-hlsl-per-component-math

喜欢这个线程中的例子https://forum.unity.com/threads/can-i-get-the-scale-in-the-transform-of-the-object-i-attach-a-shader-to-if-so-how.418345/