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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прорисовка моделей 
:(
    Опции темы
Zarkon
Дата 27.8.2012, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго времени суток!
Подгружаю модель в программу и вижу такой косяк: некоторые стены видны друг через друга, проще на скрине

user posted image
user posted image

Даже понятия не имею, с чем это может быть связано. Вот код инициализации DirectX
Код

#include "../Headers/dxfunc.h"
#include "../Headers/stdafx.h"


// Функция инициализации Direct3D
HRESULT DX3DInit(IDirect3D9 **ppiD3D9, 
                IDirect3DDevice9 **ppiD3DDevice9,
                HWND hWnd, 
                DWORD iWidth,
                DWORD iHeight,
                BOOL bFullScreen)
{
  // Инициализация 
  if((*ppiD3D9 = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)
    return E_FAIL;

  // Заполняем основные параметры представления
  D3DPRESENT_PARAMETERS d3dpp;
  ZeroMemory(&d3dpp, sizeof(d3dpp));

  d3dpp.BackBufferWidth = iWidth;
  d3dpp.BackBufferHeight = iHeight;

  // Запрос на отображение в полноэкранном режиме
  int  iRes;
  if (!bFullScreen)
      iRes=MessageBox(hWnd, "Use fullscreen mode?", "Screen", MB_YESNO | MB_ICONQUESTION);
  else
      iRes = IDYES;

  if(iRes == IDYES)
  {
      //////////////////////////////////////////////////////////
      // Полноэкранный режим
      //////////////////////////////////////////////////////////
      // Установка параметров полноэкранного режима
      d3dpp.BackBufferFormat = D3DFMT_R5G6B5;
      d3dpp.SwapEffect       = D3DSWAPEFFECT_FLIP;
      d3dpp.Windowed         = FALSE;
      d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
      d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
  } 
  else 
  {
      //////////////////////////////////////////////////////////
      // Оконный режим
      //////////////////////////////////////////////////////////
      RECT wndRect;
      RECT clientRect;
      GetWindowRect(hWnd, &wndRect);
      GetClientRect(hWnd, &clientRect);      

      iWidth  = iWidth + (wndRect.right-wndRect.left)  - (clientRect.right-clientRect.left);
      iHeight = iHeight + (wndRect.bottom-wndRect.top) - (clientRect.bottom-clientRect.top);

      MoveWindow(hWnd, wndRect.left, wndRect.top, iWidth, iHeight, TRUE);

      // Получить формат пикселя
      D3DDISPLAYMODE d3ddm;
      (*ppiD3D9)->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm);

      // Установка параметров
      d3dpp.BackBufferFormat = d3ddm.Format;
      d3dpp.SwapEffect       = D3DSWAPEFFECT_DISCARD;
      d3dpp.Windowed         = TRUE;
  }
  
  DWORD Flags= D3DCREATE_MIXED_VERTEXPROCESSING;

  // Создать 3D устройство
  HRESULT hRes;
  if(FAILED(hRes = (*ppiD3D9)->CreateDevice(
      D3DADAPTER_DEFAULT, 
      D3DDEVTYPE_HAL, hWnd, Flags, 
      &d3dpp, ppiD3DDevice9)))
      return hRes;

  // Установить перспективу
  float Aspect = (float)d3dpp.BackBufferWidth / (float)d3dpp.BackBufferHeight;
  D3DXMATRIX matProjection;

  D3DXMatrixPerspectiveFovLH(&matProjection, D3DX_PI/4.0f, Aspect, 0.1f, 10000.0f);

  (*ppiD3DDevice9)->SetTransform(D3DTS_PROJECTION, &matProjection);

  return S_OK;
}

HRESULT DX3DInitZ(IDirect3D9 **ppiD3D9, 
                IDirect3DDevice9 **ppiD3DDevice9,
                HWND hWnd, 
                DWORD iWidth,
                DWORD iHeight,
                BOOL bFullScreen)
{
  // Инициализация 
  if((*ppiD3D9 = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)
    return E_FAIL;

  // Заполняем основные параметры представления
  D3DPRESENT_PARAMETERS d3dpp;
  ZeroMemory(&d3dpp, sizeof(d3dpp));

  d3dpp.BackBufferWidth = iWidth;
  d3dpp.BackBufferHeight = iHeight;
  d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
  d3dpp.EnableAutoDepthStencil = TRUE;
 
  // Запрос на отображение в полноэкранном режиме
  int  iRes;
  /*if (!bFullScreen)
      iRes=MessageBox(hWnd, "Use fullscreen mode?", "Screen", MB_YESNO | MB_ICONQUESTION);
  else
      iRes = IDYES;

  */
  iRes = IDNO;
  if(iRes == IDYES)
  {
      //////////////////////////////////////////////////////////
      // Полноэкранный режим
      //////////////////////////////////////////////////////////
      // Установка параметров полноэкранного режима
      d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
      d3dpp.SwapEffect       = D3DSWAPEFFECT_FLIP;
      d3dpp.Windowed         = FALSE;
      d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
      d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
  } 
  else 
  {
      //////////////////////////////////////////////////////////
      // Оконный режим
      //////////////////////////////////////////////////////////
      RECT wndRect;
      RECT clientRect;
      GetWindowRect(hWnd, &wndRect);
      GetClientRect(hWnd, &clientRect);      

      iWidth  = iWidth + (wndRect.right-wndRect.left)  - (clientRect.right-clientRect.left);
      iHeight = iHeight + (wndRect.bottom-wndRect.top) - (clientRect.bottom-clientRect.top);

      MoveWindow(hWnd, wndRect.left, wndRect.top, iWidth, iHeight, TRUE);

      // Получить формат пикселя
      D3DDISPLAYMODE d3ddm;
      (*ppiD3D9)->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm);

      // Установка параметров
      d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
      d3dpp.SwapEffect       = D3DSWAPEFFECT_DISCARD;
      d3dpp.Windowed         = TRUE;
  }
  
  DWORD Flags= D3DCREATE_MIXED_VERTEXPROCESSING;

  // Создать 3D устройство
  HRESULT hRes;
  if(FAILED(hRes = (*ppiD3D9)->CreateDevice(
      D3DADAPTER_DEFAULT, 
      D3DDEVTYPE_HAL, hWnd, Flags, 
      &d3dpp, ppiD3DDevice9)))
      return hRes;

  // Установить перспективу
  float Aspect = (float)d3dpp.BackBufferWidth / (float)d3dpp.BackBufferHeight;
  D3DXMATRIX matProjection;
  D3DXMatrixPerspectiveFovLH(&matProjection, D3DX_PI/4.0f, Aspect, 2.0f, 1000.0f);
  (*ppiD3DDevice9)->SetTransform(D3DTS_PROJECTION, &matProjection);

  (*ppiD3DDevice9)->SetRenderState(D3DRS_LIGHTING, FALSE);

  return S_OK;
}



И код загрузки модели
Код


DWORD LoadMesh (char *filename, IDirect3DDevice9 *ppiD3DDevice9,
               ID3DXMesh **ppMesh,
               LPDIRECT3DTEXTURE9 **pMeshTextures,
               char *texturefilename, 
               D3DMATERIAL9 **pMeshMaterials
               )
{
    LPD3DXBUFFER pD3DXMtrlBuffer;
    DWORD dwNumMaterials;

    D3DXLoadMeshFromX(filename, D3DXMESH_SYSTEMMEM,
        ppiD3DDevice9, NULL, &pD3DXMtrlBuffer, NULL, &dwNumMaterials, ppMesh);

    D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();

    (*pMeshTextures) = new LPDIRECT3DTEXTURE9[dwNumMaterials];
    (*pMeshMaterials) = new D3DMATERIAL9[dwNumMaterials];

    for( DWORD i=0; i<dwNumMaterials; i++ )
    {
        // Копируем материал
        (*pMeshMaterials)[i] = d3dxMaterials[i].MatD3D;

        // Создаем текстуру
        if( FAILED(D3DXCreateTextureFromFile(ppiD3DDevice9, 
            d3dxMaterials[i].pTextureFilename, &(*pMeshTextures)[i])))
            if( FAILED(D3DXCreateTextureFromFile(ppiD3DDevice9, 
                texturefilename, &(*pMeshTextures)[i])))
                (*pMeshTextures)[i] = NULL;
    }
    return dwNumMaterials;
}

bool LoadTexture(DWORD* text_buf, int iWidth, int iHeight, char* filename)
{
    HANDLE hFile = CreateFile(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);        
    if(hFile == INVALID_HANDLE_VALUE) 
        return FALSE;

    BITMAPFILEHEADER bmpfilehdr;  
    DWORD dwRead;
    if(!ReadFile(hFile, &bmpfilehdr, sizeof(bmpfilehdr), &dwRead, NULL))
        return FALSE;
    
    char* ptr=(char*)&bmpfilehdr.bfType;
    if (*ptr!='B' || *++ptr!='M')
        return FALSE;

    BITMAPINFOHEADER bmpinfohdr;
    if(!ReadFile(hFile, &bmpinfohdr, sizeof(bmpinfohdr), &dwRead, NULL))
        return FALSE;

    if (bmpinfohdr.biCompression!=BI_RGB)
        return 0;

    int iImageSize=bmpinfohdr.biSizeImage;
    if (iImageSize==0)
        iImageSize=((iWidth*4+3) & ~3)*iHeight;

    BYTE* buf=new BYTE[iImageSize];
    if(!ReadFile(hFile, buf, iImageSize, &dwRead, NULL))
        return FALSE;

    if (bmpinfohdr.biBitCount!=24)
        return FALSE;

    int bytesgiven=(iWidth*3+3) & ~3;
    DWORD* btSurf = text_buf;
    BYTE* imagebits = (BYTE*)(&buf[(iHeight-1)*bytesgiven]);

    for (int i=0; i<iHeight; i++)
    {
        RGBTRIPLE* tlImage=(RGBTRIPLE*)imagebits;
        for (int p=0; p<iWidth; p++)
        {
            *btSurf = (DWORD)((tlImage->rgbtBlue) | (tlImage->rgbtGreen << 8) | 
                           (tlImage->rgbtRed << 16) | (0xFF << 24));
            tlImage++;
            btSurf++;
        }
        imagebits -= bytesgiven;
    }

    delete [] buf;
    return TRUE;
}



Прошу вашей помощи  smile 

PM MAIL   Вверх
Alexeis
Дата 27.8.2012, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Возможно нормали неверные. Если нормаль смотрит от нас, то директХ ее не рисует.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Zarkon
Дата 28.8.2012, 03:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Возможно нормали неверные. Если нормаль смотрит от нас, то директХ ее не рисует.



ммм, карту, назовем ее так)) делаю в 3D Max, так что врятли дело в самой модели. Я уже несколько разных делал, но проблема одна и та же



Да еще, если включить FILLMODE(когда видно только нормали) все эти места видны, т.е они прорисовываются

Это сообщение отредактировал(а) Zarkon - 28.8.2012, 03:21
PM MAIL   Вверх
Alexeis
Дата 28.8.2012, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Бывает что экспорт в формат х глючит. Можно посмотреть стандартном просмотрщике х файлов, который идет с SDK. Если там такая же беда, то нормали.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Zarkon
Дата 28.8.2012, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Проверял в Deep Exploration(конвертер) он читает идеально. Это что то с кодом
PM MAIL   Вверх
Zarkon
  Дата 2.9.2012, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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

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


 




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


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

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