Для эксперимента я хочу передать все ребра треугольника в пиксельный шейдер и вручную вычислить положение пикселя с ребрами треугольника и байрцентри 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);
}
И Я получаю следующий (ожидаемый) результат:
Однако, когда я изменяю свою PixelIn
структуру, добавляя nointerpolation
к p[3]
:
struct PixelIn
{
...
nointerpolation float3 p[3] : TRIPOS;
};
Я получаю:
Я не ожидал другого результата, потому что я не изменяю значения p[]
для одного треугольника в геометрическом шейдере. Я попытался отладить его, изменив вывод на float4(abs(i.p[0]), 1.0);
с интерполяцией и без нее. Без nointerpolation
значения p[]
не изменяются в треугольнике (что имеет смысл, потому что все должны иметь одинаковое значение). С nointerpolation
значения p[]
меняются незначительно. Почему это так? Я думал, что nointerpolate
не должен был ничего интерполировать.
Редактировать: Это каркас моей геометрии: