Модераторы: Rickert
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему глючит освещение, Managed DirectX 
:(
    Опции темы
$tatic
Дата 9.8.2006, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 28.1.2005

Репутация: 7
Всего: 22



Вот есть программа на C# для Managed DirectX
Код

using System;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
using DirectInput = Microsoft.DirectX.DirectInput;

namespace Test3D
{
    public class MainForm : Form
    {
        Device device;
        Mesh mesh;
        Sprite sprite;
        Font font;
        Material material;
        Viewport viewport1, viewport2;
        Matrix matrix1, matrix2;
        int fps = 0;
        string sfps = "";
        Timer timer;
        DirectInput.Device mouse;

        int mx = 0, my = 0;

        public static void Main()
        {
            MainForm form = new MainForm();
            form.Show();
            while (form.Created)
            {
                form.Render();
                Application.DoEvents();
            }
        }

        public MainForm()
        {
            Text = "Test3D";
            Width = 640;
            Height = 480;

            timer = new Timer();
            timer.Interval = 1000;
            timer.Enabled = true;
            timer.Tick += new EventHandler(timer_Tick);

            PresentParameters parms = new PresentParameters();
            parms.Windowed = true;
            parms.SwapEffect = SwapEffect.Discard;
            parms.EnableAutoDepthStencil = true;
            parms.AutoDepthStencilFormat = DepthFormat.D16;
            parms.PresentationInterval = PresentInterval.Immediate;

            device = new Device(0, DeviceType.Hardware, this, CreateFlags.HardwareVertexProcessing, parms);

            sprite = new Sprite(device);
            font = new Font(device, new System.Drawing.Font("Arial Black", 20.0f));

            mesh = Mesh.Teapot(device);

            material = new Material();
            material.Diffuse = System.Drawing.Color.White;
            device.Material = material;

            viewport1 = new Viewport();
            viewport1.Width = 150;
            viewport1.Height = 150;

            viewport2 = device.Viewport;
            device.Viewport = viewport1;

            matrix1 = new Matrix();
            matrix1.Scale(0.7f, 0.7f, 0.7f);
            matrix1.Translate(0f, 0f, 5f);

            DirectInput.DeviceList inputDevices = (DirectInput.DeviceList)DirectInput.Manager.GetDevices(DirectInput.DeviceClass.Pointer, Microsoft.DirectX.DirectInput.EnumDevicesFlags.AllDevices);
            inputDevices.MoveNext();
            mouse = new Microsoft.DirectX.DirectInput.Device(((DirectInput.DeviceInstance)inputDevices.Current).InstanceGuid);
            mouse.Acquire();
        }

        void timer_Tick(object sender, EventArgs e)
        {
            sfps = fps.ToString();
            fps = 0;
        }

        public void Render()
        {
            device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, System.Drawing.Color.DarkBlue, 100.0f, 0);
            device.RenderState.ZBufferEnable = true;
            device.RenderState.ZBufferWriteEnable = true;
            device.RenderState.Clipping = false;
            device.BeginScene();

            device.RenderState.Lighting = true;
            device.Lights[0].Type = LightType.Directional;
            device.Lights[0].Direction = new Vector3(7, -2, 1);
            device.Lights[0].Diffuse = System.Drawing.Color.Yellow;
            device.Lights[0].Enabled = true;
            device.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI / 4, 1.0f, 1.0f, 100.0f);

            device.Viewport = viewport1;
            device.Transform.View = matrix1;

            mesh.DrawSubset(0);

            device.Viewport = viewport2;

            matrix2 = new Matrix();
            matrix2.Scale(0.7f, 0.7f, 0.7f);
            matrix2.RotateY(mx / 300.0f);
            matrix2.M43 = 5f;
            device.Transform.View = matrix2;

            mesh.DrawSubset(0);

            sprite.Begin(SpriteFlags.AlphaBlend);
            font.DrawText(sprite, string.Format("fps={0}, angle={1}", sfps, (mx / 300.0f).ToString("0.00")), 0, 0, System.Drawing.Color.White);
            DirectInput.MouseState mstate = mouse.CurrentMouseState;
            mx += mstate.X;
            my += mstate.Y;
            sprite.End();

            device.EndScene();
            device.Present();

            fps++;
        }
    }
}

