我GC
用于在里面编写着色器Unity3D
。
我正在使用顶点颜色属性将一些参数传递给着色器。它们不会用于定义颜色,并且应该从顶点着色器转发到像素着色器而不修改它们。
这是我从 Unity3D 输入到顶点着色器的结构:
struct appdata_full {
float4 vertex : POSITION;
float4 tangent : TANGENT;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
float4 texcoord1 : TEXCOORD1;
fixed4 color : COLOR;
#if defined(SHADER_API_XBOX360)
half4 texcoord2 : TEXCOORD2;
half4 texcoord3 : TEXCOORD3;
half4 texcoord4 : TEXCOORD4;
half4 texcoord5 : TEXCOORD5;
#endif
};
这是顶点着色器作为片段输入返回的结构:
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
fixed4 col: COLOR;
};
如果我只是简单地将参数转发给片段着色器,当然它会被插值:
v2f vert (appdata_full v)
{
v2f output;
//....
output.col = v.color;
}
我想将v.color
未插值的参数传递给片段着色器。这可能吗?如果是的话怎么办?
编辑
就像蒂姆指出的那样,这是预期的行为,因为如果颜色从顶点着色器传递到片段,着色器除了插值颜色之外什么也做不了。我将尝试更好地解释我想要实现的目标。我使用每个顶点颜色来存储颜色以外的其他类型的信息。在不告诉我正在做什么的所有细节的情况下,假设您可以将每个颜色顶点视为一个 id(同一三角形的每个顶点将具有相同的颜色。实际上是同一网格的每个顶点)。
所以我使用颜色技巧来掩盖一些参数,因为我没有其他方法可以做到这一点。现在,这条信息必须以某种方式在片段着色器中可用。如果作为顶点着色器的输出参数传递,则编码为颜色的此信息将被插值到无法再使用的片段中。
我正在寻找一种在片段着色器之前传播此信息不变的方法(也许可以使用全局变量或类似的东西?如果是的话如何?)。