Среда, 24 Апреля 2024, 01:37

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум игроделов » Программирование » C/C++ » помощь в разработке движка
помощь в разработке движка
redinardДата: Четверг, 04 Октября 2012, 01:02 | Сообщение # 1
постоянный участник
Сейчас нет на сайте
Всем привет,я начал разработку собственного движка для написания курсовой работы и для дальнейшего его развития,всё ишло гладко до недавна пока я не нарвался на такую проблемму,которую можете увидеть сами,вот код:
render.h
Code
#pragma comment(lib, "winmm.lib")  
#pragma comment(lib, "d3d9.lib")  
#pragma comment(lib, "d3dx9.lib")
  #include <windows.h>  
  #include "d3d9.h"  
  #include <d3dx9.h>

  #include <mmsystem.h>//заголовочный файл для работы с системными функциями

  //***********************************************************  

   
  LPDIRECT3D9 g_pD3D = NULL; //объявление главного объекта  
  LPDIRECT3DDEVICE9 pDirect3DDevice; //объявление девайса  
  LPDIRECT3DVERTEXBUFFER9 pVertBuff = NULL; //объявление вертекс буффера
  LPDIRECT3DINDEXBUFFER9 pBufferIndex = NULL;      // Индексный буфер  

void Matrix();

  struct CUSTOMVERTEX//структура определяющая формат вершин
{
         float x, y, z, rhw;//координаты вершины
         DWORD color;       //цвет вершыны
};

  #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)//формат содержания вершин

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//
//             ИНИЦИАЛИЗАЦИЯ Direct3D
//
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  HRESULT InitD3D(HWND hwnd)  
  {  
  if(NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION))) //создаётся основной указатель на интерфейс IDirect3D9
  return E_FAIL;  

  D3DDISPLAYMODE Disp; //структура для соответствия текущих установок дисплея
  if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &Disp))) //получаем текущий формат дисплея
  return E_FAIL;  

  //параметры показа  
  D3DPRESENT_PARAMETERS d3dpp; //обект параметров представления Direct3DParametr
  ZeroMemory(&d3dpp, sizeof(d3dpp)); //очищает создаваемую структуру от мусора
  d3dpp.Windowed = true; //видеорежим используемый нашим приложением
  d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; //параметр опредиления размеров буфера
  d3dpp.BackBufferFormat = Disp.Format; //формат поверхности заднего буфера
  d3dpp.EnableAutoDepthStencil = true;//значение показывающее возможность создания Z буфера
  d3dpp.AutoDepthStencilFormat = D3DFMT_D16;//формат поверхности Z буфера

  //создание девайса  
  if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &pDirect3DDevice)))//обект интерфейса устройства
   return E_FAIL;  
  pDirect3DDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);//отключить отсечение
  pDirect3DDevice->SetRenderState(D3DRS_LIGHTING,FALSE);//отключить освещение Direct3D
  pDirect3DDevice->SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE);//включаем Z буфер

  return S_OK;  
  }  

  ///////////////////////////////////////////////////////////////////////////////////////////////////
   
   
   
   
  void RenderD3D()  
  {  
   if(pDirect3DDevice==NULL)
    return;

  pDirect3DDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(60,100,150), 1.0f, 0); //цвет фона
  pDirect3DDevice->BeginScene(); //начало сцены
Matrix();
//здесь происходит отрисовка сцены
  pDirect3DDevice->SetStreamSource(0, pVertBuff, 0, sizeof(CUSTOMVERTEX));  
  //Установка формата вершин  
  pDirect3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);  
  pDirect3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 12);  

  pDirect3DDevice->EndScene(); //конец сцены

  pDirect3DDevice->Present(NULL, NULL, NULL, NULL); //показать все  
  }  

///////////////////////////////////////////////////////////////////////////////////////////////////////////////

  HRESULT InitVertBuff()  
  {  
  //проектируем вертексный буфер  
  CUSTOMVERTEX Vertex[] =  
  {  
  {  1.0f,-1.0f, 1.0f, 0x00000fff, }, //А
  { -1.0f,-1.0f, 1.0f, 0xff000fff, }, //В
  { -1.0f, 1.0f, 1.0f, 0x00000fff, }, //С
          
  { -1.0f, 1.0f, 1.0f, 0x00000fff, }, //C
  {  1.0f, 1.0f, 1.0f, 0xff000fff, }, //D
  {  1.0f,-1.0f, 1.0f, 0x00000fff, }, //A

         { -1.0f,-1.0f, 1.0f, 0x00000fff, }, //А2
         { -1.0f,-1.0f,-1.0f, 0x00000fff, }, //В2
         { -1.0f, 1.0f,-1.0f, 0x00000fff, }, //С2
         
         { -1.0f, 1.0f,-1.0f, 0x00000fff, }, //C2
         { -1.0f, 1.0f, 1.0f, 0x00000fff, }, //D2
         { -1.0f,-1.0f, 1.0f, 0x00000fff, }, //A2

         {  1.0f,-1.0f,-1.0f, 0xfff00000, }, //А3
         { -1.0f,-1.0f,-1.0f, 0xfff00000, }, //В3
         { -1.0f, 1.0f,-1.0f, 0xfff00000, }, //С3
          
         { -1.0f, 1.0f,-1.0f, 0xfff00000, }, //C3
         {  1.0f, 1.0f,-1.0f, 0xfff00000, }, //D3
         {  1.0f,-1.0f,-1.0f, 0xfff00000, }, //A3

   
         {  1.0f,-1.0f,-1.0f, 0x0000ffff, }, //А4
         {  1.0f,-1.0f, 1.0f, 0x0000ffff, }, //В4
         {  1.0f, 1.0f, 1.0f, 0x0000ffff, }, //С4
          
         {  1.0f, 1.0f, 1.0f, 0x0000ffff, }, //C4
         {  1.0f, 1.0f,-1.0f, 0x0000ffff, }, //D4
         {  1.0f,-1.0f,-1.0f, 0x0000ffff, }, //A4

         {  1.0f, 1.0f, 1.0f, 0x00000fff, }, //А5
         { -1.0f, 1.0f, 1.0f, 0x00000fff, }, //В5
         { -1.0f, 1.0f,-1.0f, 0x00000fff, }, //С5
          
         { -1.0f, 1.0f,-1.0f, 0x00000fff, }, //C5
         {  1.0f, 1.0f,-1.0f, 0x00000fff, }, //D5
         {  1.0f, 1.0f, 1.0f, 0x00000fff, }, //A5

         {  1.0f,-1.0f, 1.0f, 0x00000fff, }, //А6
         { -1.0f,-1.0f, 1.0f, 0x00000fff, }, //В6
         { -1.0f,-1.0f,-1.0f, 0x00000fff, }, //С6
          
         { -1.0f,-1.0f,-1.0f, 0x00000fff, }, //C6
         {  1.0f,-1.0f,-1.0f, 0x00000fff, }, //D6
         {  1.0f,-1.0f, 1.0f, 0x00000fff, }, //A6
     };
  const unsigned short Index[]={
        0,1,2,     2,3,0,
        4,5,6,     6,7,4,
        8,9,10,    10,11,8,
        12,13,14,  14,15,12,
        16,17,18,  18,19,16,
        20,21,22,  22,23,20,
     
  };  

  // | - кол-во вершин прямо пропорционально числу перед sizeof  
  if(FAILED(pDirect3DDevice->CreateVertexBuffer(
   36*sizeof(CUSTOMVERTEX),  
   0, D3DFVF_CUSTOMVERTEX,  
   D3DPOOL_DEFAULT, &pVertBuff, NULL)))  
      return E_FAIL;  

  void *pVB; //временный указатель на указатель вертекс буфера  

    
  if(FAILED(pVertBuff->Lock(0, sizeof(Vertex), (void**)&pVB, 0))) //Блоктровка буфера
  return E_FAIL;  

  memcpy(pVB, Vertex, sizeof(Vertex)); //копирование данных  

   
  pVertBuff->Unlock(); //Разблокировка буфера  

  return S_OK;  
  }

/////////////////////////////////////////////////
VOID Matrix()
{
  D3DXMATRIX MatrixWorld,MatrixWorldX;//мировая матрица
  D3DXMATRIX MatrixWorldY,MatrixWorldZ;
     D3DXMATRIX MatrixView;//матрица вида  
     D3DXMATRIX MatrixProjection;//матрица прекции
      
  //мировая матрица

     UINT Time = timeGetTime()% 5000;
  FLOAT Angle = Time*(2.0f * D3DX_PI)/5000.0f;

  D3DXMatrixRotationY(&MatrixWorldY,Angle);
  D3DXMatrixRotationX(&MatrixWorldX,Angle);
  D3DXMatrixMultiply(&MatrixWorld,&MatrixWorldX,&MatrixWorldY);
  pDirect3DDevice->SetTransform(D3DTS_WORLD,&MatrixWorld);

     //матрица вида
     D3DXMatrixLookAtLH(&MatrixView,&D3DXVECTOR3(0.0f,0.0f,-8.f),
   &D3DXVECTOR3(0.0f,0.0f,0.0f),
   &D3DXVECTOR3(0.0f,1.0f,0.0f));
    pDirect3DDevice->SetTransform( D3DTS_VIEW, &MatrixView );
  D3DXMatrixPerspectiveFovLH(&MatrixProjection,
   D3DX_PI/4,1.0f,1.0f,100.0f);
     //матрица проекции
     pDirect3DDevice->SetTransform(D3DTS_PROJECTION,&MatrixProjection);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  void FreeD3D()//функция освобождает захваченные ресурсы  
  {  
  if(pVertBuff != NULL) pVertBuff->Release();  
  if(pDirect3DDevice != NULL) pDirect3DDevice->Release();  
  if(g_pD3D != NULL) g_pD3D->Release();  
  }  

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,  
  WPARAM wparam, LPARAM lparam) //здесь происходит обработка сообщений
  {  
  switch(msg)  
  {  
  case WM_DESTROY:  
  FreeD3D(); //функция освобождния захваченых ресурсов
  PostQuitMessage(0);  
  break;  
  }  

  return (DefWindowProc(hwnd, msg, wparam, lparam));  
  }

window.cpp
Code
#include "render.h"  

  int WINAPI WinMain(HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpCmdLine,
                    int nCmdShow)//ГЛАВНАЯ ФУНКЦИЯ
  {  
   
  WNDCLASSEX wc; //создание класса окна  
  HWND hwnd; //создаём дискриптор окна
  MSG msg;   //идентификатор сообщения

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

           wc.cbSize = sizeof(WNDCLASSEX); // Размер всей структуры
           wc.style = CS_VREDRAW | CS_HREDRAW | CS_OWNDC | CS_DBLCLKS; //Задание стиля окн
     wc.lpfnWndProc = WndProc; //Наша функция обработки событий
           wc.cbClsExtra = 0;  
           wc.cbWndExtra = 0;  
           wc.hInstance = hInstance; //Экземпляр приложения
           wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);  
           wc.hCursor = LoadCursor(NULL, IDC_ARROW);  
           wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); //цвет фона
           wc.lpszMenuName = NULL; //имя меню
           wc.lpszClassName = L"TEST_WIN32"; //Имя класса окна
           wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);  
   
  //Регистрация созданного класса  
  RegisterClassEx(&wc); // Иконка в заголовке окна
   
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  //Создание окна  
  if(!(hwnd = CreateWindowEx(
  NULL,  
  L"TEST_WIN32",    //Имя класса окна
  L"База для DirectX", // Заголовок окна
  WS_OVERLAPPEDWINDOW | WS_VISIBLE,  
  CW_USEDEFAULT, CW_USEDEFAULT, // Координаты левого верхнего угла
  800,              // Ширина окна
  600,              // Высота окна
  NULL,             // Дескриптор родительского окна
  NULL,             // Дескриптор меню
  hInstance,        // Экземпляр
  NULL)))           // Дополнительные параметры
  return 0;  

  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  if(SUCCEEDED(InitD3D(hwnd)))  
  {  
  if(SUCCEEDED(InitVertBuff()))  
  {  
  ShowWindow(hwnd, nCmdShow); // Вывод окна  
  UpdateWindow(hwnd); // Апдейт окна  
  ZeroMemory(&msg, sizeof(msg));  

  while(msg.message != WM_QUIT)  
  {  
  if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))  
  {  
  TranslateMessage(&msg); // преобразование клав. ввода  
  DispatchMessage(&msg); // обработка и пересылка сообщ. в WinProc  
  }  
  else  
  RenderD3D(); //РЕНДЕР
  }  
  }  
  }  
  return 0; //(int)(msg.wParam);  
  }
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////


подскажите где я допустил ошибку


Я белый и пушистый но имею когти и зубы
ArchidoДата: Четверг, 04 Октября 2012, 11:41 | Сообщение # 2
Сэнсэй
Сейчас нет на сайте
Проблема в криво отрисовывающихся сторонах бокса? Если да, то проблема в порядке обхода вершин (в индексном буфере). Можно отключить Back Face Culling, сделав:
Code
pDirect3DDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
тогда все отрисуется нормально.

По умолчанию (и сейчас в коде) стоит D3DCULL_ССW, поэтому чтобы правильно все отрисовать нужно обходить вершины по часовой стрелке (для каждого треугольника).


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)

Сообщение отредактировал Archido - Четверг, 04 Октября 2012, 11:42
redinardДата: Четверг, 04 Октября 2012, 12:29 | Сообщение # 3
постоянный участник
Сейчас нет на сайте
так я просто отключу отсечение,а уменя проблемма заключается в том что осекаются лицевые грани вместо тыльных

Я белый и пушистый но имею когти и зубы
ArchidoДата: Четверг, 04 Октября 2012, 12:55 | Сообщение # 4
Сэнсэй
Сейчас нет на сайте
Так я и говорю - правильно обходить вершины нужно (в индексном буфере порядок вершин изменить). Собственно, D3DCULL_ССW говорит, что лицевые грани - это такие, у которых обход вершин сделан по часовой стрелке... А сейчас одна часть сделана по часовой, другая против часовой - вот кулинг нормально и не работает.

Добавлено (04.10.2012, 12:55)
---------------------------------------------
А, сейчас посмотрел - индексы при отрисовке вообще не используются, тогда нужно просто изменить порядок вершин в массиве.


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)

Сообщение отредактировал Archido - Четверг, 04 Октября 2012, 13:14
redinardДата: Четверг, 04 Октября 2012, 13:18 | Сообщение # 5
постоянный участник
Сейчас нет на сайте
можите пожалуйста показать как это правильно сделать,потому что я делаю практичесски 1 в 1 как в книге Горнакова,но вот результат

Добавлено (04.10.2012, 13:18)
---------------------------------------------
хотя я сам приметив писал не так как в книге,пожскажите правельный индекс буфер к нему,так как проект я начал давно и на лето забросил,а теперь толком не помню что к чему


