Archive

Archive for the ‘Artigos’ Category

Tutorial: Pixel Shader no XNA

O pipeline programável permite substituir etapas do pipeline gráfico (uma série de passos feitas por uma API gráfica para renderizar objetos gráficos) por um código personalizado. Pode-se alterar tanto o código de processamento de vértices (vertex shader) quanto de pixels (pixel shader).

Este código é executado na GPU e possibilita, por exemplo, alterar o modelo de iluminação de uma malha tridimensional. Assim, é possível obter materiais distintos e fazer com que uma roupa tenha uma aparência diferente da pele do personagem, algo que não era possível no pipeline fixo.

Uma grande vantagem da utilização de shaders é que sua execução é feita diretamente em GPU. Além das placas gráficas terem diversas operações comuns à computação gráfica (como soma de vetores e matrizes) implementadas diretamente em hardware, as GPUs mais recentes possuem diversos processadores paralelos que permitem processar vários vértices ou fragmentos ao mesmo tempo, tornando o processo ainda mais rápido.

Em um programa tridimensional, geralmente se usa uma combinação de um vertex shader e um pixel shader. Primeiramente os vértices da malha dos objetos 3D são processados pelo vertex shader e cada pixel que compõe a superfície destes objetos é processado pelo pixel shader. Neste tutorial eu vou focar somente no pixel shader, portanto o processamento será feito sobre imagens bidimensionais. Este tipo de shader é útil tanto em jogos 2D quanto para aplicar efeitos de pós-processamento em jogos 3D, onde primeiro o jogo é renderizado para uma textura e depois o processamento é feito sobre esta textura para só então o resultado final ser mostrado na tela.

No passado, os shaders eram programados em assembly, mas depois surgiram linguagens parecidas com o C, como o HLSL (usado no DirectX e XNA, GLSL (usado no OpenGL) e o CG. Os exemplos mostrados aqui foram desenvolvidos em HLSL, mas a sintaxe destas linguagens é bem parecida e traduzir de uma para outra não é muito complicado.

Utilizar um pixel shader no XNA é um processo bem simples. Na verdade, quando usamos a classe SpriteBatch já estamos usando um shader (o XNA não aceita o pipeline fixo por motivo de compatibilidade com o Xbox 360), mas esta classe nos permite abstrair seu uso. Aqui nós continuaremos usando o SpriteBatch, aplicando o shader sobre ele.

Para começar, podemos criar um novo shader no Visual Studio. Isto é efeito com um clique direito no sub-projeto Content e selecionando Add -> New Item -> Effect File. O modelo fornecido pelo XNA oferece um pixel e um vertex shader prontos. Caso alguém tenha a curiosidade de aplicá-lo a um objeto, ele irá projetar o modelo e alterar sua cor para vermelho.

Veremos dois exemplos aqui. O primeiro deles irá inverter as cores da textura e o outro irá convertê-la para escala de cinza. Em ambos os casos não usaremos o vertex shader. Para não confundir, vamos apagar o código padrão do XNA e começar nosso shader do zero.

O primeiro passo é criar uma estrutura de entrada para o pixel shader. Esta estrutura é passada automaticamente pelo vertex shader e os valores devem possuir uma semântica para que o programa saiba interpretá-los corretamente. A semântica pode ser uma coordenada de textura, cor, posição, etc. Aqui vamos precisar somente da cor e da coordenada de textura. A cor é aquele valor passado no SpriteBatch (geralmente branco) e a coordenada de textura é a coordenada a imagem referente a cada pixel desenhado na tela.

struct PixelShaderInput
{
    float4 Color : COLOR;
    float2 TextureCoord : TEXCOORD0;
};

Também é necessário declarar uma textura e um sampler (amostrador) de textura usado pelo SpriteBatch para acessar a imagem. A textura é declarada como extern porque ela vai ser declarada de fato no SpriteBatch. O TextureSampler permite acessar os texels da textura em questão.

uniform extern texture InputTexture;	

sampler TextureSampler = sampler_state
{
	Texture = < InputTexture > ;
};

Feito isso, criamos nossa função de pixel. Basta escrever uma função que receba a estrutura criada acima como parâmetro. Esta função deve retornar um float4, que é um vetor de quatro posições usado para representar uma cor RGBA. Isto porque, na verdade, depois desta etapa o pixel nada mais é que uma cor. Repare a semântica da função (COLOR0) indicando que o retorno é uma cor.

float4 PixelShaderFunction(PixelShaderInput input) : COLOR0
{
    // TODO: add your pixel shader code here.
}

Agora podemos fazer um cálculo que será executado pelo pixel shader. No primeiro exemplo, valor simplesmente inverter a cor do pixel. Para isso, primeiro acessamos o pixel usando a função text2D (usando o amostrador da textura e a coordenada de textura, sendo que a coordenada é gerada automaticamente pelo pixel shader) e depois multiplicamos pela cor passada pelo SpriteBatch. Enfim, fazemos 1 – a cor para obter seu valor invertido (internamente será gerado um float4 com o resultado de 1 – r, 1 – g, 1 – b e 1 – a) e retornamos o resultado (que é a cor final do pixel).

float4 PixelShaderFunction(PixelShaderInput input) : COLOR0
{
    // TODO: add your pixel shader code here.
    input.Color = tex2D(TextureSampler, input.TextureCoord) * input.Color;
    input.Color = 1 - input.Color;
    return input.Color;
}

Em um arquivo de efeito como este é possível ter diversas funções diferentes, da mesma forma que um programa em C normal. E assim como um programa em C é preciso indicar qual o ponto de partida do programa (o equivalente à função main). Um shader também pode ser dividido em diversas técnicas e passos, mas não vamos entrar em detalhes sobre isto agora. A linha abaixo indica que nossa função será usada como o pixel shader para o passo um da técnica um.

technique Technique1
{
    pass Pass1
    {
        // TODO: set renderstates here.
        PixelShader = compile ps_1_1 PixelShaderFunction();
    }
}

Perceba que deve-se especificar a versão do pixel shader usado. Versões mais altas possuem mais recursos, tanto em variedade de funções quanto em limites do que se pode fazer, mas só rodarão em placas que suportem o mínimo exigido.

Pronto, com este shader bastante simples já é possível inverter a cor de uma textura. Agora precisamos aplicar o shader no XNA. Não vou explicar aqui com carregar e desenhar as imagens, qualquer dúvida vocês podem ver os artigos anteriores ou perguntar nos comentários. Carregar um efeito é praticamente igual a carregar uma textura, primeiro uma variável do tipo Effect é declarada e depois o efeito é carregado no método LoadContent.

Effect efeitoInverso;

protected override void LoadContent()
{
     spriteBatch = new SpriteBatch(GraphicsDevice);
     textura = Content.Load < Texture2D > ("homer");
     efeitoInverso = Content.Load < Effect > ("EfeitoInverso");
}

Na hora de desenhar, também não há complicação. Primeiro é preciso iniciar o efeito e depois iniciar o passo desejado (caso haja mais de um passo). Feito isso as texturas são desenhadas normalmente usando SpriteBatch.Draw e deve-se finalizar o processo fechando o passo e o efeito.

spriteBatch.Begin(SpriteBlendMode.None, SpriteSortMode.Immediate,
    SaveStateMode.None);
efeitoInverso.Begin();
efeitoInverso.CurrentTechnique.Passes[0].Begin();
spriteBatch.Draw(textura, new Vector2(50, 50), Color.White);
efeitoInverso.CurrentTechnique.Passes[0].End();
efeitoInverso.End();
spriteBatch.End();

O shader da escala de cinza vai mudar muito pouco. Na hora de calcular a cor do pixel, ao invés de fazer 1 – a cor, vamos multiplicar cada componente por um peso (relacionado à sensibilidade do olho humano aos canais RGB). As componentes de um vetor podem ser acessados tanto pelo formato .xyzw quanto .rgba, como eu usei abaixo.

input.Color = input.Color.r * 0.3 + input.Color.g * 0.59 + input.Color.b * 0.11;

Segue uma imagem do resultado final:

tutorial_pixelshader

E é isto. Neste tutorial aprendemos a criar um pixel shader bem simples e aplicá-lo a uma textura no XNA. A idéia aqui foi fazer apenas uma introdução ao tema, visto que muito mais coisas podem ser feitas utilizando este recurso. Existem outras formas de se implementar estes exemplos, eu fiz da forma que me sinto mais confortável.

O projeto com os dois shaders e o código-fonte pode ser baixado aqui.

Um bom próximo passo para quem se interessou pelo assunto é pesquisar sobre como passar parâmetros da aplicação para o shader.

Diego Barboza Artigos, Tutoriais, XNA , , ,

Dez maneiras de divulgar seu jogo independente

Talvez uma das questões mais complicadas para um desenvolvedor indie, a publicidade é, como dizem, a alma do negócio. Por mais que um jogo seja bom, se ele é desconhecido não tem como alguém comprar.

Para cada World of Goo ou Braid, que ganham a mídia e viram icones indie, provavelmente existe uma dezena de outros excelentes jogos, mas que quase ninguém conhece. 

Não é preciso ir muito longe pra observar este problema. Os Community Games da Xbox LIVE, por exemplo. A Microsoft revolucionou ao abrir seu console para os desenvolvedores independentes através do XNA, mas segundo consta as vendas por lá não vão tão bem. É aquele problema, não adianta fazer um grande jogo, disponibilizá-lo na rede e só esperar a grana entrar. Os jogadores não vão simplesmente “descobrir” que um jogo é bom assim do nada.

Jogos da indústria, é claro, têm um investimento bem alto justamente na publicidade. Mesmo franquias consagradas, como GTA, não podem se dar ao luxo de ficar só no boca-a-boca. Propagandas como esta já ficaram comuns no mundo dos jogos, sem falar de algumas ações que vão ainda mais além. Pra se ter idéia, segundo o Offworld, a EA investiou $35 milhões em marketing do Spore, enquanto o custo de produção do jogo ficou em $50 milhões.

Mas aí a gente entra em um ciclo vicioso. As grandes desenvolvedoras (na verdade as grandes publishers) têm dinheiro para investir em publicidade e isso faz com que seus jogos vendam, o que gera mais dinheiro que pode ser usado na publicidade de novos jogos. Enquanto isso, o desenvolvedor indie, não tem grana e não consegue competir no mercado.

A saída não é, portanto, juntar uma graninha e colocar um anúncio no jornal da sua cidade. A idéia é tornar-se conhecido e relevante no meio independente. Em uma apresentação no Independent Games Summit, Kyle Gabler (criador do World of Goo) e Phil Fish (criador de Fez) falaram sobre dez maneiras que um desenvolvedor independente pode promover a si mesmo e seus jogos.

Eu tomei a liberdade e fiz uma tradução livre deste artigo do Offworld, onde as dicas foram publicadas. Vamos a elas então:

  • Faça “relações públicas” não “propaganda”: o importante não é pagar por propagandas em sites, mas sim conversar com as pessoas, comentar em blogs, dar entrevistas. Esse tipo de coisa é de graça e pode dar um grande retorno.
  • A imprensa tradicional trabalha de acordo com a indústria, seguindo um padrão de anúncios iniciais, primeiras screenshots e por aí vai. Blogs, por outro lado, além de não estarem restritos em formato, podem estar muito interessados em seus jogos. Uma exposição inicial em um blog pode abrir muitas portas (Nota: a gente já vê isso atualmente com outras áreas. Vídeos engraçados e outras curiosidades que viram mania na internet e uma hora ou outra acabam aparecendo na TV).
  • Produza um bom trailer. Um vídeo com um conceito interessante atrai muita atenção. (Exemplo).
  • Jornalistas são humanos, fazer amizade com eles pode ser boa. Uma prévia do seu jogo, por exemplo, pode resultar em uma matéria e, consequentemente, publicidade gratuita. (Nota: a indústria do cinema faz isso muito bem com suas pré-estreitas para jornalistas).
  • Enquanto jogos licenciados “se vendem” sozinhos, por causa da força de sua marca, um jogo independente tem que ser legal, fácil de descrever e amar. Neste caso, não tem como entregar um jogo mais ou menos que vai vender bem só por causa da marca.
  • Apesar fácil e direto, você também não quer que seu jogo seja simplificado ao máximo. Como exemplo, a imprensa sempre usava a mesma imagem pra falar do World of Goo. Com isso, o autor percebeu que as fases não tinham um apelo muito grande e fez modificações para corrigir o problema, adicionando mais personalidade aos níveis.
  • Participe da comunidade. Ir à GDC, participar do Global Game Jam e muitos outros eventos é importante para fazer contatos. (Nota: para nós brasileiros, o SBGames vem aí).
  • Controle o hype. Mostrar as coisas cedo demais pode ser um problema. É com as grandes expectativas que vêm as grandes decepções.
  • Por fim, seja amado como um desenvolvedor indie. Fazer algo diferente, tornar-se interessante é muito importante quando se fala de grupos pequenos ou desenvolvedores solitários.

Via: Offworld.

Diego Barboza Artigos, Geral, Indie Games, Indústria ,

Conheça o Unity Engine

Para quem deseja desenvolver jogos 3D sem maiores complicações, o Unity 3D é uma boa escolha.

Ao contrário de ferramentas como o XNA, o Unity fornece um editor visual, o que facilita e muito a distribuição dos elementos dentro do jogo. Esse editor também possibilita configurar todos os objetos, inicializar valores de atributos e editar scripts. A ferramenta lembra outras engines de alto nível, como o 3D Game Studio, mas possui uma interface bem mais amigável e as linguagens de script oferecidas também são mais poderosas.

O Unity oferece componentes para trabalhar com física, partículas, audio, iluminação, redes, animações, terrenos, câmeras e muito mais. A lógica do jogo pode ser programada nas linguagens JavaScript, C# ou Boo (Python), e scripts escritos em uma linguagem interagem com scripts escritos em outra linguagem sem problemas.

Um grande diferencial ao meu ver é a importação de recursos para os jogos. O Unity é capaz de importar diretamente arquivos .blend, .max e .psd, por exemplo. Em alguns casos, pode ser necessário ter a ferramenta (como o 3D Studio Max) instalada, mas de qualquer forma há a possibilidade de importar formatos padrão, como .3ds ou .jpg.

Componentes criados no Unity também podem ser exportados e reutilizados em outros projetos, através do recurso de criação de prefabs, que cria um arquivo binário que passa a ser tratado pelo Unity como um outro recurso qualquer.

Até pouco tempo atrás o Unity estava disponível apenas para os sistema operacional MacOS, mas no mês passado uma versão do editor foi lançada para o Windows. O mais interessante é que, independente da plataforma usada para desenvolver, o Unity pode gerar executáveis tanto para Mac quanto para Windows. E ainda há a possibilidade de se criar jogos para a web, necessitando que o usuário instale um plugin no navegador para jogar. O Unity também permite desenvolver jogos para iPhone e Wii, mas nestes casos os custos de licenciamento  são diferentes.

Falando em custos, a versão Indie da ferramenta custa US$ 199,00, o que, diante das facilidades oferecidas pelo editor é uma pechincha. A versão Pro sai por US$ 1499,00, que também não é nenhuma fortuna se comparado aos preços da CryEngine e da Unreal Engine. Os preços e maiores detalhes estão aqui.

Na página do Unity estão listados diversos jogos feitos com ele. Nada muito conhecido, mas vale a olhada. Interessante notar que o jogo T-Racer, mostrado dentro do último Big Brother Brasil, foi feito com o Unity.

Jogo T-Racer utilizado em uma das provas do BBB9.

Read more…

Diego Barboza Artigos, Engines, Notícias, Unity ,

Tocando músicas e efeitos sonoros no XNA 3.0

Uma das grandes adições do XNA 3.0 foi a possibilidade de se tocar músicas e outros efeitos sonoros sem a necessidade de utilizar o XACT (a ferramenta de autoria de som que acompanha o Game Studio).

Assim, agora é possível tratar os efeitos sonoros da mesma forma que uma textura ou um modelo 3D, simplesmente carregando o arquivo através de Content.Load. Este novo sistema é interessante porque permite fazer várias coisas com as músicas, inclusive tocar arquivos da biblioteca do usuário. Os formatos suportados são mp3 e wma (para músicas) e wave (para efeitos sonoros).

Neste pequeno tutorial eu vou mostrar como carregar e tocar músicas e efeitos sonoros nos jogos.

Read more…

Diego Barboza Artigos, Programação, Tutoriais, XNA ,

O desânimo em estudar e os ruídos que atrapalham os estudos

flausino_ps3_01-550x412

Primeiramente peço desculpas a todos pela falta de atualizações do GamedevBR. Manter 3 blogs com posts diariamente é uma tarefa praticamente impossível e no momento ando mais preocupado com o Select Game, que mantenho com mais um amigo e que é mais fácil de manter por falar de uma área mais fácil. Desenvolvimento de jogos está sempre no meu radar, mas a área é mais técnica e por isso, mais difícil. E neste post vou compartilhar com vocês um pouco do que ando passando recentemente na minha vida pessoal. Sei que podem achar que é um momento-diarinho, mas acredito que muitos irão se identificar com o texto a seguir.

Quando a gente está querendo começar as estudar uma área, sempre temos aquela empolgação toda e que sabemos que uma hora o estudo vai nos levar em algum lugar. Ou que vai chegar uma hora que a gente vai conseguir fazer algo decente e mostrar pra alguém. Isso é normal, mas a maioria esquece momentaneamente dos ruídos que podem surgir de todos os lados, como emprego, defeito de algum equipamento e ficar sem conexão com a internet, aquisição de algum produto novo e etc. E de uns tempos pra cá ando repensando muitas coisas relacionadas com o desenvolvimento de jogos.

Read more…

Rodrigo Flausino Artigos ,

A difícil tarefa de planejar um puzzle casual

No próximo mês de abril estarei, depois de 4 anos, em férias trabalhistas previstas na CLT. Com isso, andei pensando: o que vou fazer nessas férias? Como a possibilidade de ser 1 mês (ou 15 dias…), posso fazer muita coisa, como ficar apenas blogando ou mesmo estudando alguma coisa relacionada a desenvolvimento de jogos. Sobre esse último ponto, já comentei aqui sobre escolher uma nova linguagem e aprender a programar nela. C++ e Flash são as alternativas, já que existe a possibilidade de que o meu emprego atual comece um desenvolvimento de um novo sistema comercial em C#, fazendo com que eu aprenda a linguagem junto (aí passar pro XNA será um pulo).

Como falei antes, a escolha do C++ será em virtude das empresas nacionais estarem atrás de gente nesta linguagem. O Flash eu posso desenvolver games simples e colocar no meu blog pra faturar grana com publicidade. E tem os meus gostos por game design e level design, onde posso criar um level e pelo menos me movimentar dentro dele com colisões configuradas.

Read more…

Rodrigo Flausino Artigos, Game Design ,

A Playstation Network ajudando o desenvolvedor indie

Uma das regras máximas que muito profissional da área de desenvolvimento de jogos fala é que pra ser um bom desenvolvedor temos de jogar muito. Obviamente não é viciar nos games, mas jogar o suficiente pra conhecer diversos tipos de estilos de games, conhecendo novas mecânicas e novas maneiras de inovar em futuros projetos. Com isso temos duas alternativas interessantes: caçar games indie pra jogar no computador OU caçar games indie nas redes da Live (Xbox 360) e Playstation Network (Playstation 3 e PSP). No caso dessa última (mais conhecida como PSN) eu andei fuçando na mesma nos últimos dias e decidi postar algumas impressões sobre a mesma. Antes que vocês me xinguem, o foco do texto é sobre desenvolvimento, e não sobre games em si.

Read more…

Rodrigo Flausino Artigos, Indústria , , , ,

C++, C#, Java ou Flash? O dilema de um futuro programador de jogos

Existem n linguagens de programação no mundo. Todas elas tem potencial para criar um jogo, mas a qualidade do mesmo vai depender do foco da linguagem. Num dá pra criar um game complexo num Clipper, mas eu poderia simular um jogo da velha. E hoje existem linguagens que são ideais para quem pensa em desenvolver games.

Sou formado em Sistemas de Informação e já trabalho com programação há cerca de 4 anos, sendo que já mexi com Delphi, Java e agora mexo com Visual Basic. Ultimamente ando tentando estudar Game Design e Desenho Artístico, mas to chegando a conclusão de que eu tenho de me focar em algo que eu já tenho mais facilidade e algo que é mais rápido. Então a palavra programação volta a rondar a minha cabeça e vi que pode ser mais fácil entrar na indústria se eu souber uma das linguagens “populares”.

Só que dentre essas linguagens, há 4 alternativas interessantes que estão em ascensão atualmente: C++, C#, Java e Flash (esta última uma plataforma. A linguagem é a Action Script). A escolha delas também depende do foco do profissional: é mais difícil criar um game num Applet Java e publicar na Web. O Flash pode ser ideal nestes casos. Em empresas médias e grandes, a demanda está sendo no C++. Pra celulares, o Java. Tem também o C# correndo por fora, já que pode ser que no futuro existam oportunidades pra criar games para a Xbox Live Arcade. Aí complica. 4 linguagens com potencial. E não dá pra estudar todas ao mesmo tempo.

Read more…

Rodrigo Flausino Artigos, Programação ,

Global Game Jam – Como Foi

Aconteceu no último fim de semana em cinqüenta e três universidades e vinte e três países pelo mundo o Primeiro Global Game Jam, evento organizado pelo IGDA que reuniu estudantes, profissionais da área e desenvolvedores independentes ao redor de um desafio: construir um jogo em 48 horas. 

Na Universidade Federal Fluminense, em Niterói, o evento começou às 16:00 horass da sexta-feira, com uma apresentação do professor Esteban Walter Gonzalez Clua e uma palestra inaugural sobre game design com o professor da PUC-Rio, Guilherme Xavier.

Na apresentação, tivemos um vídeo onde somos recebidos por Susan Gold, organizadora global do evento, e depois Kyle Gabler, criador de World of Goo, nos apresenta uma hilária lista de coisas importantes para se criar um jogo em quarenta e oito horas. O vídeo, na íntegra, segue abaixo:

Read more…

Diego Barboza Artigos , ,

A questão do tempo gasto para desenvolver elementos de gamedev

Tava lendo hoje o blog The Lost Art of Crafting Worlds, de um level artist da Ubisoft Brasil e fui ver a seção de mapas criado pelo Thiago e eu fiquei de cara com primeira frase da página:

Fruto de 5 anos de trabalho no mod Insurgency, para Half-Life 2. O mapa se passa numa cidade fictícia no Iraque, onde um comboio de civis foi atacado por Insurgentes e um pelotão de Marines foi despachado para eliminar a ameaça ou resgatar os civis.

Repetindo: fruto de 5 anos. CINCO ANOS. OK, sei que este mapa pode ter sido feito durante o tempo livre do modelador (é um chute meu. Não posso afirmar com certeza), mas isso me fez pensar novamente nos processos de desenvolvimento de um jogo. Todo mundo sabe que existem várias etapas e que games de ponta são feitos por equipes. Só que muitos não imaginam que certos elementos demoram mais tempo pra desenvolver do que outros.

Read more…

Rodrigo Flausino Artigos