Сглаживание 2D: выбрать метод и проверить поддержку
Различить геометрические края, текстуры и ограничения MSAA в Compatibility и Vulkan.
Сначала определить источник ступенек
| Что видно | Что проверять |
|---|---|
| Ступеньки на наклонном крае треугольника | Сглаживание геометрии 2D, включая MSAA при поддержке backend |
| Пиксельная или размытая картинка внутри формы | TextureFilter, исходное разрешение и масштабирование |
| Муар и мерцание тонкого узора внутри shader | Частоты узора и фильтрацию в самом shader |
| Неровные отдельные линии/контуры | Параметр antialiased соответствующей команды или типа, если он доступен |
MSAA не является универсальным улучшателем картинки. Он не восстанавливает недостающие детали текстуры и не исправляет любой узор внутри фрагмента. Для pixel art фильтр Nearest может быть намеренным выбором; принудительное размытие не равно правильному сглаживанию.
Проверить поддержку именно 2D MSAA
В проверенной сборке Reckfell 1.0.0 есть важное различие:
| Путь отрисовки | Подтверждённый результат |
|---|---|
| Compatibility/OpenGL | Предупреждение об отсутствии 2D MSAA; край меша не меняется при запросе Msaa4X |
| Forward+/Vulkan | Msaa4X добавляет промежуточное покрытие пикселей по краю того же меша |
Значение свойства Msaa2D может читаться как Msaa4X даже без эффекта в Compatibility. Это сохранённая настройка, а не запрос возможностей GPU. Msaa3D — отдельный параметр: его включение в проверенном примере не сгладило 2D-треугольник.
Эти результаты получены в текущей локальной Windows-сборке на одном устройстве. Они не измеряют FPS и не подтверждают все драйверы, Mobile, Web, D3D или Metal. Не выбирайте backend только ради галочки: сопоставьте требуемые функции с целевыми платформами и измерьте стоимость на них.
Запустить изолированный пример
Нужен C#-проект Reckfell.NET.Sdk 1.0.0, net10.0. Сохраните два файла ниже, выполните dotnet build, прикрепите CanvasAaExample.cs к Entity2D уровня .rscene и запустите. Треугольник слегка повёрнут и смещён на дробные координаты, чтобы наклонный край был виден.
Для сравнения MSAA используйте Forward+ с Vulkan и задайте экспортированное Antialiasing=Msaa4X до запуска. Сравните с Disabled при одинаковых Viewport, координатах и масштабе. В Compatibility оставьте Disabled; запрос Msaa4X в этой сборке выдаёт предупреждение, а не положительный результат.
CanvasMeshes.cs
using System;
using Reckfell;
public static class CanvasMeshes
{
public static ArrayMesh Quad(Vector2 size)
{
if (!size.IsFinite() || size.X <= 0 || size.Y <= 0)
throw new ArgumentOutOfRangeException(nameof(size));
Vector2 half = size * 0.5f;
return Build(
new[] { new Vector2(-half.X, -half.Y), new Vector2(half.X, -half.Y), half, new Vector2(-half.X, half.Y) },
new[] { Vector2.Zero, Vector2.Right, Vector2.One, Vector2.Down },
new[] { 0, 1, 2, 0, 2, 3 });
}
public static ArrayMesh Triangle() => Build(
new[] { new Vector2(-45, -40), new Vector2(50, -17), new Vector2(-20, 45) },
new[] { Vector2.Zero, Vector2.Right, Vector2.Down },
new[] { 0, 1, 2 });
private static ArrayMesh Build(Vector2[] vertices, Vector2[] uv, int[] indices)
{
var arrays = new Reckfell.Collections.Array();
arrays.Resize((int)Mesh.ArrayType.Max);
arrays[(int)Mesh.ArrayType.Vertex] = vertices;
arrays[(int)Mesh.ArrayType.TexUV] = uv;
arrays[(int)Mesh.ArrayType.Index] = indices;
var mesh = new ArrayMesh();
mesh.AddSurfaceFromArrays(Mesh.PrimitiveType.Triangles, arrays);
return mesh;
}
}CanvasAaExample.cs
using Reckfell;
public partial class CanvasAaExample : Entity2D
{
[Export] public Viewport.Msaa Antialiasing { get; set; } = Viewport.Msaa.Disabled;
public override void _Ready()
{
GetViewport().Msaa2D = Antialiasing;
AddChild(new MeshInstance2D
{
Mesh = CanvasMeshes.Triangle(),
Position = GetViewportRect().Size * 0.5f + new Vector2(0.3f, 0.2f),
Rotation = 0.17f,
Material = new CanvasItemMaterial { LightMode = CanvasItemMaterial.LightModeEnum.Unshaded }
});
}
}Настроить правильный Viewport
GetViewport().Msaa2D меняет Viewport, которому принадлежит Entity. SubViewport со своей картинкой требует собственной настройки; параметр главного окна не следует считать автоматически общим для всех поверхностей. В проекте есть и настройка rendering/anti_aliasing/quality/msaa_2d, но runtime-код может её переопределить для конкретного Viewport.
Сравнивайте изображения при одинаковом выходном размере. Увеличенный скриншот, масштаб браузера и последующее растяжение изображения могут скрывать или добавлять ступеньки. Проверка здесь читает исходные пиксели текстуры Viewport, а не судит по миниатюре.
Если MSAA не решает проблему
- Край не меняется в Compatibility: это подтверждённое ограничение backend, а не повод бесконечно увеличивать число samples.
- Размыта текстура: проверьте TextureFilter и масштаб отдельно от MSAA.
- Ступеньки находятся внутри shader-узора: меняйте способ выборки/расчёта узора, а не только параметры края геометрии.
- Отдельный тип имеет Antialiased или draw-команда принимает antialiased: используйте подходящий локальный механизм, проверяя ограничения этой команды. Он не является переключателем MSAA всего canvas.
- Картинка стала дороже: сравните время GPU и память на целевом устройстве; автоматического обещания «4× бесплатно» нет.