【发布时间】:2019-02-18 15:51:01
【问题描述】:
这是一个非常简单的着色器,
float4 vert (float4 vertex :POSITION, out PositionHolder o) :SV_POSITION
{
UNITY_INITIALIZE_OUTPUT(PositionHolder,o);
o.localPos = vertex;
return UnityObjectToClipPos(vertex);
}
fixed4 frag (PositionHolder IN) :SV_Target
{
if (IN.localPos.y > -.2)
return _UpperColor;
else
return _LowerColor;
}
(因此,如果在四边形上,它只用一种颜色绘制顶部 70%,用另一种颜色绘制底部条纹。)
请注意,vert 所做的唯一事情就是沿着网格顶点位置上的局部传递。
这是这样做的结构
struct PositionHolder
{
float3 localPos;
};
但是,(无论如何,在 Unity 中)它将需要该 float3 的语义。
查看 Unity 的 doco,他们当然没有,但是有一个链接到
https://docs.microsoft.com/en-us/windows/desktop/direct3dhlsl/dx-graphics-hlsl-semantics
(除此之外 - 据我所知,它是专门针对 D3D 的,但是,我想这就是要使用的语法/语义吗?)
我对情况的解读,
建议你应该使用say,
struct PositionHolder
{
float3 localPos :POSITION1;
};
或者实际上,定位任何数字,您还没有将其用作资源。
怎么样,
struct PositionHolder
{
float3 localPos :POSITION8;
};
祝你好运。
(令人困惑的是,它们似乎只从 blank 到 9 运行,我不知道这是否反映了硬件现实,或者只是某个地方的粗制滥造 - 或者什么。但无论如何,基本上“您尚未在其他地方使用的任何数字 1 到 9。)
请注意,无论如何,
POSITION是一个 float4,我的 float3 真的可以吗? 对于通用 float3,有什么比 POSITION 更好的方法吗? (我注意到如果你只使用一种颜色,它也可以正常工作。这有关系吗?)“1 on the end”系统真的正确吗?那么,POSITION1 好走吗?我没有融化 gpu 之类的?
嗯,我注意到您可以在其中输入任何内容(例如“abcd1”)。但可以肯定的是,它实际上不是硬件寄存器???
【问题讨论】:
-
UV 是一个很好的自定义数据容器,被插值并且有四个
-
位置仅针对每个顶点,但 UV 以插值形式传递给片段着色器,因此您不必使用其他形式的诡计来知道您在哪里
-
关于您的第三个问题 - 关于一些示例,我不知道答案:一个很好的起点,可能需要半小时才能完全遵循:docs.unity3d.com/Manual/SL-SurfaceShaderExamples.html
-
哦,我确实已经完成了所有这些工作 - 不幸的是,它没有解释任何有关语义标签的内容。 (什么都没有!呵呵。)