2

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

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

然后画一个正方形..

在此处输入图像描述

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

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

在此处输入图像描述

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

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

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

怎么做?你能?

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

4

1 回答 1

5

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

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-如果-那么-how.418345/

于 2019-01-14T19:01:38.033 回答