Graphics hlsl无极化行为

Graphics hlsl无极化行为,graphics,directx,hlsl,Graphics,Directx,Hlsl,对于一个实验,我想将三角形的所有边传递给像素着色器,并使用三角形边和BayrCenter坐标手动计算像素位置。 为此,我编写了一个几何体着色器,将三角形的所有边传递给像素着色器: struct GeoIn { float4 projPos : SV_POSITION; float3 position : POSITION; }; struct GeoOut { float4 projPos : SV_POSITION; float3 position : POS

对于一个实验,我想将三角形的所有边传递给像素着色器,并使用三角形边和BayrCenter坐标手动计算像素位置。 为此,我编写了一个几何体着色器,将三角形的所有边传递给像素着色器:

struct GeoIn
{
    float4 projPos : SV_POSITION;
    float3 position : POSITION;
};

struct GeoOut
{
    float4 projPos : SV_POSITION;
    float3 position : POSITION;
    float3 p[3] : TRIPOS;
};

[maxvertexcount(3)]
void main(triangle GeoIn i[3], inout TriangleStream<GeoOut> OutputStream)
{
    GeoOut o;

    // add triangle data
    for(uint idx = 0; idx < 3; ++idx)
    {
        o.p[idx] = i[idx].position;
    }

    // generate verices
    for(idx = 0; idx < 3; ++idx)
    {
        o.projPos = i[idx].projPos;
        o.position = i[idx].position;

        OutputStream.Append(o);
    }

    OutputStream.RestartStrip();
}
我得到了以下(预期)结果:

但是,当我通过向
p[3]
添加
nointerpolation
来修改我的
PixelIn
结构时:

struct PixelIn
{
    ...
    nointerpolation float3 p[3] : TRIPOS;
};
我得到:

我没有期望得到不同的结果,因为我没有更改几何体着色器中单个三角形的
p[]
值。我尝试通过将输出更改为
float4(abs(I.p[0]),1.0)来调试它带和不带插值。没有
nointerpolation
时,
p[]
的值不会在三角形内变化(这很有意义,因为所有的值都应该相同)。使用
nointerpolation
时,
p[]
的值确实略有变化。为什么会这样?我认为,
nointerpolate
不应该插入任何内容


编辑: 这是几何体的线框:

您可以共享输入的线框视图吗?我添加了线框您可以共享输入的线框视图吗?我添加了线框
struct PixelIn
{
    ...
    nointerpolation float3 p[3] : TRIPOS;
};