Renderização 3D (Shaders).

Slides:



Advertisements
Apresentações semelhantes
Exercícios Resolvidos
Advertisements

IFTO ESTRUTURA DE DADOS AULA 05 Prof. Manoel Campos da Silva Filho
Programação em Java Prof. Maurício Braga
1 ANÁLISE E PROJETO NO PROCESSO DE DESENVOLVIMENTO DE SOFTWARE PROCESSO: CONCEITO MODELOS DE PROCESSO PROCESSO UNIFICADO HISTÓRIA CARACTERÍSTICAS AS QUATRO.
Arquitetura de Computadores
Inversor Trifásicos com Três Pernas
Operações Algébricas Operações Topológicas
Material pedagógico Multiplicar x 5 Clica!
Vamos contar D U De 10 até 69 Professor Vaz Nunes 1999 (Ovar-Portugal). Nenhuns direitos reservados, excepto para fins comerciais. Por favor, não coloque.
2º Semestre 2009 > PUCPR > Design Digital
Introdução à Programação usando Processing Programação Gráfica 2D Animações Exercício Animações 14/10/09 Bruno C. de Paula 2º Semestre 2009 > PUCPR >
14/10/09 Uma animação possui: Início; Passo; Fim; 1.
Exercício do Tangram Tangram é um quebra-cabeças chinês no qual, usando 7 peças deve-se construir formas geométricas.
Nome : Resolve estas operações começando no centro de cada espiral. Nos rectângulos põe o resultado de cada operação. Comprova se no final.
1 INQUÉRITOS PEDAGÓGICOS 2º Semestre 2003/2004 ANÁLISE GERAL DOS RESULTADOS OBTIDOS 1.Nº de RESPOSTAS ao inquérito 2003/2004 = (42,8%) 2.Comparação.
António Ramires Fernandes & Luís Paulo Santos – Adaptado por Alex F. V. Machado Computação Gráfica Pipeline Gráfico.
Projeções e OpenGL Alex F. V. Machado.
ES723 - Dispositivos Eletromecânicos
Análise de regressão linear simples: abordagem matricial
1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade.
COMPUTAÇÃO GRÁFICA.
EXPRESSÕES ARITMÉTICAS
EXPRESSÕES ARITMÉTICAS
GPGPU.
INTRODUÇÃO À PROGRAMAÇÃO
Estudo de Caso 1: UNIX e LINUX
Aula 6 Subprogramas Universidade do Vale do Rio dos Sinos
Questionário de Avaliação Institucional
1 TABULAÇÕES: Exemplo de utilização de Tabulações.
Computação Gráfica Pipeline Gráfico.
Listas Encadeadas.
Classes e objetos Arrays e Sobrecarga
Classes e objetos P. O. O. Prof. Grace.
Introdução a Programação JAVA
Técnicas de Contagem.
Técnica de Contagem.
Provas de Concursos Anteriores
Módulo Financeiro Centro de Custo.
Impressão de etiquetas
MECÂNICA - DINÂMICA Cinemática de uma Partícula Cap. 12.
Cinemática de uma Partícula Cap. 12
Cinemática Plana de um Corpo Rígido Cap. 16
MECÂNICA - ESTÁTICA Vetores Forças Cap. 2.
Árvores binárias de pesquisa com balanceamento
1 António Arnaut Duarte. 2 Sumário: primeiros passos;primeiros passos formatar fundo;formatar fundo configurar apresentação;configurar apresentação animação.
GAPH Integração de Hardware do Usuário ao CoreConnect Leandro Heleno Möller e Leonel Pablo Tedesco Prototipação Rápida e Computação.
Estruturas de Dados com Jogos
Estruturas de Dados com Jogos
Faculdade de Computação Universidade Federal de Mato Grosso do Sul
Coordenação Geral de Ensino da Faculdade
Inserir crédito para cliente
Modelagem Estatística
É u m e l e m e n t o f u n d a m e n t a l
EXERCÍCIOS PARA GUARDA-REDES
EMPREENDEDORES EM AÇÃO PROF. NILSON R. FARIA Colégio Wilson Joffre.
VI Fórum Banco Central sobre Inclusão Financeira
Técnicas de Modelagem para Aplicações em Computação Gráfica
Projeto de Banco de Dados
Compras - Pedido de Compra
1 2 Observa ilustração. Cria um texto. Observa ilustração.
Computação Gráfica Aula 3 Transformações Geométricas
BPM BUSINESS PROCESS MANAGEMENT Projecto em Informática e Gestão de Empresas Lisboa, 20 de Junho de 2006.
MATRICIAL CONSULTORIA LTDA. PREFEITURA MUNICIPAL DE GARIBALDI 23/10/ : ATENÇÃO Os locais descritos nas planilhas anexas não correspondem ao total.
Olhe fixamente para a Bruxa Nariguda
Máquina de Turing Universal
FORMATANDO O TRABALHO NO WORD 2007
Cinemática Plana de um Corpo Rígido Cap. 16
INTRODUÇÃO À ORIENTAÇÃO A OBJETOS EM JAVA
Módulo Compras Relatórios e Relações 1. Objetivo 2 Conhecer os relatórios e as relações do sistema disponibilizadas no módulo Compras.
Compras – Planejamento de Estoque
Transcrição da apresentação:

