Curso completo de DirectX 9 com C\C++
Gameprog - Escola de programação de jogos digitais
Contato: gameprog.br@gmail.com
Fase 02-1
02.1 Investigando o adaptador gráfico
1.1 Visão geral
O objeto g_Direct3d produzido pela interface IDirect3D9 possui
métodos que permitem investigar as capacidades do adaptador gráfico.
Geralmente essa investigação sobre a placa de vídeo ocorre no início
da aplicação para determinar se a placa de vídeo oferece suporte
para as capacidades ou configurações específicas pretendidas. Caso a
capacidade ou configuração investigada não tenha suporte do hardware
deve-se tomar caminhos alternativos ou encerrar graciosamente a
aplicação. Um dos caminhos alternativos, especialmente para aplicações
de testes é utilizar o dispositivo de referência criado pela opção
D3DDEVTYPE_REF durante a criação do dispositivo renderizador g_device.
Alistamos abaixo alguns métodos de verificação do dispositivo que
serão testados por esta aplicação.
Método |
Descrição |
CheckDeviceType() |
Verifica se determinada configuração de dispositivo acelerado por hardware pode ser utilizada com o adaptador especificado. |
GetAdapterModeCount() |
Retorna o número de modos de vídeo disponíveis no adaptador para o formato especificado. A função EnumAdapterModes() é utilizada para acessar a configuração particular de cada modo de vídeo disponível. |
EnumAdapterModes() |
Esse método é utilizado em um loop para recuperar cada item de uma lista de modos de vídeo disponíveis dentro um formato específico. |
GetAdapterCount() |
Retorna o número de adaptadores no sistema. |
GetAdapterDisplayMode() |
Retorna informação do modo de vídeo corrente do adaptador. |
GetAdapterIdentifier() |
Obtém uma descrição geral do adaptador gráfico. |
GetDeviceCaps() |
Recupera informações específicas sobre as capacidades do adaptador gráfico |
1.2 Estrutura principal da aplicação
Arquivo: entrada.cpp
adaptador_exibirInfoGeral()
testa as funções:
GetAdapterIdentifier()
GetAdapterCount()
verificar_dispositivo()
testa a função CheckDeviceType()
mostrarcaps()
testa a função GetDeviceCaps()
adaptador_exibirVideoCorrente()
testa a função GetAdapterDisplayMode()
adaptador_exibirListaVideoOk()
testa as funções:
GetAdapterModeCount()
EnumAdapterModes()
esperar()
aplica uma pausa para leitura do conteúdo da janela
config_Janela()
faz a configuração inicial da janela de console
main()
inicializa o objeto Direct3d
chama todas as funções alistadas acima para verificar
algumas capacidades do adaptador gráfico.
2.1 Aspectos globais - Arquivo: entrada.cpp
// Projeto: prj_Adaptador - Arquivo: entrada.cpp
// Essa aplicação exemplifica como investigar as capacidades
// do adaptador gráfico. By www.gameprog.com.br
#include <windows.h>
#include <wincon.h>
#include <stdio.h>
#include <stdlib.h>
#include "d3d9.h"
#include "d3dx9.h"
// Bibliotecas do directx
#pragma comment (lib, "d3d9.lib")
#pragma comment (lib, "d3dx9.lib")
// Exibe informações gerais do adaptador gráfico
void adaptador_exibirInfoGeral(void);
// Exibe modo de vídeo corrente
void adaptador_exibirVideoCorrente(void);
// Exibe a lista de modos de vídeo disponíveis para o formato
// apresentado
void adaptador_exibirListaVideoOk(void);
// Exibe algumas capacidades do dispositivo gráfico
void mostrarcaps(void);
// Verifica a possibilidade de uma configuração específica do dispositivo
void verificar_dispositivo(void);
// Faz a configuração inicial da janela
void config_Janela(void);
// Pausa para leitura da tela
void esperar(void);
// Variáveis globais
// Representa o dispositivo D3D
LPDIRECT3D9 g_Direct3d = NULL;
// Variáveis para coletar o tamanho da resolução corrente
UINT g_xtela, g_ytela;
// Formato de vídeo
D3DFORMAT g_formato;
// Adaptador default(0)
UINT adaptador_default = D3DADAPTER_DEFAULT;
// Coleta de informação de erro do directx
HRESULT g_hr;
#include <wincon.h>
Esse arquivo de cabeçalho permite o uso de funções que manipulam a
janela de console.
void adaptador_exibirInfoGeral(void);
Esta função exibe informações gerais do adaptador de vídeo usando a
função
GetAdapterIdentifier().
void adaptador_exibirVideoCorrente(void);
Essa função exibe informações do modo de vídeo corrente utilizando a
função
GetAdapterDisplayMode().
void adaptador_exibirListaVideoOk(void);
Esta função exibe uma lista de modos de vídeo disponíveis dentro de
um formato especificado utilizando em conjunto as funções
GetAdapterModeCount() e
EnumAdapterModes().
void mostrarcaps(void);
Esta função mostra algumas capacidades do adaptador de vídeo; isso
envolve o uso da função
GetDeviceCaps().
void verificar_dispositivo(void);
Essa função verifica se é possível uma dada configuração do
dispositivo renderizador a ser criado. Essa verificação é feita com a
função
CheckDeviceType().
void config_Janela(void);
Essa função utiliza algumas funções do arquivo
wincon.h para
configurar algumas características da janela de console tais como
tamanho da memória interna (buffer) e o tamanho da janela.
void esperar(void);
Esta função adiciona uma pausa no programa para a leitura da tela.
A pausa é feita com a função
getchar() que aguarda a entrada de
dados do teclado.
UINT g_xtela, g_ytela;
D3DFORMAT g_formato;
UINT adaptador_default = D3DADAPTER_DEFAULT;
Estas variáveis são usadas para coletar informações sobre o adaptador
de vídeo tais como resolução do modo de vídeo entre outras informações.
2.2 A função main()
Segue abaixo a listagem da função
main(). As funções chamadas por ela
foram descritas acima de maneira geral e são melhor detalhadas nos
subtópicos que estão adiante.
int main(void)
{
// Cria o objeto Direct3D
g_Direct3d = Direct3DCreate9( D3D_SDK_VERSION);
// Verifica se objeto Direct3D foi criado
if(g_Direct3d == NULL)
{
MessageBox (NULL,
"Falha na inialização do Direct3D", "main()", MB_OK);
return E_FAIL;
} // endif
// Configura a janela
config_Janela();
// Exibe informações gerais do adaptador
adaptador_exibirInfoGeral();
// Exibe o modo de vídeo corrente
adaptador_exibirVideoCorrente();
// Exibe uma lista de modos de vídeo disponíveis para o formato
// apresentado.
adaptador_exibirListaVideoOk();
// Mostra algumas capacidades do dispositivo
mostrarcaps();
// Testa uma possibilidade de configuração para o dispositivo
verificar_dispositivo();
// Finaliza a aplicação
esperar();
g_Direct3d->Release();
} // main().fim
2.3 Descrição geral do adaptador gráfico
void adaptador_exibirInfoGeral(void)
{
// Estrutura para coletar informações gerais do adaptador gráfico
D3DADAPTER_IDENTIFIER9 placaVideo;
// Coleta informações sobre o adaptador
g_hr = g_Direct3d->GetAdapterIdentifier( adaptador_default,
0, &placaVideo);
// Espaços em branco para manter a boa estética do console
printf("\n");
// Mostra descrição e o arquivo de driver de vídeo
printf(" %s \n", placaVideo.Description);
printf(" %s \n", placaVideo.Driver);
// Verifica a quantidade de adaptadores no sistema
UINT nAdaptadores = 0;
nAdaptadores = g_Direct3d->GetAdapterCount();
printf (" Número de adaptadores de vídeo: %i \n", nAdaptadores);
} // adaptador_exibirInfoGeral().fim
D3DADAPTER_IDENTIFIER9 placaVideo;
Esta estrutura agrega elementos que descrevem de forma geral um
adaptador de vídeo com informações tais como descrição (
Description)
e dll do driver (
Driver) entre outras.
g_hr = g_Direct3d->GetAdapterIdentifier( adaptador_default, 0, &placaVideo);
Esta função preenche a estrutura
D3DADAPTER_IDENTIFIER9 descrita acima
com informações gerais do adaptador de vídeo.
// Mostra descrição e o arquivo de driver de vídeo
printf(" %s \n", placaVideo.Description); printf(" %s \n", placaVideo.Driver);
Aqui mostramos as informações coletadas.
UINT nAdaptadores = 0;
nAdaptadores = g_Direct3d->GetAdapterCount();
printf (" Número de adaptadores de vídeo: %i \n", nAdaptadores);
Aqui verificamos e mostramos a quantidade de adaptadores de vídeo
instalados no sistema. Pode ocorrer de um computador apresentar duas
placas de vídeo ou ter uma placa de vídeo com circuitos independentes
para controlar dois monitores.
2.4 Informações do modo de vídeo corrente
void adaptador_exibirVideoCorrente(void)
{
// Estrutura para a coleta de informações sobre o modo de vídeo
// corrente
D3DDISPLAYMODE video;
// Coleta informações sobre o modo de vídeo
g_Direct3d->GetAdapterDisplayMode (adaptador_default, &video);
// Transfere essas informações para as variáveis
g_xtela = video.Width;
g_ytela = video.Height;
g_formato = video.Format;
// Exibe as informações
printf(" Modo de video corrente: (%i, %i) Formato: %i \n",
g_xtela, g_ytela, g_formato);
} // adaptador_exibirVideoCorrente().fim
D3DDISPLAYMODE video;
Esta estrutura agrega elementos que descrevem um modo de vídeo tais
como largura (
width), altura (
height) e formato da composição do
pixel.
g_Direct3d->GetAdapterDisplayMode (adaptador_default, &video);
Essa função preenche a estrutura
D3DDISPLAYMODE (
&video) com
informação do modo de vídeo corrente.
g_xtela = video.Width;
g_ytela = video.Height;
g_formato = video.Format;
Aqui transferimos as informações do modo de vídeo corrente para as
variáveis de trabalho.
printf(" Modo de video corrente: (%i, %i) Formato: %i \n",
g_xtela, g_ytela, g_formato);
Aqui mostramos as informações do modo de vídeo corrente.
2.5 Lista de modos de video disponíveis para um formato
void adaptador_exibirListaVideoOk(void)
{
// Variável para guardar a quantidade de modos de vídeo
// disponíveis dentro de um formato
UINT nQtd = 0;
// Estrutura com informações básica do modo de vídeo
D3DDISPLAYMODE video;
// Obtém a quantidade de modos de vídeo no formato apresentado
nQtd = g_Direct3d->GetAdapterModeCount( adaptador_default, g_formato);
// Esta linha exibe o valor numérico do formato apresentado.
printf(" \n\n Modos de video disponivel no formato %i \n", g_formato);
// Mostra as informações dos modos de vídeo disponíveis no formato
for (UINT ncx=0; ncx < nQtd; ncx++)
{
// Obtém informação do modo de vídeo apontado por ncx
g_hr = g_Direct3d->EnumAdapterModes(adaptador_default, g_formato, ncx, &video);
//Transfere as informações para as variáveis
g_xtela = video.Width;
g_ytela = video.Height;
g_formato = video.Format;
// Exibe a informação
printf(" %i x %i \n", g_xtela, g_ytela);
} // endfor
} // adaptador_exibirListaVideoOk().fim
UINT nQtd = 0;
Esta variável é usada para guardar a quantidade de modos de vídeo
disponíveis dentro de um formato especificado na função
GetAdapterModeCount().
// Estrutura com informações básica do modo de vídeo
D3DDISPLAYMODE video;
Esta estrutura agrega elementos que descrevem um modo de vídeo tais
como largura (
width), altura (
height) e formato da composição do
pixel (
format ).
nQtd = g_Direct3d->GetAdapterModeCount( adaptador_default, g_formato);
Esta linha obtém a quantidade de modos de vídeo no formato apresentado.
// Mostra as informações dos modos de vídeo disponíveis no formato
for (UINT ncx=0; ncx < nQtd; ncx++)
{
// Obtém informação do modo de vídeo apontado por ncx
g_hr = g_Direct3d->EnumAdapterModes(adaptador_default, g_formato, ncx, &video);
//Transfere as informações para as variáveis
g_xtela = video.Width;
g_ytela = video.Height;
g_formato = video.Format;
// Exibe a informação
printf(" %i x %i \n", g_xtela, g_ytela);
} // endfor
Este bloco de código perpassa por todos os modos de vídeo
disponíveis localizados para o formato apresentado e exibe a
configuração de cada um deles.
2.6 Configuração de criação do dispositivo renderizador
void verificar_dispositivo(void)
{
// Resultado da vericação
bool resultado = false;
// Argumentos de trabalho do método CheckDeviceType()
D3DDEVTYPE tipo_hardware = D3DDEVTYPE_HAL;
D3DFORMAT videoFormato = D3DFMT_X8R8G8B8;
D3DFORMAT backbufferFormato = videoFormato;
// Vai ter janela? sim (true) ou não(false).
bool telaCheia = false;
// Verifica se a configuração passada é possível
g_hr = g_Direct3d->CheckDeviceType( adaptador_default, tipo_hardware,
videoFormato, backbufferFormato, telaCheia );
// Verifica o resultado retornado
if(SUCCEEDED(g_hr) ) resultado = true;
if(FAILED (g_hr) ) resultado = false;
// Exibe resultado
printf("\n");
if (resultado)
printf(" Aplicação em tela cheia Ok para o formato X8R8G8B8 no hardware!");
if (!resultado)
printf(" Configuração impraticável \n");
return;
} // verificar_dispositivo().fim
// Resultado da vericação
bool resultado = false;
O valor final desta variável vai espelhar o resultado positivo ou
negativo da verificação da configuração do dispositivo renderizador
dada na função
CheckDeviceType().
D3DDEVTYPE tipo_hardware = D3DDEVTYPE_HAL;
D3DFORMAT videoFormato = D3DFMT_X8R8G8B8;
D3DFORMAT backbufferFormato = videoFormato;
// Vai ter janela? sim (true) ou não(false).
bool telaCheia = false;
Estas variáveis representam os argumentos de criação do dispositivo
renderizador como já vimos nos tópicos anteriores. Neste caso aqui é
a configuração particular que vai ser testada se é possível ou não no
adaptador gráfico default (0).
g_hr = g_Direct3d->CheckDeviceType( adaptador_default, tipo_hardware,
videoFormato, backbufferFormato, telaCheia );
Aqui a função
CheckDeviceType() faz o trabalho de verificar se
configuração passada é possível ou não.
if(SUCCEEDED(g_hr) ) resultado = true;
if(FAILED (g_hr) ) resultado = false;
Aqui verificamos o resultado retornado e configuramos apropriadamente
a variável
resultado.
if (resultado)
printf(" Aplicação em tela cheia Ok para o formato X8R8G8B8 no hardware!");
if (!resultado) printf(" Configuração impraticável \n");
Exibimos na sequência o resultado.
2.7 Capacidades específicas do adaptador gráfico
void mostrarcaps(void)
{
printf("\n");
// Estrutura que alista as capacidades possíveis de um
// adaptador gráfico.
D3DCAPS9 caps;
// Limpa a estrutura
ZeroMemory(&caps, sizeof (D3DCAPS9) );
// Obtém as capacidades do adaptador gráfico
g_hr = g_Direct3d->GetDeviceCaps(adaptador_default, D3DDEVTYPE_HAL, &caps);
// Verifica se ocorreu alguma falha no processo...
if( FAILED(g_hr))
{
MessageBox (NULL, "Falha no processo", "mostrarcaps()", MB_OK);
return;
} // endif
// Mostra a versão do pixelshader e do vertexshader
printf (" VertexShaderVersion: %X \n", caps.VertexShaderVersion);
printf (" PixelShaderVersion : %X \n", caps.PixelShaderVersion);
// Quantidade máxima de luzes ativas simultaneamente
printf (" MaxActiveLights : %i \n", caps.MaxActiveLights);
printf("\n");
// Mostra algumas capacidades sobre linhas
DWORD linecaps = caps.LineCaps;
printf(" LineCaps %X: \n", linecaps);
if((linecaps & D3DLINECAPS_ANTIALIAS) > 0) printf(" D3DLINECAPS_ANTIALIAS Ok \n");
if((linecaps & D3DLINECAPS_BLEND) > 0) printf(" D3DLINECAPS_BLEND Ok \n");
if((linecaps & D3DLINECAPS_TEXTURE) > 0) printf(" D3DLINECAPS_TEXTURE Ok \n");
} // mostrarcaps().fim
D3DCAPS9 caps;
Esta estrutura é gigantesca e agrega elementos que descrevem todas as
capacidades e característias possíveis em um adaptador gráfico.
ZeroMemory(&caps, sizeof (D3DCAPS9) );
Limpamos a estrutura.
g_hr = g_Direct3d->GetDeviceCaps(adaptador_default, D3DDEVTYPE_HAL, &caps);
Aqui a função
GetDeviceCaps() preenche a estrutura
caps com as
capacidades e características do adaptador gráfico default (0).
printf (" VertexShaderVersion: %X \n", caps.VertexShaderVersion);
printf (" PixelShaderVersion : %X \n", caps.PixelShaderVersion);
Aqui verificamos a versão do
VertexShader e do
PixelShader da placa
de vídeo. O vertexshader e o pixelshader são chamados de shaders em
conjunto e representam o aspecto programável da placa de vídeo que
definem a posição final do vértice e a cor final do pixel na tela. A
partir do directx9 os shaders são produzidos na linguagem
HLSL que
tem uma grande semelhança com a linguagem C.
printf (" MaxActiveLights : %i \n", caps.MaxActiveLights);
Aqui é relatado a quantidade máxima de luzes que podem estar ativas
simultaneamente na cena.
DWORD linecaps = caps.LineCaps;
printf(" LineCaps %X: \n", linecaps);
if((linecaps & D3DLINECAPS_ANTIALIAS) > 0) printf(" D3DLINECAPS_ANTIALIAS Ok \n");
if((linecaps & D3DLINECAPS_BLEND) > 0) printf(" D3DLINECAPS_BLEND Ok \n");
if((linecaps & D3DLINECAPS_TEXTURE) > 0) printf(" D3DLINECAPS_TEXTURE Ok \n");
Aqui é exibido algumas capacidades sobre a produção de linhas.
2.8 Configuração inicial da janela
void config_Janela(void)
{
// Configura cor e título da janela
system("color f1");
SetConsoleTitle ("prj_Adaptador");
// Obtém o handle de escrita do console.
HANDLE hJanela = GetStdHandle(STD_OUTPUT_HANDLE);
// Configura tamanho do buffer do console
COORD bufferTam = {80, 90};
SetConsoleScreenBufferSize( hJanela, bufferTam);
// Configura tamanho da janela
SMALL_RECT janelaTam = { 0, 0, 79, 29 };
SetConsoleWindowInfo(hJanela, TRUE, &janelaTam);
// Permite a boa acentuação em português.
SetConsoleOutputCP(1252);
printf("\n");
} // config_Janela().fim
system("color f1");
Configura a cor da tela em branco (f) para o fundo e azul (1) para a
frente.
SetConsoleTitle ("prj_Adaptador");
Configura a barra de título da janela.
HANDLE hJanela = GetStdHandle(STD_OUTPUT_HANDLE);
Aqui é obtido o handle de escrita da janela que é argumento de várias
funções que alteram as características de funcionamento da janela
de console.
COORD bufferTam = {80, 90};
Esta estrutura traz a quantidade de colunas (80) e linhas (90) para a
configuração da memória interna (buffer) da janela de console. Esses
valores estão expressos em quantidade de caracteres que cabem na
tela, ou seja 90 linhas com 80 caracteres horizontais.
SetConsoleScreenBufferSize( hJanela, bufferTam);
Aqui o tamanho do buffer da janela de console é configurado de fato
com a estrutura
bufferTam.
SMALL_RECT janelaTam = {0, 0, 79, 29 };
Esta estrutura traz a quantidade de colunas (79) e linhas (29) que
definem conjuntamente a largura e altura final da janela de console.
É importante destacar que o tamanho da janela deve ser menor que o
tamanho do buffer em pelo menos 1 carácter tanto na largura como na
altura.
SetConsoleWindowInfo(hJanela, TRUE, &janelaTam);
Aqui de fato o tamanho da janela é configurada.
SetConsoleOutputCP(1252);
Esta função configura a página de caracteres que permite a utilização
de caracteres acentuados.
3. Código fonte do projeto de exemplo: prj_Adaptador
// Projeto: prj_Adaptador - Arquivo: entrada.cpp
// Essa aplicação exemplifica como investigar as capacidades
// do adaptador gráfico. By www.gameprog.com.br
#include <windows.h>
#include <wincon.h>
#include <stdio.h>
#include <stdlib.h>
#include "d3d9.h"
#include "d3dx9.h"
// Bibliotecas do directx
#pragma comment (lib,
"d3d9.lib")
#pragma comment (lib,
"d3dx9.lib")
// Exibe informações gerais do adaptador gráfico
void adaptador_exibirInfoGeral(
void);
// Exibe modo de vídeo corrente
void adaptador_exibirVideoCorrente(
void);
// Exibe a lista de modos de vídeo disponíveis para o formato
// apresentado
void adaptador_exibirListaVideoOk(
void);
// Exibe algumas capacidades do dispositivo gráfico
void mostrarcaps(
void);
// Verifica a possibilidade de uma configuração específica do dispositivo
void verificar_dispositivo(
void);
// Faz a configuração inicial da janela
void config_Janela(
void);
// Pausa para leitura da tela
void esperar(
void);
// Variáveis globais
// Representa o dispositivo D3D
LPDIRECT3D9 g_Direct3d =
NULL;
// Variáveis para coletar o tamanho da resolução corrente
UINT g_xtela, g_ytela;
// Formato de vídeo
D3DFORMAT g_formato;
// Adaptador default(0)
UINT adaptador_default =
D3DADAPTER_DEFAULT;
// Coleta de informação de erro do directx
HRESULT g_hr;
int main(
void)
{
// Cria o objeto Direct3D
g_Direct3d =
Direct3DCreate9(
D3D_SDK_VERSION);
// Verifica se ocorreu alguma falha no processo...
if(g_Direct3d ==
NULL)
{
MessageBox (
NULL,
"Falha na inialização do Direct3D",
"main()
",
MB_OK);
return E_FAIL;
} // endif
// Configura a janela
config_Janela();
// Exibe informações gerais do adaptador
adaptador_exibirInfoGeral();
// Exibe o modo de vídeo corrente
adaptador_exibirVideoCorrente();
// Exibe uma lista de modos de vídeo disponíveis para o formato
// apresentado.
adaptador_exibirListaVideoOk();
// Mostra algumas capacidades do dispositivo
mostrarcaps();
// Testa uma possibilidade de configuração para o dispositivo
verificar_dispositivo();
// Finaliza a aplicação
esperar();
g_Direct3d->Release();
} // main().fim
void adaptador_exibirInfoGeral(
void)
{
// Estrutura para coletar informações gerais do adaptador gráfico
D3DADAPTER_IDENTIFIER9 placaVideo;
// Coleta informações sobre o adaptador
g_hr =
g_Direct3d->GetAdapterIdentifier( adaptador_default,
0, &placaVideo);
// Espaços em branco para manter a boa estética do console
printf(
"\n");
// Mostra descrição e o arquivo de driver de vídeo
printf(
" %s \n",
placaVideo.Description);
printf(
" %s \n",
placaVideo.Driver);
// Verifica a quantidade de adaptadores no sistema
UINT nAdaptadores =
0;
nAdaptadores =
g_Direct3d->GetAdapterCount();
printf (
" Número de adaptadores de vídeo: %i \n", nAdaptadores);
} // adaptador_exibirInfoGeral().fim
void adaptador_exibirVideoCorrente(
void)
{
// Estrutura para a coleta de informações sobre o modo de vídeo
// corrente
D3DDISPLAYMODE video;
// Coleta informações sobre o modo de vídeo
g_Direct3d->GetAdapterDisplayMode (adaptador_default, &video);
// Transfere essas informações para as variáveis
g_xtela =
video.Width;
g_ytela =
video.Height;
g_formato =
video.Format;
// Exibe as informações
printf(
" Modo de video corrente: (%i, %i)
Formato: %i \n",
g_xtela, g_ytela, g_formato);
} // adaptador_exibirVideoCorrente().fim
void adaptador_exibirListaVideoOk(
void)
{
// Variável para guardar a quantidade de modos de vídeo
// disponíveis dentro de um formato
UINT nQtd =
0;
// Estrutura com informações básica do modo de vídeo
D3DDISPLAYMODE video;
// Obtém a quantidade de modos de vídeo no formato apresentado
nQtd =
g_Direct3d->GetAdapterModeCount( adaptador_default, g_formato);
// Esta linha exibe o valor numérico do formato apresentado.
printf(
" \n\n Modos de video disponivel no formato %i \n", g_formato);
// Mostra as informações dos modos de vídeo disponíveis no formato
for (
UINT ncx=0; ncx < nQtd; ncx++)
{
// Obtém informação do modo de vídeo apontado por ncx
g_hr =
g_Direct3d->EnumAdapterModes(adaptador_default, g_formato, ncx, &video);
//Transfere as informações para as variáveis
g_xtela =
video.Width;
g_ytela =
video.Height;
g_formato =
video.Format;
// Exibe a informação
printf(
" %i x %i \n", g_xtela, g_ytela);
} // endfor
} // adaptador_exibirListaVideoOk().fim
void verificar_dispositivo(
void)
{
// Resultado da vericação
bool resultado =
false;
// Argumentos de trabalho do método CheckDeviceType()
D3DDEVTYPE tipo_hardware =
D3DDEVTYPE_HAL;
D3DFORMAT videoFormato =
D3DFMT_X8R8G8B8;
D3DFORMAT backbufferFormato = videoFormato;
// Vai ter janela? sim (true) ou não(false).
bool telaCheia =
false;
// Verifica se a configuração passada é possível
g_hr =
g_Direct3d->CheckDeviceType( adaptador_default, tipo_hardware,
videoFormato, backbufferFormato, telaCheia );
// Verifica o resultado retornado
if(
SUCCEEDED(g_hr) ) resultado =
true;
if(
FAILED (g_hr) ) resultado =
false;
// Exibe resultado
printf(
"\n");
if (resultado)
printf(
" Aplicação em tela cheia Ok para o formato X8R8G8B8 no hardware!");
if (!resultado)
printf(
" Configuração impraticável \n");
return;
} // verificar_dispositivo().fim
void mostrarcaps(
void)
{
printf(
"\n");
// Estrutura que alista as capacidades possíveis de um
// adaptador gráfico.
D3DCAPS9 caps;
// Limpa a estrutura
ZeroMemory(&caps,
sizeof (
D3DCAPS9) );
// Obtém as capacidades do adaptador gráfico
g_hr =
g_Direct3d->GetDeviceCaps(adaptador_default,
D3DDEVTYPE_HAL, &caps);
// Verifica se ocorreu alguma falha no processo...
if(
FAILED(g_hr))
{
MessageBox (
NULL,
"Falha no processo",
"mostrarcaps()
",
MB_OK);
return;
} // endif
// Mostra a versão do pixelshader e do vertexshader
printf (
" VertexShaderVersion: %X \n",
caps.VertexShaderVersion);
printf (
" PixelShaderVersion : %X \n",
caps.PixelShaderVersion);
// Quantidade máxima de luzes ativas simultaneamente
printf (
" MaxActiveLights : %i \n",
caps.MaxActiveLights);
printf(
"\n");
// Mostra algumas capacidades sobre linhas
DWORD linecaps =
caps.LineCaps;
printf(
" LineCaps %X: \n", linecaps);
if((linecaps &
D3DLINECAPS_ANTIALIAS) >
0) printf(
" D3DLINECAPS_ANTIALIAS Ok \n");
if((linecaps &
D3DLINECAPS_BLEND) >
0) printf(
" D3DLINECAPS_BLEND Ok \n");
if((linecaps &
D3DLINECAPS_TEXTURE) >
0) printf(
" D3DLINECAPS_TEXTURE Ok \n");
} // mostrarcaps().fim
void esperar(
void)
{
// Aguarda o pressionamento da tecla ENTER para continuar
printf(
"\n\n");
printf(
" Pressione ENTER para continuar \n");
getchar();
} // esperar().fim
void config_Janela(
void)
{
// Configura cor e título da janela
system(
"color f1");
SetConsoleTitle (
"prj_Adaptador");
// Obtém o handle de escrita do console.
HANDLE hJanela =
GetStdHandle(
STD_OUTPUT_HANDLE);
// Configura tamanho do buffer do console
COORD bufferTam = {80, 90};
SetConsoleScreenBufferSize( hJanela, bufferTam);
// Configura tamanho da janela
SMALL_RECT janelaTam = {
0, 0, 79, 29 };
SetConsoleWindowInfo(hJanela,
TRUE, &janelaTam);
// Permite a boa acentuação em português.
SetConsoleOutputCP(1252);
printf(
"\n");
} // config_Janela().fim