Я белый и пушистый но имею когти и зубы
ArchidoДата: Четверг, 04 Октября 2012, 13:28 | Сообщение # 6
Сэнсэй
Сейчас нет на сайте
Сейчас у вас все рисуется без индекс буфера, хоть и определение его есть. Поэтому нужно изменить порядок следования вершин в их же массиве, как-то так:
Code

   HRESULT InitVertBuff()    
    {    
    //проектируем вертексный буфер    
    CUSTOMVERTEX Vertex[] =    
    {    
     {  1.0f,-1.0f, 1.0f, 0x00ff00ff, }, //А   
     { -1.0f, 1.0f, 1.0f, 0x00ff00ff, }, //С   
     { -1.0f,-1.0f, 1.0f, 0x00ff00ff, }, //В   
      
     { -1.0f, 1.0f, 1.0f, 0x00ff00ff, }, //C   
     {  1.0f,-1.0f, 1.0f, 0x00ff00ff, }, //A   
     {  1.0f, 1.0f, 1.0f, 0x00ff00ff, }, //D   

     { -1.0f,-1.0f, 1.0f, 0x000000ff, }, //А2   
     { -1.0f, 1.0f,-1.0f, 0x000000ff, }, //С2   
     { -1.0f,-1.0f,-1.0f, 0x000000ff, }, //В2   
             
     { -1.0f, 1.0f,-1.0f, 0x000000ff, }, //C2   
     { -1.0f,-1.0f, 1.0f, 0x000000ff, }, //A2   
     { -1.0f, 1.0f, 1.0f, 0x000000ff, }, //D2   
      

     {  1.0f,-1.0f,-1.0f, 0xffffff00, }, //А3   
     { -1.0f,-1.0f,-1.0f, 0xffffff00, }, //В3   
     { -1.0f, 1.0f,-1.0f, 0xffffff00, }, //С3   
              
     { -1.0f, 1.0f,-1.0f, 0xffffff00, }, //C3   
     {  1.0f, 1.0f,-1.0f, 0xffffff00, }, //D3   
     {  1.0f,-1.0f,-1.0f, 0xffffff00, }, //A3   

     {  1.0f,-1.0f,-1.0f, 0x00ff0000, }, //А4   
     {  1.0f, 1.0f, 1.0f, 0x00ff0000, }, //С4   
     {  1.0f,-1.0f, 1.0f, 0x00ff0000, }, //В4   
     
     {  1.0f, 1.0f, 1.0f, 0x00ff0000, }, //C4   
     {  1.0f,-1.0f,-1.0f, 0x00ff0000, }, //A4   
     {  1.0f, 1.0f,-1.0f, 0x00ff0000, }, //D4   

     {  1.0f, 1.0f, 1.0f, 0x00000fff, }, //А5   
     { -1.0f, 1.0f,-1.0f, 0x00000fff, }, //С5   
     { -1.0f, 1.0f, 1.0f, 0x00000fff, }, //В5   
     
     { -1.0f, 1.0f,-1.0f, 0x00000fff, }, //C5   
     {  1.0f, 1.0f, 1.0f, 0x00000fff, }, //A5   
     {  1.0f, 1.0f,-1.0f, 0x00000fff, }, //D5   
     

     {  1.0f,-1.0f, 1.0f, 0x00000fff, }, //А6   
     { -1.0f,-1.0f, 1.0f, 0x00000fff, }, //В6   
     { -1.0f,-1.0f,-1.0f, 0x00000fff, }, //С6   
              
     { -1.0f,-1.0f,-1.0f, 0x00000fff, }, //C6   
     {  1.0f,-1.0f,-1.0f, 0x00000fff, }, //D6   
     {  1.0f,-1.0f, 1.0f, 0x00000fff, }, //A6   
};   


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)

Сообщение отредактировал Archido - Четверг, 04 Октября 2012, 13:29
redinardДата: Вторник, 09 Октября 2012, 13:51 | Сообщение # 7
постоянный участник
Сейчас нет на сайте
ОГРОМНОЕ СПАСИБО !!!

Добавлено (09.10.2012, 13:51)
---------------------------------------------
народ,помогите исправить ошибки,я всю пару пропарился и несмог понять как их исправить

Code
#pragma comment(lib, "winmm.lib")  
#pragma comment(lib, "d3d9.lib")  
#pragma comment(lib, "d3dx9.lib")
  #include <windows.h>  
  #include "d3d9.h"  
  #include <d3dx9.h>
  #include <d3dx9core.h>

  #include <mmsystem.h>//заголовочный файл для работы с системными функциями

  //***********************************************************  

   
  LPDIRECT3D9 g_pD3D = NULL; //объявление главного объекта  
  LPDIRECT3DDEVICE9 pDirect3DDevice; //объявление девайса  
  LPDIRECT3DVERTEXBUFFER9 pVertBuff = NULL; //объявление вертекс буффера
  LPDIRECT3DINDEXBUFFER9 pBufferIndex = NULL;      // Индексный буфер  
  LPD3DXFONT pFont = NULL;
  RECT Rec;
  HFONT hFont;

