Если мы передаем изменение от любого геометрического этапа (вершинный, геометрический или тэсс-шейдер) до фрагментного шейдера, мы всегда теряем некоторую информацию.По сути, мы теряем его двумя способами:
- . С помощью интерполяции: гладкая, неперспективная или центроид - не имеет значения.Если мы пропустили 3 поплавка (по одному на вершину) на этапе геометрии, мы получим только один смешанный поплавок на этапе фрагмента.
- Отбрасыванием.При выполнении
flat
интерполяции аппаратное обеспечение отбрасывает все значения, кроме одного, из провоцирующей вершины.
Почему OpenGL не поддерживает такую функциональность:
Вершинный шейдер:
// nointerp is an interpolation qualifier I would like to have
// along with smooth or flat.
nointerp out float val;
main()
{
val = whatever;
}
Фрагмент шейдера:
nointerp in float val[3];
// val[0] might contain the value from provoking vertex,
// and the rest of val[] elements contain values from vertices in winding order.
main()
{
// some code
}
В GLSL 330 мне нужно сделать целочисленную индексацию трюки или разделить на барицентрические координаты в шейдере фрагмента, если мне нужны значения из всех вершин.
Сложно ли это реализовать на аппаратном уровне или это не так широко используется шейдерными кодерами?Или я не в курсе?