В XNA 4.0 возникают проблемы с окнами с неровными краями Знаете способ получения высококачественного вывода?

Я использую элемент управления формой XNA 4.0 из этого примера проекта в написанном мной приложении: http://creators.xna.com/en-US/sample/winforms_series1

Он отлично работает, и я немало поработал с графикой и анимацией. Основная проблема, над которой я ломаю голову, - это трехмерная модель и примитивные трехмерные формы (цилиндры с тесселяцией 30), которые я визуализирую, с очень неровными краями, как будто они имеют низкое разрешение.

Я попытался выяснить, как включить мультисэмплинг, но все примеры, которые я могу найти в Интернете, похоже, неприменимы к этому новому способу использования XNA в настраиваемом элементе управления формой.

Внутри конструктора GraphicsDeviceService () создается объект PresentationParameters, но единственное доступное свойство - parameters.MultiSampleCount целочисленного типа. Я попытался установить это без эффекта.

Я также попытался сделать задний буфер в два раза больше, чем размер элемента управления (GraphicsDeviceService.cs):

    GraphicsDeviceService(IntPtr windowHandle, int width, int height)
    {
        parameters.BackBufferWidth = width * 2;
        parameters.BackBufferHeight = height * 2;
        ...
    }

Затем я изменил эту функцию (GraphicsDeviceControl.cs):


    void EndDraw()
    {
        Rectangle sourceRectangle = new Rectangle(0, 0, ClientSize.Width * 2, ClientSize.Height * 2);
        Rectangle destinationRectangle = new Rectangle(0, 0, ClientSize.Width, ClientSize.Height);
        GraphicsDevice.Present(sourceRectangle, destinationRectangle, this.Handle);
    }

Но это не сработало. Мои объекты, отображаемые на экране, были смещены до 1/4 окна и обрезаны. Хотя он выглядел немного менее зазубренным ...

Итак, на данный момент я не уверен, что я могу сделать, чтобы получить высококачественную графику с помощью этого метода (элемент управления XNA в окне). В целом я новичок в XNA, поэтому любые предложения будут очень полезны.

Спасибо


person Scott    schedule 15.09.2011    source источник


Ответы (3)


Я загрузил этот образец кода, чтобы увидеть, где настраиваются параметры PresentationParameters. Это то, что вам нужно изменить.

Он находится в классе GraphicsDeviceService.

В конструкторе этого класса он устанавливает объект под названием «параметры», объект PresentationParamters. Добавьте эту строку после нового и перед передачей параметров в graphicsDevice:

parameters.MultiSampleCount = 10;

Это значение я выбрал произвольно. Обеспечивает здоровое сглаживание. Прочтите больше о сглаживании, если вам нужно понять, что именно это число. Это количество проходов через фильтр сглаживания. Так что вы можете уменьшить его для лучшей производительности или увеличить для большего сглаживания.

person Community    schedule 15.09.2011
comment
Прошу прощения за то, что не полностью прочитал ваш ответ, кажется, вы уже пробовали MultiSampleCount. Также кажется, что вы не пробовали много разных значений. Попробуйте с более высокими значениями; Что касается меня, я определенно могу видеть неровные края, когда он 1-2, а когда я увеличиваю его до 10, края очень гладкие. Я тестировал это с моделями по умолчанию, которые поставляются с образцом кода, такими как Cylinder, SpaceShip и т. Д. - person ; 15.09.2011
comment
И имел в виду вопрос! Боже, я устал, прости. - person ; 15.09.2011
comment
Я ценю твою помощь, Скотт. Похоже, в моем случае это не действует. Может это тот ноут, который я использую, не работает? (имеет встроенную графику Intel). Если это полностью зависит от оборудования, мне придется искать другой метод. - person Scott; 15.09.2011
comment
Какая это модель оборудования? Мультисэмплинг поддерживается как в графических профилях Reach, так и в HiDef, но последнее слово в выборе функций остается за вашим оборудованием. - person Chris C; 15.09.2011
comment
По этой ссылке: msdn.microsoft.com/ en-us / library / кажется, что мультисэмплинг игнорируется, если оборудование не поддерживает его. - person ; 15.09.2011
comment
Хорошо, по крайней мере, теперь я знаю, что мультисэмплинг должен работать с этим свойством, если аппаратное обеспечение его поддерживает ... Я думаю, что я собираюсь попробовать несколько других идей. - person Scott; 16.09.2011
comment
Есть способы сделать это с помощью шейдеров, идеи можно найти в этой ветке: gamedev.net/topic/469110-shader-based-anti-aliasing - person ; 16.09.2011

Есть несколько свойств GraphicsDeviceManager, которые вы можете установить, убедитесь, что все они выполнены.

graphics = new GraphicsDeviceManager(<A reference to your game class>)
{
  PreferMultiSampling = true,
};

graphics.PreparingDeviceSettings += (s, e) =>
{
  e.GraphicsDeviceInformation.PresentationParameters.MultiSampleCount = 16;
};
person Andy    schedule 16.09.2011
comment
Класс игры недоступен с методом форм Windows. - person Scott; 18.09.2011

У меня была ТОЧНАЯ проблема. Если вы используете объект XNA graphicsdevicecontrol в форме Windows, простая установка счетчика множественных выборок не сработает. Вам необходимо изменить GraphicsDeviceService.cs в части инициализации.

Ищите эту инициализацию, чтобы вы могли определить счетчик множественных выборок при создании графического устройства, а не постфактум.

GraphicsDeviceService (IntPtr windowHandle, ширина целого числа, высота целого числа)

{параметры = новые параметры презентации ();

        parameters.BackBufferWidth = Math.Max(width, 1);
        parameters.BackBufferHeight = Math.Max(height, 1);
        parameters.BackBufferFormat = SurfaceFormat.Color;
        parameters.DepthStencilFormat = DepthFormat.Depth24;
        parameters.DeviceWindowHandle = windowHandle;
        parameters.PresentationInterval = PresentInterval.Immediate;
        parameters.IsFullScreen = false;
        parameters.MultiSampleCount = 10; //  <--- RIGHT HERE

        graphicsDevice = new GraphicsDevice(GraphicsAdapter.DefaultAdapter,
                                            GraphicsProfile.Reach,
                                            parameters);
    }

В любом другом месте, и графическое устройство проигнорирует ваши изменения

person AzureX    schedule 27.09.2012