void LightMaterial();
void Matrix();

  struct CUSTOMVERTEX//структура определяющая формат вершин
{
         float x, y, z;//координаты вершины
         float nx,ny,nz;       //нормали
};

  #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)//формат содержания вершин

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//
//             ИНИЦИАЛИЗАЦИЯ Direct3D
//
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  HRESULT InitD3D(HWND hwnd)  
  {  
  if(NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION))) //создаётся основной указатель на интерфейс IDirect3D9
  return E_FAIL;  

  D3DDISPLAYMODE Disp; //структура для соответствия текущих установок дисплея
  if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &Disp))) //получаем текущий формат дисплея
  return E_FAIL;  

  //параметры показа  
  D3DPRESENT_PARAMETERS d3dpp; //обект параметров представления Direct3DParametr
  ZeroMemory(&d3dpp, sizeof(d3dpp)); //очищает создаваемую структуру от мусора
  d3dpp.Windowed = false; //видеорежим используемый нашим приложением
  d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; //параметр опредиления размеров буфера
  d3dpp.BackBufferFormat = Disp.Format; //формат поверхности заднего буфера
  d3dpp.EnableAutoDepthStencil = true;//значение показывающее возможность создания Z буфера
  d3dpp.AutoDepthStencilFormat = D3DFMT_D16;//формат поверхности Z буфера
  d3dpp.BackBufferWidth = GetSystemMetrics(SM_CXSCREEN);//берём размер разрешения экрана и передаём параметрам
  d3dpp.BackBufferHeight = GetSystemMetrics(SM_CYSCREEN);//
  d3dpp.BackBufferCount = 3;// кол-во заданных буферов  
  d3dpp.FullScreen_RefreshRateInHz = Disp.RefreshRate;//частта обновления экрана

  //создание девайса  
  if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &pDirect3DDevice)))//обект интерфейса устройства
   return E_FAIL;  
  pDirect3DDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);//отключить отсечение
  pDirect3DDevice->SetRenderState(D3DRS_LIGHTING,FALSE);//отключить освещение Direct3D
  pDirect3DDevice->SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE);//включаем Z буфер

  return S_OK;  
  }  

  ///////////////////////////////////////////////////////////////////////////////////////////////////
   
   
   
   
  void RenderD3D()  
  {  
   if(pDirect3DDevice==NULL)
    return;

  pDirect3DDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(60,100,150), 1.0f, 0); //цвет фона
  pDirect3DDevice->BeginScene(); //начало сцены
//здесь происходит отрисовка сцены

Matrix();
LightMaterial();
//здесь происходит отрисовка сцены
  pDirect3DDevice->SetStreamSource(0, pVertBuff, 0, sizeof(CUSTOMVERTEX));  
  //Установка формата вершин  
  pDirect3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);  
  pDirect3DDevice->SetIndices(pBufferIndex);
  pDirect3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 12); //вывод обекта
  //вывод текаста
  DrawMyText(pDirect3DDevice, hFont, "Текст в DirectX",
          10,10,500,700,D3DCOLOR_ARGB(250,250,250,50));

pDirect3DDevice->EndScene(); //конец сцены

  pDirect3DDevice->Present(NULL, NULL, NULL, NULL); //показать все  
  }  

///////////////////////////////////////////////////////////////////////////////////////////////////////////////

   
  HRESULT InitVertBuff()  //internalObject   
     {     
     //проектируем вертексный буфер     
     CUSTOMVERTEX Vertex[] =     
     {     
      {  1.0f,-1.0f, 1.0f, 0.0f,0.0f,-1.0f }, //А    
      { -1.0f, 1.0f, 1.0f, 0.0f,0.0f,-1.0f }, //С    
      { -1.0f,-1.0f, 1.0f, 0.0f,0.0f,-1.0f }, //В    
        
      { -1.0f, 1.0f, 1.0f, 0.0f,0.0f,-1.0f}, //C    
      {  1.0f,-1.0f, 1.0f, 0.0f,0.0f,-1.0f }, //A    
      {  1.0f, 1.0f, 1.0f, 0.0f,0.0f,-1.0f }, //D    

      { -1.0f,-1.0f, 1.0f, -1.0f,0.0f,0.0f }, //А2    
      { -1.0f, 1.0f,-1.0f, -1.0f,0.0f,0.0f }, //С2    
      { -1.0f,-1.0f,-1.0f, -1.0f,0.0f,0.0f }, //В2    
               
      { -1.0f, 1.0f,-1.0f, -1.0f,0.0f,0.0f }, //C2    
      { -1.0f,-1.0f, 1.0f, -1.0f,0.0f,0.0f }, //A2    
      { -1.0f, 1.0f, 1.0f, -1.0f,0.0f,0.0f }, //D2    
        

      {  1.0f,-1.0f,-1.0f, 0.0f,0.0f,1.0f }, //А3    
      { -1.0f,-1.0f,-1.0f, 0.0f,0.0f,1.0f }, //В3    
      { -1.0f, 1.0f,-1.0f, 0.0f,0.0f,1.0f}, //С3    
                
      { -1.0f, 1.0f,-1.0f, 0.0f,0.0f,1.0f }, //C3    
      {  1.0f, 1.0f,-1.0f, 0.0f,0.0f,1.0f }, //D3    
      {  1.0f,-1.0f,-1.0f, 0.0f,0.0f,1.0f }, //A3    

      {  1.0f,-1.0f,-1.0f, 1.0f,0.0f,0.0f }, //А4    
      {  1.0f, 1.0f, 1.0f, 1.0f,0.0f,0.0f }, //С4    
      {  1.0f,-1.0f, 1.0f, 1.0f,0.0f,0.0f }, //В4    
       
      {  1.0f, 1.0f, 1.0f, 1.0f,0.0f,0.0f}, //C4    
      {  1.0f,-1.0f,-1.0f, 1.0f,0.0f,0.0f }, //A4    
      {  1.0f, 1.0f,-1.0f, 1.0f,0.0f,0.0f}, //D4    

      {  1.0f, 1.0f, 1.0f, 0.0f,-1.0f,0.0f }, //А5    
      { -1.0f, 1.0f,-1.0f, 0.0f,-1.0f,0.0f }, //С5    
      { -1.0f, 1.0f, 1.0f, 0.0f,-1.0f,0.0f}, //В5    
       
      { -1.0f, 1.0f,-1.0f, 0.0f,-1.0f,0.0f }, //C5    
      {  1.0f, 1.0f, 1.0f, 0.0f,-1.0f,0.0f }, //A5    
      {  1.0f, 1.0f,-1.0f, 0.0f,-1.0f,0.0f}, //D5    
       

      {  1.0f,-1.0f, 1.0f, 0.0f,1.0f,0.0f }, //А6    
      { -1.0f,-1.0f, 1.0f, 0.0f,1.0f,0.0f}, //В6    
      { -1.0f,-1.0f,-1.0f, 0.0f,1.0f,0.0f}, //С6    
                
      { -1.0f,-1.0f,-1.0f, 0.0f,1.0f,0.0f }, //C6    
      {  1.0f,-1.0f,-1.0f, 0.0f,1.0f,0.0f }, //D6    
      {  1.0f,-1.0f, 1.0f, 0.0f,1.0f,0.0f }, //A6    
  };    
  const unsigned short Index[]={
        0,1,2,     2,3,0,
        4,5,6,     6,7,4,
        8,9,10,    10,11,8,
        12,13,14,  14,15,12,
        16,17,18,  18,19,16,
        20,21,22,  22,23,20,
     
  };  

  // | - кол-во вершин прямо пропорционально числу перед sizeof  
  if(FAILED(pDirect3DDevice->CreateVertexBuffer(
   36*sizeof(CUSTOMVERTEX),  
   0, D3DFVF_CUSTOMVERTEX,  
   D3DPOOL_DEFAULT, &pVertBuff, NULL)))  
      return E_FAIL;  

  void *pVB; //временный указатель на указатель вертекс буфера  

    
  if(FAILED(pVertBuff->Lock(0, sizeof(Vertex), (void**)&pVB, 0))) //Блоктровка буфера
  return E_FAIL;  

  memcpy(pVB, Vertex, sizeof(Vertex)); //копирование данных  

   
  pVertBuff->Unlock(); //Разблокировка буфера  

  return S_OK;  
  }

