Проблеми с XNA 4.0 в прозорец с назъбени ръбове Знаете ли метод за висококачествен изход?

Използвам XNA 4.0 форма контрола на този примерен проект в приложение, което пиша: http://creators.xna.com/en-US/sample/winforms_series1

Работи страхотно и направих доста с визуализации и анимация. Основният проблем, по който си блъскам главата, е 3D моделът и примитивните 3D форми (цилиндри с мозайка 30), които визуализирам, имат много назъбени ръбове, сякаш са с ниска разделителна способност.

Опитах се да разбера как да активирам множествено вземане на проби, но всички примери, които мога да намеря онлайн, изглежда не се отнасят за този нов начин за използване на XNA в потребителския контрол на формуляр.

Вътре в конструктора GraphicsDeviceService() има създаден обект PresentationParameters, но единственото налично свойство е parameters.MultiSampleCount от тип integer. Опитах да го настроя без ефект.

Също така се опитах да направя задния буфер два пъти по-голям от размера на контролата (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.

В конструктора на този клас той настройва обект, наречен "parameters", обект 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

Опитайте тази:

//call event click or press button
$('#idBlaBla').click();

//listen event
$('#idBlaBla').click(function( event ){
    //your code here...
});

//listen multi events
$('#idBlaBla').bind('click focus blur',function( event ){
    //your code here...
});

//listen new element(append fro example)
$('.div').append( '<a href="/bg" id="idBlaBla">Anchor Button</a>' );
$('#idBlaBla').live('click',function( event ){
    //your code here...
});
- person Scott; 18.09.2011

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

Потърсете тази инициализация, за да можете да дефинирате броя на множествените извадки, когато създавате вашето графично устройство, а не след факта.

GraphicsDeviceService(IntPtr windowHandle, int ширина, int височина)

{ параметри = нови PresentationParameters();

        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