为什么我的着色器调用 UnityObjectToClipPos() 导致我的 *other* 着色器不可见?
Why is my shader's call to UnityObjectToClipPos() causing my *other* shaders to be invisible?
我通过名为 Shadero Sprite 的基于节点的着色器工具创建了一个着色器,我正在尝试调试它的问题。由于代码是由基于节点的工具生成的,我不能完全确定着色器中每一行的目的是什么,这使得这个问题很难调试。
问题是,虽然着色器本身工作正常,但在我的 Unity 场景中有一个对象会导致我场景中的某些 other 对象根本无法渲染;他们变得不可见。
这似乎与下面对 UnityObjectToClipPos()
的调用有关:
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
...因为,如果我替换...
o.vertex = UnityObjectToClipPos(v.vertex);
...与...
o.vertex = v.vertex;
然后另一个 shaders/objects 渲染正常。然而,这当然意味着这个着色器看起来不正确。
我能够推断出的唯一其他线索是其他对象(不可见的对象)是 Unity UI 元素,它们都具有自定义着色器。一个着色器正在使用对 UnityObjectToClipPos() 的调用。另一个似乎没有(尽管它有很多 #includes
,所以也许确实存在对它的调用,埋在其中一个 #includes
中)。
为什么这个函数调用导致其他对象不可见,我可以用什么替换它来修复它?
编辑:这是更大上下文的场景配置:
为了在3D中显示模型space,我们通常将这个模型的所有顶点乘以MVP - Model, View 和 投影 矩阵。
UnityObjectToClipPos()
函数只是将一个点从对象 space 变换到齐次坐标中的相机剪辑 space。这相当于 mul(UNITY_MATRIX_MVP, float4(pos, 1.0))
,应该代替它使用。
因此,我认为 UnityObjectToClipPos()
函数不是导致您出现问题的原因。
您应该更详细地描述您的问题,我们会尽力帮助您。
问题最终出在我用于文本的着色器上。
文本使用名为 SuperTextMesh 的 Unity 资源,它为文本提供了多个着色器。当我需要使用“Dropshadow and outline”着色器时,我使用的是“Dropshadow and outline unlit”着色器。 “未点亮”的那个引起了问题。
我通过名为 Shadero Sprite 的基于节点的着色器工具创建了一个着色器,我正在尝试调试它的问题。由于代码是由基于节点的工具生成的,我不能完全确定着色器中每一行的目的是什么,这使得这个问题很难调试。
问题是,虽然着色器本身工作正常,但在我的 Unity 场景中有一个对象会导致我场景中的某些 other 对象根本无法渲染;他们变得不可见。
这似乎与下面对 UnityObjectToClipPos()
的调用有关:
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
...因为,如果我替换...
o.vertex = UnityObjectToClipPos(v.vertex);
...与...
o.vertex = v.vertex;
然后另一个 shaders/objects 渲染正常。然而,这当然意味着这个着色器看起来不正确。
我能够推断出的唯一其他线索是其他对象(不可见的对象)是 Unity UI 元素,它们都具有自定义着色器。一个着色器正在使用对 UnityObjectToClipPos() 的调用。另一个似乎没有(尽管它有很多 #includes
,所以也许确实存在对它的调用,埋在其中一个 #includes
中)。
为什么这个函数调用导致其他对象不可见,我可以用什么替换它来修复它?
编辑:这是更大上下文的场景配置:
为了在3D中显示模型space,我们通常将这个模型的所有顶点乘以MVP - Model, View 和 投影 矩阵。
UnityObjectToClipPos()
函数只是将一个点从对象 space 变换到齐次坐标中的相机剪辑 space。这相当于 mul(UNITY_MATRIX_MVP, float4(pos, 1.0))
,应该代替它使用。
因此,我认为 UnityObjectToClipPos()
函数不是导致您出现问题的原因。
您应该更详细地描述您的问题,我们会尽力帮助您。
问题最终出在我用于文本的着色器上。
文本使用名为 SuperTextMesh 的 Unity 资源,它为文本提供了多个着色器。当我需要使用“Dropshadow and outline”着色器时,我使用的是“Dropshadow and outline unlit”着色器。 “未点亮”的那个引起了问题。