/////////////////////////////////////////////////
VOID Matrix()
{
  D3DXMATRIX MatrixWorld,MatrixWorldX;//мировая матрица
  D3DXMATRIX MatrixWorldY,MatrixWorldZ;
     D3DXMATRIX MatrixView;//матрица вида  
     D3DXMATRIX MatrixProjection;//матрица прекции
      
  //мировая матрица

     UINT Time = timeGetTime()% 5000;
  FLOAT Angle = Time*(2.0f * D3DX_PI)/5000.0f;

  D3DXMatrixRotationY(&MatrixWorldY,Angle);
  D3DXMatrixRotationX(&MatrixWorldX,Angle);
  D3DXMatrixMultiply(&MatrixWorld,&MatrixWorldX,&MatrixWorldY);
  pDirect3DDevice->SetTransform(D3DTS_WORLD,&MatrixWorld);

     //матрица вида
     D3DXMatrixLookAtLH(&MatrixView,&D3DXVECTOR3(0.0f,0.0f,-8.f),
   &D3DXVECTOR3(0.0f,0.0f,0.0f),
   &D3DXVECTOR3(0.0f,1.0f,0.0f));
    pDirect3DDevice->SetTransform( D3DTS_VIEW, &MatrixView );
  D3DXMatrixPerspectiveFovLH(&MatrixProjection,
   D3DX_PI/4,1.0f,1.0f,100.0f);
     //матрица проекции
     pDirect3DDevice->SetTransform(D3DTS_PROJECTION,&MatrixProjection);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                    //
//    функция DrawMyText()
//    вывод текста на экран
//
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

VOID DrawMyText(LPDIRECT3DDEVICE9 pDirect3DDevice,HFONT hFont,
     char* StrokaTexta,int x,int y,int x1,
     int y1,D3DCOLOR MyColor)
{
  //создаём шрифт
  hFont = CreateFont(30, 10, 0, 0,FW_NORMAL,FALSE,FALSE,0,1,0,
                  0, 0, DEFAULT_PITCH|FF_MODERN, "Arial");
//координаты прямоугольника
     Rec.left     = x;
  Rec.top      = y;
  Rec.right    = x1;
     Rec.bottom   = y1;
//инициализируем шрифт
  D3DXCreateFont(pDirect3DDevice, hFont, &pFont);

//начало
  pFont -> Begin();
//вывод текста
  pFont -> DrawText(StrokaTexta, -1, &Rec, DT_WORDBREAK, MyColor);

//конец
  pFont ->End();

}

VOID LightMaterial()
{
  D3DMATERIAL9 Material; //материал
  D3DLIGHT9 Light; //свет
     //установим материал
  ZeroMemory(&Material,sizeof(D3DMATERIAL9));
  Material.Diffuse.r = Material.Ambient.r = 1.0f;
  Material.Diffuse.g = Material.Ambient.g = 1.0f;
  Material.Diffuse.b = Material.Ambient.b = 0.0f;
  Material.Diffuse.a = Material.Ambient.a = 1.0f;
  pDirect3DDevice-> SetMaterial(&Material);
  D3DXVECTOR3 VectorDir;
     //установим свет
     ZeroMemory(&Light,sizeof(D3DLIGHT9));
  Light.Type = D3DLIGHT_DIRECTIONAL;
     Light.Diffuse.r = 1.0f;
  Light.Diffuse.g = 1.0f;
  Light.Diffuse.b = 1.0f;
     Light.Range     = 1000.f;
  //установим нормаль
  VectorDir = D3DXVECTOR3(0.0f,0.0f,1.0f),
     D3DXVec3Normalize((D3DXVECTOR3*)&Light.Direction,&VectorDir);
      
  pDirect3DDevice -> SetLight(0,&Light);
  pDirect3DDevice -> LightEnable(0,TRUE);

  pDirect3DDevice -> SetRenderState(D3DRS_LIGHTING,TRUE);
  pDirect3DDevice -> SetRenderState(D3DRS_AMBIENT,0);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  void FreeD3D()//функция освобождает захваченные ресурсы  
  {  
  if(pVertBuff != NULL) pVertBuff->Release();  
  if(pDirect3DDevice != NULL) pDirect3DDevice->Release();  
  if(g_pD3D != NULL) g_pD3D->Release();  
  }  

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,  
  WPARAM wparam, LPARAM lparam) //здесь происходит обработка сообщений
  {  
  switch(msg)  
  {  
   {
  case WM_DESTROY:  
  FreeD3D(); //функция освобождния захваченых ресурсов
  PostQuitMessage(0);  
  break;  
  }  
  case WM_KEYDOWN:
  {
   if(wparam == VK_ESCAPE)
    PostQuitMessage(0);
   return 0;
  }

  }
  return (DefWindowProc(hwnd, msg, wparam, lparam));  
  }


Я белый и пушистый но имею когти и зубы
ArchidoДата: Вторник, 09 Октября 2012, 14:39 | Сообщение # 8
Сэнсэй
Сейчас нет на сайте
Копипаст из книжек? Нужно самому разбираться. В первую очередь нужно вынести бОльшую часть кода из заголовочника (.h) в .cpp, в .h файле оставить только объявления ф-ций, глобальные переменные, классы (описание вершин, например), все остальное писать в .cpp.

Другие проблемы связаны с тем, что в старых книгах по DX9 использовался и старый SDK, сейчас там кое-что поменялось... Конкретно в этом коде проблемы с шрифтами, нужно чутка переделать на новый лад, гугл знает на какой happy


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
redinardДата: Вторник, 09 Октября 2012, 15:26 | Сообщение # 9
постоянный участник
Сейчас нет на сайте
да действительно я сейчас копирую код,но попутно в нём пытаюсь разобратся,когда я доберусь до конца книги,я буду преобразовывать этот код в движок,но пока что мне надо хотябы переписать его и убедится что он работает

Добавлено (09.10.2012, 15:26)
---------------------------------------------
никак не могу найти корректное решение это проблеммы


Я белый и пушистый но имею когти и зубы
ArchidoДата: Вторник, 09 Октября 2012, 15:38 | Сообщение # 10
Сэнсэй
Сейчас нет на сайте
Какой именно? Давайте конкретнее.
В двух словах я написал, что неплохо бы сделать. Первом делом можно закоментировать все, что касается работы с текстом и исправить проблему с определением функции DrawMyText (сделать Render.h и Render.cpp, основной код писать в последнем), далее уже можно погуглить про текст и ID3DXFont и сделать необходимые правки в коде, т.к. копипастом из книги оно работать не будет (в данном случае).


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)

