Отрисовка треугольника в DirectX c++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by maked0n, 9 Oct 2010.

  1. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    Подскажите, почему не рендерится треугольник? Просто белый экран и всё.

    Code:
    #include <windows.h>
    #include <d3d9.h> 
    #include <d3dx9.h> 
    
    #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
    
    #pragma comment (lib, "d3d9.lib")
    #pragma comment (lib, "d3dx9.lib")
    
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    
    HRESULT InitialDX(HWND hWnd);    // Функция инициализации DIRECTX 
    HRESULT InitialBufferVershin();
    void Render();    // Функция рендеринга(отрисовки) 
    void ReleaseDX();   // Функция освобождения устройств. 
    
    WNDCLASSEX windowsclass;
    MSG msg;
    HWND hWnd;
    LPDIRECT3D9 pDirect3D = 0;   
    LPDIRECT3DDEVICE9 pDirect3DDevice = 0;
    LPDIRECT3DVERTEXBUFFER9 pBufferVershin = NULL;
    struct CUSTOMVERTEX
    {
    	FLOAT x, y, z, rhw;
    	DWORD color;
    };
    
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    
    LRESULT CALLBACK WinProc(HWND hWnd,UINT msg,WPARAM wparam,LPARAM lparam)   //функция обработки сообщений 
    { 
      switch(msg) 
      { 
    case WM_DESTROY:    // закрытие(уничтожение) окна 
        { 
         ReleaseDX(); 
         PostQuitMessage(0); 
         return 0; 
        } 
      } 
      return (DefWindowProc(hWnd,msg,wparam,lparam)); 
    } 
    
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) 
    { 
    
      // инициализация класа окна 
      windowsclass.cbSize = sizeof(windowsclass);    // Размер всей структуры 
      windowsclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);    //Цвет фона окна 
      windowsclass.hCursor = LoadCursor(NULL, IDC_ARROW);  //Вид курсора 
      windowsclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);    //Иконка приложения 
      windowsclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);    // Иконка в заголовке окна 
      windowsclass.hInstance = hInstance;      //Экземпляр приложения 
      windowsclass.lpfnWndProc = WinProc;      //Наша функция обработки событий 
      windowsclass.lpszClassName = L"windowsclass";   //Имя класса окна 
      windowsclass.style = CS_DBLCLKS|CS_OWNDC|CS_HREDRAW|CS_VREDRAW;    //Задание стиля окна 
       
      RegisterClassEx(&windowsclass);  //Регистрация класа окна в операционной системе 
    
      //Создание окна 
      hWnd = CreateWindow( 
       L"windowsclass",    //Имя класса окна 
       L"DirectX",  // Заголовок окна 
       WS_OVERLAPPEDWINDOW|WS_VISIBLE,    //Стиль окна 
       100, 100,  // Координаты левого верхнего угла 
       600,   // Ширина окна 
       600,   // Высота окна 
       NULL,   // Дескриптор родительского окна 
       NULL,   // Дескриптор меню 
       hInstance,  // Экземпляр 
       NULL);  // Дополнительные параметры 
    
    if (SUCCEEDED(InitialDX(hWnd))) 
       {   
    	   if(SUCCEEDED(InitialBufferVershin()))
    	   {
    			ShowWindow(hWnd, nShowCmd);    // Вывод окна 
    			UpdateWindow(hWnd);   // Обновление окна 
    
    			ZeroMemory(&msg,sizeof(msg));    //Очистка сообщений 
    
    			while(msg.message!=WM_QUIT)    // Цикл обработки сообщений 
    			{ 
    			 if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) 
    			 { 
    			  TranslateMessage(&msg); 
    			  DispatchMessage(&msg); 
    			 } 
    			 else 
    			 {
    				 Render();   //Наш код 
    			 } 
    			}  
    	   }
       } 
    }
    
    HRESULT InitialBufferVershin()
    {
    	CUSTOMVERTEX Vershin[] = 
    	{
    		{30.0f, 30.0f, 0.5f, 0.1f, 0xffff0000, },
    		{30.0f, 30.0f, 0.5f, 0.1f, 0xff00ff00, },
    		{15.0f, 15.0f, 0.5f, 0.1f, 0xff0000ff, },
    	};
    
    	pDirect3DDevice->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &pBufferVershin, NULL);
    	VOID* pBV;
    	pBufferVershin->Lock(0, sizeof(Vershin), (VOID**)&pBV, 0);
    	memcpy(pBV, Vershin, sizeof(Vershin));
    	pBufferVershin->Unlock();
    	return S_OK;
    }
    
    HRESULT InitialDX(HWND hWnd) 
    { 
       if(NULL==(pDirect3D=Direct3DCreate9(D3D_SDK_VERSION)))    //создание основного интерфейса 
        return E_FAIL; 
       D3DDISPLAYMODE Display;    // структура с настройками монитора 
       if (FAILED(pDirect3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&Display))) // получение настроек монитора. 
        return E_FAIL; 
    
       D3DPRESENT_PARAMETERS Direct3DParametr;  // Структура с настройками 
       ZeroMemory(&Direct3DParametr,sizeof(Direct3DParametr)); // Обнуление структуры 
       Direct3DParametr.Windowed=TRUE;       // Рeжим отображения приложения(true - оконное, false -полноэкранное) 
       Direct3DParametr.SwapEffect=D3DSWAPEFFECT_DISCARD;  // Метод переключения буферов 
       Direct3DParametr.BackBufferFormat=Display.Format;  // Формат пикселя(колличество разрядов цвета) 
       Direct3DParametr.EnableAutoDepthStencil=TRUE;   // Управление буфером глубины 
       Direct3DParametr.AutoDepthStencilFormat=D3DFMT_D16;  // Формат буфера глубины 
       Direct3DParametr.BackBufferWidth=Display.Width;   // Ширина буфера 
       Direct3DParametr.BackBufferHeight=Display.Height;  // Высота буфера 
       //Direct3DParametr.FullScreen_RefreshRateInHz=Display.RefreshRate;    //Частота обновления экрана(только в полноэкранном режиме) 
         
       if (FAILED(pDirect3D->CreateDevice(D3DADAPTER_DEFAULT, // используемая видеокарта 
        D3DDEVTYPE_REF,  // тип устройства 
        hWnd,    // дескриптор родительского окна 
        D3DCREATE_HARDWARE_VERTEXPROCESSING,    //режим обработки шейдеров 
        &Direct3DParametr,    // структура с настройками 
        &pDirect3DDevice))) // указатель на устройство 
       {
    	 MessageBox(hWnd, L"Error", L"Error", MB_OK|MB_ICONEXCLAMATION);
         return E_FAIL; 
       }
       return S_OK; 
    }
    
    void Render() 
    { 
       pDirect3DDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(255,255,255),0.0f,0); //Очистка вторичного буфера 
       pDirect3DDevice->BeginScene();
       
       pDirect3DDevice->SetStreamSource(0, pBufferVershin, 0, sizeof(CUSTOMVERTEX)); 
       pDirect3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
       pDirect3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
    
       pDirect3DDevice->EndScene();    //Конец рендеринга 
       pDirect3DDevice->Present(NULL,NULL,NULL,NULL); // копирование вторичного буфера в первичный 
    } 
    
    void ReleaseDX() 
    { 
    	if(pBufferVershin!=NULL)
    		pBufferVershin->Release();
       if(pDirect3DDevice!=NULL) 
        pDirect3DDevice->Release(); 
       if(pDirect3D!=NULL) 
        pDirect3D->Release(); 
    } 
     
    #1 maked0n, 9 Oct 2010
    Last edited: 10 Oct 2010
  2. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    Никто не знает?!