Войти
Life EngineКатегории

C#

Смотрите также категорию C# для всех разделов

DirectX10_1 Sample 1
Всем привет.

Понадобился DX10 но годных туториалов по нему в инете не нашёл (для SlimDX).

Методом научного тыка таки разобрался сам с DX10, собсно выкладываю сюда исходники в помощь начинающим прогерам. В дальнейшем буду выкладывать новый усложнённый код по мере моего самообучения : )

В данном примере:
1. Создаётся фабрика и девайс
2. создаётся SwapChain и бэкбуфер
3. Очищается бэкбуфер и выводится на экран
+ ещё мелочи

Для работы примера нужен установленный SlimDX 2010 (June)

using System;
using System.Windows.Forms;
using SlimDX;
using SlimDX.Direct3D10;
using SlimDX.DXGI;

namespace DX10_Test
{
    public partial class Form1 : Form
    {
        private SlimDX.Direct3D10_1.Device1 g_device;
        private Factory g_factory;
        private SwapChain g_primarySC;
        private SwapChainDescription g_scDesc;
        private RenderTargetView g_backBuffer;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //creating DXGI factory
            g_factory = new Factory();

            //i dunno what's that, LOL
            g_factory.SetWindowAssociation(this.Handle, WindowAssociationFlags.None);

            //creating device
            g_device = new SlimDX.Direct3D10_1.Device1(g_factory.GetAdapter(0), DriverType.Hardware, DeviceCreationFlags.None, SlimDX.Direct3D10_1.FeatureLevel.Level_9_3);

            //filling mode description
            ModeDescription mode = new ModeDescription();
            mode.Format = Format.R8G8B8A8_UNorm;
            mode.Height = this.Height;
            mode.Width = this.Width;
            mode.ScanlineOrdering = DisplayModeScanlineOrdering.Unspecified;
            mode.Scaling = DisplayModeScaling.Unspecified;
            mode.RefreshRate = new Rational(60, 1);

            //filling sample descriptrion
            SampleDescription sample = new SampleDescription();
            sample.Count = 1;
            sample.Quality = 0;

            //filling swap chain description
            g_scDesc = new SwapChainDescription();
            g_scDesc.BufferCount = 1;
            g_scDesc.Flags = SwapChainFlags.None;
            g_scDesc.IsWindowed = true;
            g_scDesc.ModeDescription = mode;
            g_scDesc.OutputHandle = this.Handle;
            g_scDesc.SampleDescription = sample;
            g_scDesc.SwapEffect = SwapEffect.Discard;
            g_scDesc.Usage = Usage.RenderTargetOutput;

            //creating swap chain
            g_primarySC = new SwapChain(g_factory, g_device, g_scDesc);

            //creating render target holder (view)
            g_backBuffer = new RenderTargetView(g_device, SlimDX.Direct3D10.Resource.FromSwapChain<Texture2D>(g_primarySC, 0));

            //we should manually set up viewports
            g_device.Rasterizer.SetViewports(new Viewport(0, 0, this.Width, this.Height, 0, 1));

            this.Show();

            //main loop ^____^
            while (this.Created)
            {
                //clear render target
                g_device.ClearRenderTargetView(g_backBuffer, new Color4(0xffff00));

                //presenting out back buffer to the monitor
                g_primarySC.Present(0, PresentFlags.None);

                Application.DoEvents();
            }

            //disposing resources
            {
                g_backBuffer.Resource.Dispose(); // This is important thing!
                g_device.ClearState();
                g_backBuffer.Dispose();
                g_device.Dispose();
                g_primarySC.Dispose();
                g_factory.Dispose();
            }
        }
    }
}

Ну и собсно EXE (скомпилированный пример):  Скачать (10kb)

Ссылка | Комментарии [4]
11 окт. 2010

Update 2
Во, сделал наконецто асинхронную подгрузку ресурсов - подгружаются в отдельном потоке в то время, как ига уже началась ^^  Значительно ускорился перезод от скрина загрузки к игре. Ура.

Ссылка
27 июня 2010

Update 1
Както заффтыкал обновлять и тут блог...хмм. )

Собсно добавил PSSM тени. Работает всё чётко. Оптимизировал максимально. Рендерятся тени в одну одноканальную текстуру формата R32F чтобы техника была более кеш-френдли. Фильтрация для PSSM юзается ТОЛЬКО PCF так как VSM был поспешно уддалён после его подключения к PSSM.  На моей видяхе летает PSSM со следующими параметрами: количество сплитов - 3, размер общей текстуры глубины 4096x4096  - это 2 сплита по 2048x2048 и один 4096x2048 для ближнего сплита. ФПС жжот НО(!) если делать VSM и блурить текстуру минимум в 1 проход,то, собсно, необходима вторая текстура в котору и будет записываться результат блура. Для VSM нужно 2 канала.  Собсно 2-х канальная текстура формата G32R32F размера 4096x4096 будет весить 128 МБ и нужна ещё одна копия на 128 МБ для блура. В итоге для качественных теней надо 256(!!!!!!!!) МБ видео. Ненене, нафиг!  Заюзал PCF 4x4 и доволен. Тень мягкая, скорость высокая, памяти хаваецо мало ^^

Какбы скрин.  Чел и небо сильно зачвечены - не подкрутил HDR но я  ТЕНИ показываю, так что не плеваться : ))

Изображение


Сейчас займусь фоновой подгрузкой ресурсов ^^

Ссылка
26 июня 2010

Архив