Сообщение отредактировал Archido - Вторник, 09 Октября 2012, 15:38
redinardДата: Вторник, 09 Октября 2012, 15:42 | Сообщение # 11
постоянный участник
Сейчас нет на сайте
Quote
error C2660: DrawMyText: функция не принимает 8 аргументов
почему ?


Я белый и пушистый но имею когти и зубы
ArchidoДата: Вторник, 09 Октября 2012, 16:27 | Сообщение # 12
Сэнсэй
Сейчас нет на сайте
Понятия не имею smile
В том коде, который выше был приведен, с этим проблем нет... зато есть другие. Если пишет, что не принимает столько-то аргументов, значит неверное их-кол во указывается при вызове ф-ции. Точно такой же год?


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
redinardДата: Вторник, 09 Октября 2012, 16:59 | Сообщение # 13
постоянный участник
Сейчас нет на сайте
вот код:


Я белый и пушистый но имею когти и зубы
ArchidoДата: Вторник, 09 Октября 2012, 17:12 | Сообщение # 14
Сэнсэй
Сейчас нет на сайте
Эм, почему ф-ция DrawMyText() объявляется без параметров, а ее реализация уже с параметрами? Должно быть одинаково и там и там.
С++ вообще на каком уровне знаете?


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
redinardДата: Вторник, 09 Октября 2012, 17:57 | Сообщение # 15
постоянный участник
Сейчас нет на сайте
на базвом,год обучался в универе,просто как было сказано ранее пока я просто копипастю,да и подзабыл слегка язык за лето )

Добавлено (09.10.2012, 17:57)
---------------------------------------------
нашол в нэте вот такое решение