Код тестовый, поэтому не оптимизирован.
При изменении размеров окна пропадает освещение. Почему?
PM MAIL   Вверх
unicuum
Дата 10.8.2006, 05:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 16.3.2005
Где: Рашка

Репутация: нет
Всего: 8



Думаешь тебе кто-нибудь ответит? Да, пора мне самому взяться за дело.


--------------------
user posted image
обычный день на винграде
PM   Вверх
NikotiN
Дата 18.8.2006, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 30.7.2006

Репутация: нет
Всего: нет



наврено reset нужно делать, или отменять resize девайса
PM MAIL   Вверх
Able
Дата 19.8.2006, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 13.6.2006
Где: Тюмень

Репутация: 1
Всего: 2



А где метод перерисовки окна ?  smile 

Наверное что типа такого должно быть  smile 

Код

protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
        {
            this.Render(); 
        }


Код

public bool InitializeGraphics()
        {
            try
            {
                // параметры представления данных на экране

                prsntPrmtrs.Windowed = true; // оконный режим
                prsntPrmtrs.SwapEffect = SwapEffect.Discard; // смена буфера
                prsntPrmtrs.AutoDepthStencilFormat = DepthFormat.D16; 
                prsntPrmtrs.EnableAutoDepthStencil = true;
                // параметры адаптера
                int adapterOrd = Manager.Adapters.Default.Adapter;
                CreateFlags flags = CreateFlags.SoftwareVertexProcessing;
                // выполняем проверку на поддержку железом 
                Caps caps = Manager.GetDeviceCaps(adapterOrd, DeviceType.Hardware);
                if (caps.DeviceCaps.SupportsHardwareTransformAndLight)
                {
                    flags = CreateFlags.HardwareVertexProcessing;
                }
                if (caps.DeviceCaps.SupportsPureDevice)
                {
                    flags |= CreateFlags.PureDevice;
                }
                // создаем устройство
                device = new Device(adapterOrd, DeviceType.Hardware, this, flags, prsntPrmtrs);
                // создаем событие сброса устройства
                device.DeviceReset += new EventHandler(this.OnResetDevice);
                this.OnResetDevice(device, null);
                pause = false;
                return true;

            }
            catch (DirectXException)
            {
                return false;
            }
        }


Код

private void OnResetDevice(object sender, EventArgs e)
        {
            Device dev = (Device)sender;
            device.RenderState.CullMode = Cull.None; 
            device.RenderState.ZBufferEnable = true;
            // проверяем поодерживает ли свет
            if ((device.DeviceCaps.VertexProcessingCaps.SupportsDirectionalLights) && ((uint)device.DeviceCaps.MaxActiveLights > 1))
            {
                device.RenderState.Lighting = true;    

            }
            else
            {
                device.RenderState.Ambient = Color.White; // свет не поддерживается тогда просто общее освещение белое
            }        
        }



PM MAIL WWW ICQ   Вверх
$tatic
Дата 19.8.2006, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 28.1.2005

Репутация: 7
Всего: 22



Цитата(Able @  19.8.2006,  20:28 Найти цитируемый пост)
А где метод перерисовки окна ?

Смотри метод Main()

А происходит потеря устройства при ресайзе???
PM MAIL   Вверх
Able
Дата 20.8.2006, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 13.6.2006
Где: Тюмень

Репутация: 1
Всего: 2



Свет надо по новой ставить
PM MAIL WWW ICQ   Вверх
$tatic
Дата 20.8.2006, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 28.1.2005

Репутация: 7
Всего: 22



Тут что-то с Viewport не так, ИМХО. Наверное свет надо после его определения ставить.
PM MAIL   Вверх
NikotiN
Дата 20.8.2006, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 30.7.2006

Репутация: нет
Всего: нет



короче, в DeviceReset нужно не только presentParametrs загонять по новому, но и все настройки выставлять. на то он и reset, чтобы всё скидывать)
и вообще за правило бери:
this.device.DeviceResizing += new System.ComponentModel.CancelEventHandler(this.OnDeviceResizing);
this.device.DeviceReset += new EventHandler(this.OnDeviceReset);
this.device.DeviceLost += new EventHandler(this.OnDeviceLost);
this.device.Disposing += new EventHandler(this.OnDeviceDestroy);
без них далеко не уедешь, тот же reset может ещё и не так наколоть))
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




[ Время генерации скрипта: 0.0468 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.