HLSL неинтерполяционное поведение - PullRequest
1 голос
/ 14 января 2020

Для эксперимента я хочу передать все ребра треугольника в пиксельный шейдер и вручную вычислить положение пикселя с ребрами треугольника и байрцентри c coodinates. Для этого я написал геометрический шейдер, который передает все края моего треугольника в пиксельный шейдер:

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();
}

Пиксельный шейдер выводит вручную восстановленную позицию:

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

float4 main(PixelIn i) : SV_TARGET
{
    float3 pos = i.bayr.x * i.p[0] + i.bayr.y * i.p[1] + i.bayr.z * i.p[2];
    return float4(abs(pos), 1.0);
}

И Я получаю следующий (ожидаемый) результат: enter image description here

Однако, когда я изменяю свою PixelIn структуру, добавляя nointerpolation к p[3]:

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

Я получаю: enter image description here

Я не ожидал другого результата, потому что я не изменяю значения p[] для одного треугольника в геометрическом шейдере. Я попытался отладить его, изменив вывод на float4(abs(i.p[0]), 1.0); с интерполяцией и без нее. Без nointerpolation значения p[] не изменяются в треугольнике (что имеет смысл, потому что все должны иметь одинаковое значение). С nointerpolation значения p[] меняются незначительно. Почему это так? Я думал, что nointerpolate не должен был ничего интерполировать.


Редактировать: Это каркас моей геометрии: wireframe

...