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

Fat*_*tie 2 shader cg hlsl unity-game-engine unity3d-shaders

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

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

然后画一个正方形..

在此处输入图片说明

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

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

在此处输入图片说明

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

在当前的统一 (2018) 中,您如何简单地获得对象的当前缩放比例,在 Cg 中?

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

怎么做?你是否可以?

目前我只有一个简单的脚本传递值,这还可以,但有点以次充好。

Bri*_* V. 5

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

half3 ObjectScale() {
return half3(
    length(unity_ObjectToWorld._m00_m10_m20),
    length(unity_ObjectToWorld._m01_m11_m21),
    length(unity_ObjectToWorld._m02_m12_m22)
);
Run Code Online (Sandbox Code Playgroud)

}

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

还有不同的方式来访问矩阵组件: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-如果是这样的话.418345/