visão geral parte da api directx da microsoft [1] disponível a partir do windows 95 utilizado...

43

Upload: suzana-beretta-alves

Post on 07-Apr-2016

214 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite
Page 2: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Visão geral Parte da API DirectX da Microsoft [1] Disponível a partir do Windows 95 Utilizado para renderizar gráficos

tridimensionais Permite que as aplicações rodem em

tela cheia e em janela Utiliza aceleração de hardware se

disponível no chip gráfico

Page 3: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

[2]

Page 4: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite
Page 5: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Características Z-buffering Anti-aliasing Composição alfa MipMaping Efeitos de atmosfera Mapeamento de textura em perspectiva

Page 6: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

API API 3D Contém vários comandos de

renderização 3D Contém comandos de renderização 2D

também

Page 7: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

COM Component Object Model Método para criação de objetos

avançados Atua como objetos montáveis (“Lego”)

Classes C++ ou grupos de classes nos quais pode-se chamar funções para atingir certos objetivos

Classes não necessitam das outras para operar Pode-se plugar e desplugar

Page 8: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Por que COM? DirectX é uma série de objetos COM,

sendo um dos quais o Direct3D Classe avançada que contém todo o

necessário para rodar gráficos 2D e 3D Ex: d3d->CreateDevice() d3d->Release() Interface Direct3D

Page 9: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Primeiro programa Direct3D Direct3D não é uma linguagem em si Primeiro programa: preencher uma

janela de azul Criar variáveis globais e protótipos de

funções Criar função que inicializa Direct3D e

cria dispositivo Direct3D Criar função para renderizar um frame Criar função para fechar Direct3D

Page 10: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

1 // include the basic windows header files and the Direct3D header file

#include <windows.h>#include <windowsx.h>#include <d3d9.h>

// include the Direct3D Library file#pragma comment (lib, "d3d9.lib")

// global declarationsLPDIRECT3D9 d3d;    // the pointer to our Direct3D interfaceLPDIRECT3DDEVICE9 d3ddev;    // the pointer to the device class

// function prototypesvoid initD3D(HWND hWnd);    // sets up and initializes Direct3Dvoid render_frame(void);    // renders a single framevoid cleanD3D(void);    // closes Direct3D and releases memory

// the WindowProc function prototypeLRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

Page 11: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

2 // this function initializes and prepares Direct3D for use