Renderização 3D (Shaders)

Overview Efeitos Especiais Agenda Conceitos Basicos Pipeline GPU Shaders Overview Efeitos Especiais

Apresentacao Thiago Dias Pastor Bruno Duarte Correa Criador e Desenvolvedor Ploobs Engenheiro Da Computacao pela Poli-Usp Bruno Duarte Correa

Nomenclatura Placa de Video (AGP / PCI Express) CPU (Intel) e GPU (Nvidia, Ati) Sandy Bridge Opengl ES, Opengl e DirectX Cuda, OpenCL e Direct Compute Shader Model 1,2,3,4 e 5 Glsl e Hlsl XNA, SlimDX, SharpDX Irrlicht, Ogre, Unity, PloobsEngine Unreal, CryEngine ….

XNA O que é ? .Net !!! DirectX 9.c Wrapper Helpers !!! Multiplataforma Xbox Windows Phone7

Modelos 3D Softwares de Modelagem Triangulos Vertices Posicao Normal Coordenadas de Textura … Indices Texturas

Modelos 3D

Modelos 3D

Coordenadas de Textura

Formato .X Mesh mesh_Sphere01 { 559; 0.000000;1.000000;0.000000;, -0.000000;0.980785;-0.195090;, -0.038060;0.980785;-0.191342;, -0.074658;0.980785;-0.180240;, -0.108386;0.980785;-0.162212;, -0.137950;0.980785;-0.137950;, …. template Mesh { <3d82ab44-62da-11cf-ab39-0020af71e433> DWORD nVertices; array Vector vertices[nVertices]; DWORD nFaces; array MeshFace faces[nFaces]; [...] }

Renderizacao Conceitos

Posicionando Objetos World

Posicionando Objetos View

Posicionando Objetos Projection

GPU GPU Vertex Declaration VertexBuffer Texturas IndexBuffer Shader Constantes

GPU

Arquitetura

GPU CPU Atualizar Física (mesmo em sistemas como o Physx, a CPU ainda executa grande parte do trabalho), Estado interno dos objetos, processar regras do jogo, Inteligência Artificial, … Traduzir as chamadas de desenho em um formato que o Driver de vídeo possa entender (Ex: A CPU (DirectX Runtime) precisa converter as as chamadas de desenho como SpritBatch.Draw do XNA ou Device.DrawUserPrimitive do DirectX em instrucões que o Driver de vídeo). Converter e Enviar estas instrucões para a GPU (o Driver de vídeo converte as informacões passadas em instrucões para a GPU). GPU Efetuar as ordens dadas pela CPU, ou seja, por exemplo rodar o código de um shader e renderizar um modelo. (estou desconsiderando GPGPU aqui) Estas operações (Lado CPU e Lado GPU) são feitas em paralelo.

Comunicação CPU x GPU

Vertex Declaration I struct CUSTOMVertexPositionNormalTexture {   public Vector3 position;  public Vector3 normal;     public Vector2 texcoord; }

Vertex Declaration II O construtor do VertexElement recebe 4 parâmetros cuja descrição é a seguinte: Offset: Distancia em bytes entre o começo do vértice e o atributo em questão elementFormat: Tamanho do atributo em questão (XNA tem um enum que facilita as coisas, o DirectX não ... ) elementUsage: Uso pretendido do element, neste campo colocamos a semântica que será utilizada pelos Shaders para acessar este dado. usageIndex: Índice utilizado para acessar o elemento no Shader VertexElement textCoordDeclaration = new VertexElement(sizeof(float) * 6,VertexElementFormat.Vector2,VertexElementUsage.TextureCoordinate,0);

Vertex Declaration III VertexElement positionDeclaration = new VertexElement(0,VertexElementFormat.Vector3,VertexElementUsage.Position,0);   VertexElement normalDeclaration = new VertexElement(sizeof(float) * 3,VertexElementFormat.Vector3,VertexElementUsage.Normal,0); VertexElement textCoordDeclaration = new VertexElement(sizeof(float) * 6,VertexElementFormat.Vector2,VertexElementUsage.TextureCoordinate,0);            VertexElement[] vertexElements = new VertexElement[] {positionDeclaration,normalDeclaration,textCoordDeclaration};                           VertexDeclaration vd = new VertexDeclaration(vertexElements);

Vertex Buffer Criando VertexBuffer vb = new VertexBuffer(GraphicsDevice, vertexDeclaration, NUMERO_DE_VERTICES, BufferUsage.None); Setando vb.SetData<customvertexpositionnormaltexture>(ARRAY_DE_VERTICES, 0, NUMERO_DE_VERTICES);

Index Buffer IndexBuffer ib = new IndexBuffer(GraphicsDevice, IndexElementSize.SixteenBits, NUMERO_DE_INDICES, BufferUsage.None); ib.SetData<short>(INDICES);

GPU Arquitetura I

GPU Arquitetura II

GPU Arquitetura III Descrição: Input Assembler: Ler e interpretar os vértices e atributos de vértices do Vertex Buffer (por meio do VertexDeclaration e do IndexBuffer) e enviá-los para o VertexShader [PROGRÁMAVEL] Vertex Shader: Executado uma vez para cada vértice de cada triângulo. Sua função principal é converter os vértices para espaço de projeção. Rasterizer: Converte os triângulos (A GPU suporta diversas outras primitivas) em pixels e envia-os para o Pixel Shader. O rasterizador também realiza outras tarefas como clipping e interpolação dos atributos do vértice para cada pixel. [PROGRÁMAVEL] Pixel Shader : Determina a cor final do pixel a ser escrito no framebuffer (num primeiro momento pode ser entendido como a tela do monitor), é executado uma vez para cada pixel rasterizado de cada primitiva. Output Merger: Combina a saída do Pixel Shader com os valores do Render Target atual. Pode efetuar algumas operações como alpha blending e depth/stencil/alpha testings. (Neste tutorial usarei Render Target como um sinônimo para framebuffer, mas na verdade framebuffer é um tipo de Render Target)

Oque São Shaders …

Arquitetura Shader Alto Nivel

Níveis de abstração do Shader

Vertex Shaders Vertex Shaders Entrada: Vértices Saída: Vértices, cujo atributo posição deve estar em espaço de projeção. Quando que é chamado: Uma vez para cada vértice de cada triangulo. Função: Sua função (mínima) é receber os vértices, e converter o atributo posição para o espaço de projeção.

Vertex Shader - Código struct VertexShaderInput {     float4 Position : POSITION0;     float2 TexCoord : TEXCOORD0; }; float4x4 World; float4x4 View; float4x4 Projection; VertexShaderOutput VertexShaderFunction(VertexShaderInput input) {     VertexShaderOutput output;        float4 worldPosition = mul(input.Position, World);      float4 viewPosition = mul(worldPosition, View);      output.Position = mul(viewPosition, Projection);      output.TexCoord = input.TexCoord;      return output; }

Shaders Rasterizador O Rasterizador irá converter os triângulos que saíram do Vertex Shader em pixels na tela, além disto, ele irá interpolar todos os atributos do VertexShaderOutput para todos os pixel gerados.

Pixel Shader Pixel Shader Entrada: A mesma estrutura saída do Vertex Shader, porém o atributo com a semântica Position NÃO será acessível no Pixel Shader (ele é obrigatório na saída do Vertex Shader e invisível no Pixel Shader). No nosso exemplo poderemos acessar apenas a coordenada de textura. Saída: Cor do pixel como um float4 (RGBA) em caso de render target único (nosso caso) Quando é chamado: Uma vez para cada pixel gerado de cada triângulo rasterizado (CHAMADO MUIIITAS VEZES A CADA FRAME) Função: Definir a cor do pixel.

Pixel Shader - Código float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0 {    return tex2D(diffuseSampler,input.TexCoord); } texture diffuseTexture; sampler diffuseSampler = sampler_state     Texture = (diffuseTexture);     AddressU = CLAMP;               AddressV = CLAMP;     MagFilter = LINEAR;     MinFilter = LINEAR;     Mipfilter = LINEAR; };

