Luiz Gonzaga da Silveira Jr
O p e n G L evolução recente Luiz Gonzaga da Silveira Jr
OpenGL 4.x: D3D a guerra não acabou OpenGL 4.2 - novas funcionalidades: Contadores atômicos para shaders Tesselação em GPU Modifica subconjunto de uma textura, sem recarregá- la (performance) Empacota múlolpos de 8 e 16 bits em 32 bits
Geometry shader Vertex Shader Geometry Shader Fragment Shader Refinamento de malha Culling (frustum) GPU LOD GS requer SM4
Geometry Shader Quando surgiu foi um bum...depois: decepção! Uma primiova/unidade de processamento Loop:produção de novos véroces (uma após outra) Melhoria:especificando um contador de invocações no topo do GS: layout(triangles, invocaoons = 3) in; Diz a GPU que seu GS deve rodar 3x em uma primiova
Geometry shader (revisão) Rodas após transformações nos véroces, mas ANTES do shading de cor, clipping,,clamping... O geometry shader começa com uma primiova {ponto, linha, triângulo} Pode kler atributos da primiova para criar novas primiovas Saída do GS: {ponto, line strip, triangle strip} Emite véroces para definir a nova primiova
GS #version 15 layout(triangles) in; layout (triangle_strip, max_vertices=3) out;... void main() { for(int i = 0; i < gl_verticesin; i++) { // copia os atributos gl_position = gl_in[i].gl_position; VertexOut.normal = VertexIn[i].normal; VertexOut.texCoord = VertexIn[i].texCoord; } } // feito! EmitVertex();
Pipeline OpenGL 4.2 Decide como um patch é subdividido. DX Hull Shader Produz as novas primitivas Pode modificar cada nova primitiva. Ex: posição e outros atributos. DX=domain shader
Pipeline OpenGL 4.2 Vertex Shader Decide como um patch é subdividido. DX Hull Shader Produz as novas primitivas Pode modificar cada nova primitiva. Ex: posição e outros atributos. DX=domain shader
Pipeline OpenGL 4.2 Vertex Shader Decide como um patch é subdividido. DX Hull Shader Produz as novas primitivas Pode modificar cada nova primitiva. Ex: posição e outros atributos. DX=domain shader
Pipeline OpenGL 4.2 Vertex Shader Tesselation Control Decide como um patch é subdividido. DX Hull Shader Produz as novas primitivas Pode modificar cada nova primitiva. Ex: posição e outros atributos. DX=domain shader
Pipeline OpenGL 4.2 Vertex Shader Tesselation Control Decide como um patch é subdividido. DX Hull Shader Produz as novas primitivas Pode modificar cada nova primitiva. Ex: posição e outros atributos. DX=domain shader
Pipeline OpenGL 4.2 Vertex Shader Tesselation Control Decide como um patch é subdividido. DX Hull Shader Tesselator Produz as novas primitivas Pode modificar cada nova primitiva. Ex: posição e outros atributos. DX=domain shader
Pipeline OpenGL 4.2 Vertex Shader Tesselation Control Decide como um patch é subdividido. DX Hull Shader Tesselator Produz as novas primitivas Pode modificar cada nova primitiva. Ex: posição e outros atributos. DX=domain shader
Pipeline OpenGL 4.2 Vertex Shader Tesselation Control Decide como um patch é subdividido. DX Hull Shader Tesselator Produz as novas primitivas Tesselation Evaluation Pode modificar cada nova primitiva. Ex: posição e outros atributos. DX=domain shader
Pipeline OpenGL 4.2 Vertex Shader Tesselation Control Decide como um patch é subdividido. DX Hull Shader Tesselator Produz as novas primitivas Tesselation Evaluation Pode modificar cada nova primitiva. Ex: posição e outros atributos. DX=domain shader
Pipeline OpenGL 4.2 Vertex Shader Tesselation Control Decide como um patch é subdividido. DX Hull Shader Tesselator Produz as novas primitivas Tesselation Evaluation Pode modificar cada nova primitiva. Ex: posição e outros atributos. DX=domain shader Geometry Shader
Pipeline OpenGL 4.2 Vertex Shader Tesselation Control Decide como um patch é subdividido. DX Hull Shader Tesselator Produz as novas primitivas Tesselation Evaluation Pode modificar cada nova primitiva. Ex: posição e outros atributos. DX=domain shader Geometry Shader
Pipeline OpenGL 4.2 Vertex Shader Tesselation Control Decide como um patch é subdividido. DX Hull Shader Tesselator Produz as novas primitivas Tesselation Evaluation Pode modificar cada nova primitiva. Ex: posição e outros atributos. DX=domain shader Geometry Shader Clipping
Pipeline OpenGL 4.2 Vertex Shader Tesselation Control Decide como um patch é subdividido. DX Hull Shader Tesselator Produz as novas primitivas Tesselation Evaluation Pode modificar cada nova primitiva. Ex: posição e outros atributos. DX=domain shader Geometry Shader Clipping
Pipeline OpenGL 4.2 Vertex Shader Tesselation Control Decide como um patch é subdividido. DX Hull Shader Tesselator Produz as novas primitivas Tesselation Evaluation Pode modificar cada nova primitiva. Ex: posição e outros atributos. DX=domain shader Geometry Shader Clipping Rasterization
Pipeline OpenGL 4.2 Vertex Shader Tesselation Control Decide como um patch é subdividido. DX Hull Shader Tesselator Produz as novas primitivas Tesselation Evaluation Pode modificar cada nova primitiva. Ex: posição e outros atributos. DX=domain shader Geometry Shader Clipping Rasterization
Pipeline OpenGL 4.2 Vertex Shader Tesselation Control Decide como um patch é subdividido. DX Hull Shader Tesselator Produz as novas primitivas Tesselation Evaluation Pode modificar cada nova primitiva. Ex: posição e outros atributos. DX=domain shader Geometry Shader Clipping Rasterization Fragment Shader
Pipeline OpenGL 4.2 Vertex Shader Tesselation Control Decide como um patch é subdividido. DX Hull Shader Tesselator Produz as novas primitivas Tesselation Evaluation Pode modificar cada nova primitiva. Ex: posição e outros atributos. DX=domain shader Geometry Shader Clipping Rasterization Fragment Shader
Pipeline OpenGL 4.2 Vertex Shader Tesselation Control Decide como um patch é subdividido. DX Hull Shader Tesselator Produz as novas primitivas Tesselation Evaluation Pode modificar cada nova primitiva. Ex: posição e outros atributos. DX=domain shader Geometry Shader Clipping Rasterization Fragment Shader Blending
Pipeline detalhado (OpenGL 3.2...4.2) OpenGL 4
Por que Tesselação em GPU?! Exemplo Terreno heighmtap, normal e textura: 4096x4096 128x128 patches subdivididos até 64x Total: 67 mi triangulos GTX460: 10fps Todos triângulos na tela tesselação shader: 300-500 fps
Desempenho PrimiOvas: Cache de véroces NVStrip: hop://www.nvidia.com/object/ nvtristrip_library.html
Montagem de primirvas
Montagem de primirvas
Montagem de primirvas
Montagem de primirvas
Montagem de primirvas
Tesselação Entrada: patches Saída: primiovas (ponto, linhas e triângulos) Patch?! array de véroces (atributos computados pelo VS) Patch Tesselate Shader Vérticies Estágios Tesselation Control programável Tesselator (gerador de primitiva) fixo Tesselation Evaluation programável
Estágios Tessela5on control: Entrada: array com vér5ces para cada patch de entrada Computa os atributos para cada vér5ce da nova primi5va de saída Shaders responsáveis por escrever atributos per patch, que define o grau de subdivisão do patch Tipos de patches: Triângulos Quads A subdivisão é controlada pelos tessela5on levels. Ajustável. Default:64
GS OpenGL 3.2 ++ Opcional Recebe primiovas (triângulos), não recebe strip, loop, fan PrimiOvas de entrada: points (1) lines (2) Primitivas de saida points line_strip triangle_strip lines_adjacency (4) triangles (3) triangles_adjacency (6)
Mini- Projeto I: Grau A: 20% - prazo de entrega: 1 semana! Implementação de exemplo usando as seguintes extensões: ARB_blend_func_extended ARB_explicit_aUrib_loca5on ARB_occlusion_query2 ARB_sampler_objects ARB_shader_bit_encoding ARB_texture_rgb10_a2ui ARB_texture_swizzle ARB_5mer_query ARB_instanced_arrays ARB_vertex_type_2_10_10_10_rev OpenGL 3.3 Grupos de 1 ou 2 alunos Entregáveis: código fonte, descrição da app, descrição detalhada da extensão
Projeto II: Tesselação: Grau A: 30% - prazo de entrega: 2 semanas! Entrada: Quad (simular uma parede) Saida: malha tesselada (nível de tesselação: ajustável) Como? Tesselação em GPU Implementar e entregar por email prazo: 14 dias Início: agora!