void initD3D(HWND hWnd){    d3d = Direct3DCreate9(D3D_SDK_VERSION);    // create the Direct3D interface

    D3DPRESENT_PARAMETERS d3dpp;    // create a struct to hold various device information

    ZeroMemory(&d3dpp, sizeof(d3dpp));    // clear out the struct for use    d3dpp.Windowed = TRUE;    // program windowed, not fullscreen    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;    // discard old frames    d3dpp.hDeviceWindow = hWnd;    // set the window to be used by Direct3D

    // create a device class using this information and information from the d3dpp stuct    d3d->CreateDevice(D3DADAPTER_DEFAULT,                      D3DDEVTYPE_HAL,                      hWnd,                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,                      &d3dpp,                      &d3ddev);}

Page 12: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

3 // this is the function used to render a single frame

void render_frame(void){    // clear the window to a deep blue    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0);

    d3ddev->BeginScene();    // begins the 3D scene

    // do 3D rendering on the back buffer here

    d3ddev->EndScene();    // ends the 3D scene

    d3ddev->Present(NULL, NULL, NULL, NULL);    // displays the created frame}

Page 13: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

4 // this is the function that cleans up

Direct3D and COMvoid cleanD3D(void){    d3ddev->Release();    // close and release the 3D device    d3d->Release();    // close and release Direct3D}

Page 14: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Resultado

Page 15: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Tela cheia É necessário mudar alguns detalhes no

código Muitas vezes é importante saber o

tamanho da tela Problemas Mudar resolução em

tempo de execução

Page 16: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

1 // define the screen resolution

#define SCREEN_WIDTH  800#define SCREEN_HEIGHT 600

Page 17: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

2 hWnd = CreateWindowEx(NULL,

                          L"WindowClass",                          L"Our Direct3D Program",                          WS_OVERLAPPEDWINDOW,                          300, 300,                          SCREEN_WIDTH, SCREEN_HEIGHT,    // set window to new resolution                          NULL,                          NULL,                          hInstance,                          NULL);

Page 18: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Mudando para tela cheia hWnd = CreateWindowEx(NULL,

                          L"WindowClass",                          L"Our Direct3D Program",                          WS_EX_TOPMOST | WS_POPUP,    // fullscreen values                          0, 0,    // the starting x and y positions should be 0                          SCREEN_WIDTH, SCREEN_HEIGHT,                          NULL,                          NULL,                          hInstance,                          NULL);

Page 19: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Nova resolução D3DPRESENT_PARAMETERS d3dpp;    // create a struct to

hold various device information

    ZeroMemory(&d3dpp, sizeof(d3dpp));    // clear out the struct for use    d3dpp.Windowed = FALSE;    // program fullscreen, not windowed    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;    // discard old frames    d3dpp.hDeviceWindow = hWnd;    // set the window to be used by Direct3D    d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;    // set the back buffer format to 32-bit    d3dpp.BackBufferWidth = SCREEN_WIDTH;    // set the width of the buffer    d3dpp.BackBufferHeight = SCREEN_HEIGHT;    // set the height of the buffer

Page 20: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Desenhando um triângulo Flexible vertex formats

Page 21: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Estrutura Criamos uma estrutura com essas flags.

Usamos ela ao invés de chamar todo o código FVF toda vez.

#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

Page 22: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Estrutura do Vértice struct CUSTOMVERTEX

{    FLOAT x, y, z, rhw;    // from the D3DFVF_XYZRHW flag    DWORD color;    // from the D3DFVF_DIFFUSE flag}

Page 23: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Vértice CUSTOMVERTEX OurVertex = {320.0f, 50.0f,

1.0f, 1.0f, D3DCOLOR_XRGB(0, 0, 255)};

Outra possibilidade (trângulo) : CUSTOMVERTEX OurVertices[] ={    {320.0f, 50.0f, 1.0f, 1.0f, D3DCOLOR_XRGB(0, 0, 255),},    {520.0f, 400.0f, 1.0f, 1.0f, D3DCOLOR_XRGB(0, 255, 0),},    {120.0f, 400.0f, 1.0f, 1.0f, D3DCOLOR_XRGB(255, 0, 0),},};

Page 24: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Vertex Buffers Já temos o FVF e um triângulo. È necessário que

estejam prontos para uso do Direct3D Vertex buffer

Interface que armazena uma sessão em memória para manter informação sobre os vértices e modelos

HRESULT CreateVertexBuffer(    UINT Length, // buffer lenght    DWORD Usage, // special use flag    DWORD FVF, // FVF built previously

    D3DPOOL Pool, // where and how to create VB    LPDIRECT3DVERTEXBUFFER9 ppVertexBuffer, // pointer    HANDLE* pSharedHandle // null);

Page 25: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Construção LPDIRECT3DVERTEXBUFFER9 v_buffer;

d3ddev->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),                           0,                           CUSTOMFVF,                           D3DPOOL_MANAGED,                           &v_buffer,                           NULL);

É necessário travar antes de acesso ao buffer Controle total da memória, e garantir que hardware de vídeo não mova memória.

Após, usar memcopy()

Page 26: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Funções HRESULT Lock(UINT OffsetToLock,

             UINT SizeToLock, // lock part of the buffer             VOID** ppbData,             DWORD Flags // special ways to handle locked memory);

VOID* pVoid;    // the void* we were talking about

v_buffer->Lock(0, 0, (void**)&pVoid, 0);    // locks v_buffer, the buffer we made earlier

memcpy(pVoid, OurVertices, sizeof(OurVertices));    // copy vertices to the vertex buffer

v_buffer->Unlock();    // unlock v_buffer

Page 27: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Escrevendo a primitiva // this is the function used to render a single frame

void render_frame(void){    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

    d3ddev->BeginScene();

        // select which vertex format we are using        d3ddev->SetFVF(CUSTOMFVF);

        // select the vertex buffer to display        d3ddev->SetStreamSource(0, v_buffer, 0, sizeof(CUSTOMVERTEX)); // number stream source, pointer vertex source, start, size

        // copy the vertex buffer to the back buffer        d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1); //type, first vertex, number of primitives

    d3ddev->EndScene();

    d3ddev->Present(NULL, NULL, NULL, NULL);}

Page 28: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Lliberando VBs // this is the function that cleans up Direct3D and

COMvoid cleanD3D(void){    v_buffer->Release();    // close and release the vertex buffer    d3ddev->Release();    // close and release the 3D device    d3d->Release();    // close and release Direct3D}

Page 29: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Triângulo

Page 30: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Projeto 2 Display: Direct3D Sons: FMOD TAG mp3: id3lib

Page 31: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Display: Direct3D - 1

Utilizado um vertexbuffer para desenhar tudo.Foi utilizado a propriedade DYNAMIC para

customizar detalhes dos vertices.

Page 32: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Display: Direct3D - 2

Criando VertexBuffer:

Page 33: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Display: Direct3D - 2 Desenhando:

Page 34: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Display: Direct3D - 2 Desenhando:

Todas as texturas utilizam essa função para serem desenhadas, só mudando os valores dos parâmetros!

Page 35: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Projeto 2 – Tela inicial

Loading utilizando threads. Para que isso seja possível, setar D3DCREATE_MULTITHREADED no CreateDevice().

Page 36: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Projeto 2 – Tela inicial - Código

Page 37: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Projeto 2 – Tela inicial – Código – Parte 1Código que chama a thread:

Page 38: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Projeto 2 – Tela inicial – Código – Parte 2Código da thread:

Page 39: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Projeto 2 – Tela inicial – Código – Parte 3

Page 40: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Projeto 2 – Tela Principal

Page 41: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Projeto 2 – Tela Principal

Interações com usuário em Vermelho.

Page 42: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Projeto 2 – Tela Principal - Video

Page 43: Visão geral  Parte da API DirectX da Microsoft [1]  Disponível a partir do Windows 95  Utilizado para renderizar gráficos tridimensionais  Permite

Referências bibliográficas [1]

http://www.directxtutorial.com/Tutorial9/B-Direct3DBasics/dx9B.aspx

Último acesso 08/11/2009 17:30 hrs [2] jogos.uol.com.br Último acesso 10/11/2009 20:30