OutputMerger Sua função é combinar os pixel que saem do Pixel Shader com aqueles que estão no frameBuffer. Este módulo é bastante configurável (através dos Render states). Os principais parâmetros que podem ser alterados são: Depth Test: Teste de profundidade. A placa de vídeo mantém um buffer chamado DepthBuffer em que são guardados as distancias (Z Depth ) entre a câmera e o “ponto 3D” que originou o pixel desenhado(essa distância é a coordenada Z em espaço de projeção interpolada). Quando um novo pixel chega do Pixel Shader, antes de escrevê-lo no framebuffer, a GPU verifica a distância (Z Depth) deste pixel com a armazenada no depthbuffer, se ela for maior, o pixel é descartado. (O funcionamento descrito é o padrão, existem diversos outros modos que podem ser usados para produzir efeitos especiais) Alpha Test: Podemos descartar pixels de acordo com o alpha de sua cor. Blending: Podemos combinar (de diversas maneiras, Ex: usando o alpha) o valor do pixel atual com o seu corresponde que esta no framebuffer.

Shaders Finalizando technique Tut0 { pass Pass1 {     {         VertexShader = compile vs_2_0 VertexShaderFunction();         PixelShader = compile ps_2_0 PixelShaderFunction();     } }

Shaders/XNA Effects Effect Tutorial0Effect; Tutorial0Effect = this.Content.Load<effect>("Effects//Tutorial0Effect0"); Tutorial0Effect.CurrentTechnique = Tutorial0Effect.Techniques["Tut0"];

Shaders/XNA Desenhando um Modelo ///define constantes this.Tutorial0Effect.Parameters["View"].SetValue(cameraSimples.View); this.Tutorial0Effect.Parameters["Projection"].SetValue(cameraSimples.Projection); this.Tutorial0Effect.Parameters["World"].SetValue(trandformation); ///define a textura                         this.Tutorial0Effect.Parameters["diffuseTexture"].SetValue(diffuse); ///define o Index Buffer this.GraphicsDevice.Indices = INDEXBUFFER; ///define o VertexBuffer this.GraphicsDevice.SetVertexBuffer(VERTEXBUFFER);            ///define o Shader this.Tutorial0Effect.CurrentTechnique.Passes[0].Apply();            ///Desenha o modelo (Ativa a pipeline) this.GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, vertexCount,0, primitiveCount);

Futuro Hiper Realismo GPGPU !!! XNA 5 ?! Directx 11.1 ? Windows 8 ? Mobiles ? Tablets ? Eficiencia Energetica ? Nuvem ?

Let´s get this done

Live Coding

Referencias

Contato www.ploobs.com.br contato@ploobs.com.br Obrigado