只需在 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
假设您有一个普通的 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