Code
VOID DrawMyText(LPDIRECT3DDEVICE9 pDirect3DDevice,HFONT hFont,
         char* StrokaTexta,int x,int y,int x1,int y1,D3DCOLOR MyColor)
{
     MyColor = D3DCOLOR_ARGB(250,250,250,50);
     // Создаем шрифт
     D3DXCreateFont(pDirect3DDevice,30,10,FW_NORMAL,0,FALSE,1,0,0,DEFAULT_PITCH|FF_MODERN,"Arial",&pFont);    
     // Координаты прямоугольника
     Rec.left = x;                             
     Rec.top  = y;
     Rec.right  = x1;
     Rec.bottom = y1;   
     // Вывод текста
     pFont->DrawText(NULL,StrokaTexta, -1, &Rec, DT_WORDBREAK, MyColor);
     // удаляем
     pFont->Release();
                           
}
VOID RenderingDirect3D()
{
     if(pDirect3DDevice == NULL)        // Проверяем ошибки
         return;
      
     pDirect3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET| D3DCLEAR_ZBUFFER,
                    D3DCOLOR_XRGB(60,100,150), 1.0f, 0 );
     // Начало сцены
     pDirect3DDevice->BeginScene();      
      
     // Здесь происходит прорисовка сцены
     LightMaterial();
     Matrix();
   
     pDirect3DDevice->SetStreamSource( 0, pBufferVershin, 0, sizeof(CUSTOMVERTEX) );
     pDirect3DDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
     pDirect3DDevice->SetIndices(pBufferIndex);

     // Вывод объекта
     pDirect3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 36, 0, 12);
     // Вывод текста
      DrawMyText(pDirect3DDevice,hFont,"Лаб. раб. №3\nВращение куба\nДля выхода нажмите клавишу <Esc> ",10,10,500,700,D3DCOLOR_ARGB(250,250,250,50));

      // Конец сцены
     pDirect3DDevice->EndScene();        
     //  Представляем на экран  
     pDirect3DDevice->Present( NULL, NULL, NULL, NULL );
}

только осталась одна ошибка
Quote
error C2660: DrawMyText: функция не принимает 8 аргументов


Я белый и пушистый но имею когти и зубы
ArchidoДата: Вторник, 09 Октября 2012, 18:03 | Сообщение # 16
Сэнсэй
Сейчас нет на сайте
Ну, стоит таки язык подучить, чтобы на таких простых вещах не спотыкаться.
Копипастили наверное все в начале своего обучения smile , но в любом случае нужно пытаться разбираться в этом коде, а не просто делать лишь бы оно "заработало", ибо знаний такое не прибавит (но я думаю, вы это прекрасно понимаете). Неплохо бы взять книжечку и по языку параллельно с Горнаковым, ну и разбираться по ходу дела smile

Добавлено (09.10.2012, 18:03)
---------------------------------------------
Чтобы этой ошибки небыло, нужно заменить вот это:

Code
void DrawMyText();

на вот это:
Code
VOID DrawMyText(LPDIRECT3DDEVICE9 pDirect3DDevice,HFONT hFont,  
  char* StrokaTexta,int x,int y,int x1,  
  int y1,D3DCOLOR MyColor);


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
redinardДата: Вторник, 09 Октября 2012, 18:05 | Сообщение # 17
постоянный участник
Сейчас нет на сайте
язык то я подучу вместе с лабами,а ошибку то как исправить ?

Я белый и пушистый но имею когти и зубы
ArchidoДата: Вторник, 09 Октября 2012, 18:09 | Сообщение # 18
Сэнсэй
Сейчас нет на сайте
В предыдущем посте ответ smile

C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
redinardДата: Среда, 10 Октября 2012, 12:18 | Сообщение # 19
постоянный участник
Сейчас нет на сайте
спасибо,не заметил просто,действительно за лето подзабыл,но ничего мне ещё лаб 12 написать надо,так что вспомню ))

Добавлено (10.10.2012, 01:06)
---------------------------------------------

Quote
В первую очередь нужно вынести бОльшую часть кода из заголовочника (.h) в .cpp, в .h файле оставить только объявления ф-ций, глобальные переменные, классы (описание вершин, например), все остальное писать в .cpp.


можеш пожалуйста показать как поумнее будет это сделать,желательно в образе заготовки движка

Добавлено (10.10.2012, 12:18)
---------------------------------------------
я хочу понять архитектуру движка,и начать его строить


Я белый и пушистый но имею когти и зубы
ArchidoДата: Среда, 10 Октября 2012, 13:41 | Сообщение # 20
Сэнсэй
Сейчас нет на сайте
Quote (redinard)
я хочу понять архитектуру движка,и начать его строить

Чтобы понять архитектуру движков и как они устроены, нужно для начала с одним из них поработать - тогда отпадет очень много вопросов и сие не будет похоже на "делаю то - незнаю что". Чтобы начать "строить" - нужно знать язык на очень уверенном уровне, иначе это будет кривая поделка, большая половина которой представляет собой копипаст кода из различных мест.

Могу порекомендовать следующее: попробовать взять несложный 2D движок и наваять на нем небольшую игрушку, параллельно с разработкой игрушки неплохо бы взять в руки Страуструпа и повышать свой уровень владения языком, тут же применяя изученное на практике (при разработке игры). Как итог - узнаешь что вообще из себя представляет движок, как с ним осуществляется работа, ну и язык подтянешь. Дальше можно усиленно DX9 изучать (а не просто копипастить), а после уже и до своего двигла недалеко.

Программированию никто ни в каком институте не научит - только самостоятельно, иначе будет очень грустно.


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)

Сообщение отредактировал Archido - Среда, 10 Октября 2012, 13:44
Форум игроделов » Программирование » C/C++ » помощь в разработке движка
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг