Ir para conteúdo
Faça parte da equipe! (2024) ×
Conheça nossa Beta Zone! Novas áreas a caminho! ×
  • Quem está por aqui   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.

[D3D/C++]Desenhando um Triangulo


AceStryker
 Compartilhar

Posts Recomendados

Você que já esta lendo este tutorial já sabe as primeiras noções do DirectX e agora é a hora de começar a desenhar!Hoje vamos desenhar um triangulo, e manda o directX jogar ele na tela.Acho que até agora esse será o melhor tutorial...

 

Vertex Flexível

A vertex como você deve lembrar(caso tenha lido o artigo passado) é um ponto no plano cartesiano, vamos usar 3 desses para desenhar nosso triangulo, e também definiremos suas propriedades.

O DirectX usa a tecnologia FVF(Flexible Vertex Format) para desenhar seus vertexes, isso é, Vertex Format é o layout e as propriedades do vertex, e flexible pois ele pode ser modificado por você do modo que precisar.Para mostrar o que o FVF possibilita, vamos olhar este exemplo:

 

dx9B4-1.PNG

 

Aqui é o ato que a classe do vertex mandando suas informações para a video ram que depois mandará as informações para o backbuffer que será trocado para o front buffer e aparecerá na sua tela, mas agora você não esta vendo o problema certo?Vejamos esta outra imagem

 

dx9B4-2.PNG

 

No caso de não precisarmos enviar todas as informações, com o FVF mandaremos apenas as informações usadas, com isso percebemos que iria agilizar muito o processo, e é por isso que usaremos o FVF

 

FVF nos códigos

Para arrumar os códigos para fazer um FVF precisamos certas flags e isto que faremos agora:

É necessário se cadastrar para acessar o conteúdo.

Caso queira ver as outras flags,

É necessário se cadastrar para acessar o conteúdo.

 

D3DFVF_XYZRHW esta flag diz que além de usarmos a localização do vertex(XYZ) usaremos RHW

D3DFVF_DIFFUSE diz que a cor do vertex terá 32 bits.

 

Nos próximos artigos eu usarei outras flags mas por agora é só essa....

 

Criando suas vértices

 

Diferente do que você deve pensar, não usaremos funções a princípio para criar nossa vértice mas sim uma structure, baseando-se nas flags que usaremos, vejamos o code:

 

É necessário se cadastrar para acessar o conteúdo.

 

Agora para deixar organizado acho que vocês devem criar uma função chamada InitGraphics() para começar os desenhos que deve ser chamada no final da InitD3D().

Agora vamos adicionar nossas 3 vértices na memória, farei deste modo aqui:

É necessário se cadastrar para acessar o conteúdo.

 

Pronto, temos ela agora na memória agora precisamos aprender um jeito de joga-la para desenho, vamos ver isso agora!

 

Buffers de Vertex

Agora que já temos nosso triangulo na memória do programa precisamos exporta-lo para a video ram(no caso de não ter uma específica ele manda para a do sistema mesmo) e para isso criamos um buffer de vertex que é nada mais nada menos que um buffer que guarda informações de vertexes e models, e para isso vamos usar uma função chamada

É necessário se cadastrar para acessar o conteúdo.

 

Para ajudar os preguiçosos eu vou explicar os parâmetros dela aqui então se não quiser ler no MSDN não precisa :)

 

É necessário se cadastrar para acessar o conteúdo.

 

Length é o tamanho do buffer que será criado.Para pegarmos o tamanho é só quantas structures usamos e multiplicar pelo tamanho dela, tipo assim:

sizeof(CUSTOMVERTEX) * 3

 

Usage é uma propriedade que serve para modificar o modo que o D3D controlará o vertex, mas no caso de agora não o usaremos

 

FVF é o local onde colocaremos nossas flags (CUSTOMFVF)

 

Pool é o modo que o D3D guardará seu buffer, para mais informações acesse

É necessário se cadastrar para acessar o conteúdo.

 

ppVertexBuffer é o pointer do buffer que estamos criando, vamos colocar um pointer vázio que a função o arrumará para nós.

 

pSharedHandle deve sempre ficar em NULL

 

É necessário se cadastrar para acessar o conteúdo.

 

Agora precisamos dar lock (trancar) nesse buffer para que o DirectX não deixe outros processos o acessarem e para que a placa de video não mova ele de lugar, para isso usamos a função

É necessário se cadastrar para acessar o conteúdo.

 

É necessário se cadastrar para acessar o conteúdo.

 

OffsetToLock e SizeToLock é usado para quando precisamos dar lock em apenas uma parte do buffer, mas como queremos dar lock nele inteiro estes são irrelevantes

 

ppbData Aqui fica o pointer da localização da memória a ser trancada

 

Flags é para mais artigos avançados, para mais informações

É necessário se cadastrar para acessar o conteúdo.

 

É necessário se cadastrar para acessar o conteúdo.

 

Agora que esta tudo pronto, podemos mover nosso triangulo para a memória de vídeo, para isso podemos usar CopyMemory() ou memcpy, ai fica com você qual você escolhe, vejamos como fica:

 

É necessário se cadastrar para acessar o conteúdo.

 

E para finalizar esta parte vamos falar para o DirectX que não precisamos ter a memória no pBuffer trancada, para isso usamos a função UnLock() não passarei o link dela na MSDN pois ela nem parâmetros tem...

 

É necessário se cadastrar para acessar o conteúdo.

 

Acabamos então nossa função InitGraphics, sugiro que leia a função novamente e veja se entendeu tudo nela.

 

É necessário se cadastrar para acessar o conteúdo.

 

Pronto, já leu?Então estamos prontos para mexer na renderização agora!

 

Desenhando os Primitives

Para desenhar o que queremos agora vamos usar basicamente 3 funções novas,

É necessário se cadastrar para acessar o conteúdo.
,
É necessário se cadastrar para acessar o conteúdo.
e
É necessário se cadastrar para acessar o conteúdo.

 

  • SetFVF()
    A SetFVF() tem este parâmetro:
    É necessário se cadastrar para acessar o conteúdo.


     
    Ela serve para dizer ao DirectX qual FVF vamos usar agora, o FVF é o parâmetro que deve ser carregado com as flags, devemos usar as mesmas que usamos no CreateVertexBuffer():
     

  • SetStreamSource()
    Agora o SetStreamSource() serve para falar para o DirectX qual buffer estaremos usando para o desenho.Ele tem alguns parâmetros, vamos entende-los agora:
     
    É necessário se cadastrar para acessar o conteúdo.


     
    O StreamNumber pede o número da stream que usaremos, aprenderemos isto depois por agora só saiba que você deve colocar 0 nisto.
    O pStreamData é o local onde colocaremos o ponteiro para o buffer do vertex(pBuffer)
    O OffsetInBytes é os bytes do offset de onde começaremos o desenho do nosso buffer(em caso de ter mais de um desenho no buffer), o nosso como é do começo será 0
    O Stride é o tamanho de cada vertex no buffer, no nosso caso é sizeof(CUSTOMVERTEX)
     

  • DrawPrimitive()
    Vejamos o DrawPrimitive(), ele serve para pegar o buffer e desenha-lo na tela
    É necessário se cadastrar para acessar o conteúdo.


     
    O PrimitiveType foi comentado no artigo passado lembra?Aqui esta a tabela de possibilidades:

    É necessário se cadastrar para acessar o conteúdo.

     
    O StartVertex é o index do primeiro vertex(lembra que é ordem horária hein)
     
    PrimitiveCount é o número de primitives que desenharemos, como vamos usar um triangulo colocamos 1, mas caso queira fazer por exemplo um triangulo com linhas você deve usar 3 entende?

 

E finalmente, ao código!

É necessário se cadastrar para acessar o conteúdo.

 

Acabou o desenho, caso queira apertar F9 e ve-lo é possível mas vamos ter que fazer uma outra coisa, vamos liberar o desenho da memória quando fecharmos o programa, apenas adicione esta linha na função CleanD3D()

É necessário se cadastrar para acessar o conteúdo.

 

E por fim, o código inteiro:

 

É necessário se cadastrar para acessar o conteúdo.

 

Acabamos!Uma ultima coisa, você deve estar se perguntando porque o triangulo esta colorido, é porque colocamos lá no começo 3 vertexes com 3 cores direfentes e o DirectX na hora de desenhar faz essa "transição" automático ;)

 

Créditos:

AceStryker & DirectXTutorial pelas imagens

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Este tópico está impedido de receber novos posts.
 Compartilhar

×
×
  • Criar Novo...

Informação Importante

Nós fazemos uso de cookies no seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies , caso contrário, vamos supor que você está bem para continuar.