Как использовать мультисэмплинг с "возвратом" во фрагментный шейдер?
Я рисую прозрачные фигуры с помощью пилинга по глубине, результат получается некрасивым при рендеринге в мультисэмпл (появляется сетка)
vec4 fragColor = texelFetch(frontTexture, ivec2(gl_FragCoord.xy), 0);
if (gl_FragCoord.z < nearestDepth) {
// Skip this depth in the peeling algorithm
return;
}
fragColor += someColor;
Без "если вернуть" все в порядке (но мне нужно это "если"). Сетка точно такая же, как когда я использую mipmapping с неравномерным управлением потоком.
1 ответ
Решение
Функция gl_FragCoord, доступная только на языке фрагментов, является входной переменной, которая содержит значения относительной координаты окна (x, y, z, 1/w) для фрагмента. Если используется многократная выборка, это значение может быть для любого места в пикселе [!!!]
PS Глубинный пилинг использует строгое сравнение глубины, это невозможно, если мы получим глубину "для любого места в пикселе". Вместо
if (gl_FragCoord.z < nearestDepth)
использование
if (gl_FragCoord.z < nearestDepth - 0.0001)
(это первое грубое решение)