Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DirectX. Отображение нескольких объектов 
V
    Опции темы
Annihilator
Дата 9.4.2009, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


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

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



Недавно начал заниматься DirectX. Поначалу у меня был один объект - квадрат, который строился из vertexbuffer. Согласно архитектуре моего приложения, за рендеринг квадрата отвечал класс CApplication:

Код

void CApplication::RenderingDirect3D()
    {
        if (CApplication::GetDirect3DInst().pDirect3DDevice == NULL)
            return;
        CApplication::GetDirect3DInst().pDirect3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255,255,50), 1.0f, 0 );
        /*Начало рендеринга объектов сцены*/
        CApplication::GetDirect3DInst().pDirect3DDevice->BeginScene();
        Matrix();
        CApplication::GetDirect3DInst().pDirect3DDevice->SetStreamSource(0, CApplication::GetDirect3DInst().pVertexBuffer, 0, sizeof(CApplication::CUSTOMVERTEX));
        CApplication::GetDirect3DInst().pDirect3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
        CApplication::GetDirect3DInst().pDirect3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
        /*Конец рендеринга объектов сцены*/
        CApplication::GetDirect3DInst().pDirect3DDevice->EndScene();
        /*Вывод на экран содержимого заднего буфера*/
        CApplication::GetDirect3DInst().pDirect3DDevice->Present(NULL,NULL,NULL,NULL);
    }


а за инициализация буфера отвечало окно
Код

HRESULT CBaseWindow::InitialVertexBuffer()

теперь же у меня добавился объект с индексированными вершинами, что понесло за собой следующие изменения в RenderingDirect3D
Код

............................................        
CApplication::GetDirect3DInst().pDirect3DDevice->SetIndices(CApplication::GetDirect3DInst().pIndexBuffer);
CApplication::GetDirect3DInst().pDirect3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 36, 0, 12);
............................................

Теперь вопросы. 
1. Если мы не знаем, сколько и каких объектов надо заранее отобразить, то соответственно не знаем, какие функции вызывать (DrawPrimitive/DrawIndexedPrimitive) то значит объект должен сам знать как себя отобразить, у него должен быть свой метод
2. Если объектов несколько, то у каждого должен быть свой локальный буфер вершин/индексов, т.е. у каждого объекта должно быть свое поле pDirect3DDevice

Резюме: управление происходит уже не на уровне приложения, а на уровне объекта
--------------------------
Пока все. Поправьте, пожалуйста, товарищи!


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
xpromt
Дата 9.4.2009, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вобще я тоже новичек в DirectX, тоже только начал изучать, но выскажу свои ПРЕДПОЛОЖЕНИЯ.
1. Как я понял, неиндексированные объекты больше применимы для двухмерной графики. Потому что при работе с текстурами и освещением желательно иметь индексированный объект. Поэтому заведомо в сцене должны участвовать только однотипные объекты. Вот насчет количества объектов пока не могу ничего предположить...
2. Насчет pDirect3DDevice . я думаю, что это создание устройства Direct3D отвечающее за всю сцену. А каждый объект имеет свой буффер вершин. И в функции рендеринга сцены отдельно прорисовывается каждый объект и потом уже производится вывод готовой картинки на экран.

Это мое ПРЕДПОЛОЖЕНИЕ. Сам пока что с этим не сталкивался, но чувствую, что вот вот оно мне понадобится  smile 
PM MAIL   Вверх
C/L
Дата 10.4.2009, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



DrawPrimitive как и DrawIndexedPrimitive передается с какого по какой треугольник рисовать объект. Так что в промежутки между объектами можно менять текстуру и все остальное, оставляя вертексный буфер в единственном числе. Что касается оптимального количества вершинных буферов - с этим параметром я еще не экспериментировал. Но думаю чем меньше буферов тем лучше.
PM MAIL WWW ICQ   Вверх
Annihilator
Дата 10.4.2009, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


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

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



Ок. Спасибо. А что скажут профессионалы. Может быть кто-нибудь предолжит примерную архитектуру?


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
Annihilator
Дата 12.4.2009, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


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

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



Значит вопрос состоит в следущем.
Здесь крутятся сообщения
Код

int CApplication::Run()
    {
        MSG msg = { 0 };
        while ( msg.message != WM_QUIT )
        {
            if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
            {
                ::TranslateMessage( &msg );
                ::DispatchMessage( &msg );
            }
            else
            RenderingDirect3D();
        }
        return static_cast<int>(msg.wParam);
    }

А здесь должен проходить рендеринг объектов окна
Код

    void CApplication::RenderingDirect3D()
    {
        /*Чистим задний буфер*/
        CShape *pShape;
        if (CApplication::GetDirect3DInst().pDirect3DDevice == NULL)
            return;
        CApplication::GetDirect3DInst().pDirect3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255,255,50), 1.0f, 0 );
        ///*Начало рендеринга объектов сцены*/
        CApplication::GetDirect3DInst().pDirect3DDevice->BeginScene();
        pShape1->Draw();
        pShape2->Draw();
        pShape3->Draw();
        pShape4->Draw();
                                                         .......
        CApplication::GetDirect3DInst().pDirect3DDevice->EndScene();
        CApplication::GetDirect3DInst().pDirect3DDevice->Present(NULL,NULL,NULL,NULL);
        delete pShape;
        
    }

Проблема в том, что я не знаю, как и где хранить объекты, которое должно отбразить окно
Есть идея хранить их в векторе, засовывать туда при инициализации окна, все объекты производные от CShape

Код

BOOL OnInit()
    {
        MyWin *w = new MyWin();
        w->Create();
        w->Init3DFeatures();
        w->shvec.push_back(указатель_на_объект);
        return TRUE;
    }
но как теперь достать их извектора в void CApplication::RenderingDirect3D()

Это сообщение отредактировал(а) Annihilator - 12.4.2009, 16:34


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
Annihilator
Дата 12.4.2009, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


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

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



Вопрос решил. Если кому инетерсно, пишите в личку.


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




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


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

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