visão geral parte da api directx da microsoft [1] disponível a partir do windows 95 utilizado...
TRANSCRIPT
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
[2]
Características Z-buffering Anti-aliasing Composição alfa MipMaping Efeitos de atmosfera Mapeamento de textura em perspectiva
API API 3D Contém vários comandos de
renderização 3D Contém comandos de renderização 2D
também
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
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
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
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);
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);}
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}
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}
Resultado
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
1 // define the screen resolution
#define SCREEN_WIDTH 800#define SCREEN_HEIGHT 600
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);
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);
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
Desenhando um triângulo Flexible vertex formats
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)
Estrutura do Vértice struct CUSTOMVERTEX
{ FLOAT x, y, z, rhw; // from the D3DFVF_XYZRHW flag DWORD color; // from the D3DFVF_DIFFUSE flag}
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),},};
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);
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()
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
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);}
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}
Triângulo
Projeto 2 Display: Direct3D Sons: FMOD TAG mp3: id3lib
Display: Direct3D - 1
Utilizado um vertexbuffer para desenhar tudo.Foi utilizado a propriedade DYNAMIC para
customizar detalhes dos vertices.
Display: Direct3D - 2
Criando VertexBuffer:
Display: Direct3D - 2 Desenhando:
Display: Direct3D - 2 Desenhando:
Todas as texturas utilizam essa função para serem desenhadas, só mudando os valores dos parâmetros!
Projeto 2 – Tela inicial
Loading utilizando threads. Para que isso seja possível, setar D3DCREATE_MULTITHREADED no CreateDevice().
Projeto 2 – Tela inicial - Código
Projeto 2 – Tela inicial – Código – Parte 1Código que chama a thread:
Projeto 2 – Tela inicial – Código – Parte 2Código da thread:
Projeto 2 – Tela inicial – Código – Parte 3
Projeto 2 – Tela Principal
Projeto 2 – Tela Principal
Interações com usuário em Vermelho.
Projeto 2 – Tela Principal - Video
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