# Sombreador

Em computação gráfica, um shader ou sombreador é um programa de computador usado para fazer shading: a produção de níveis de cor apropriadas para uma imagem, ou, na era moderna, também produzir efeitos especiais ou pós-processamento de vídeo. São executados na GPU.

## História

O uso do termo "shader" foi primeiro introduzido pela Pixar com a versão 3.0 da especificação da interface RenderMan, originalmente publicado em maio de 1988.
Com a evolução das unidades de processamento gráfico, várias bibliotecas de software para processamento de gráficos como o OpenGL e Direct3D começaram a suportar shaders. A primeira GPU com suporte a shaders apenas suportava sombreamento de píxeis, mas sombreamento de vértices foi rapidamente introduzido assim que os desenvolvedores começaram a conhecer a capacidade dos shaders. A primeira placa gráfica com sombreamento de píxeis programáveis foi a Nvidia GeForce 3 (NV20), lançado em 2001. Os shaders geométricos foram primariamente introduzidos com o Direct3D 10 e OpenGL 3.2. Eventualmente, hardwares para gráficos evoluíram para um modelo unificado de sombreamento.

## Desenho

Shaders são programas simples que descrevem o devido tratamento tanto de um vértice quanto de um píxel. Sombreamento de vértice descreve os atributos (posição, coordenadas de texturas, cor, etc.) de um vértice, enquanto em píxeis é descrito o tratamento (cor, profundidade, valores alpha, etc.) do píxel. O sombreamento de vértice é feito em cada vértice primitivo; assim um vértice entra, e outro (atualizado) sai. Então, cada vértice é renderizado em uma série de píxeis (blocos de memória) que vão ser eventualmente ser mandados para uma tela.
Pipelines gráficas básicas seguem esse modelo:
* A CPU manda instruções (compilados em linguagens de sombreamento) e dados geométricos para a unidade de processamento gráfico (GPU), localizado na placa gráfica.
* Dentro do sombreamento de um vértice, sua geometria é transformada.
* Se o sombreamento geométrico está na GPU e ativo, algumas mudanças geométricas são feitas na cena
* Se o sombreamento de tesselação está na GPU e ativo, a geometria na cena pode ser subdividida.
* A geometria calculada é então triangulada (subdividida em triângulos).
* Os triângulos são então divididos em fragmentos quádruplo (2 x 2 fragmentos primitivos)
* Os fragmentos quádruplos são então modificados de acordo com o sombreamento de fragmentos
* O teste de profundidade é então feito; os fragmentos que passarem serão então mandatados para serem desenhados na tela e podem ser misturados em um frame buffer.
Esses passos são seguidos em uma maneira de transformar dados tridimensionais (as vezes bidimensionais também) em dados bidimensionais úteis para ser desenhado em uma tela. Geralmente, isso é uma enorme matriz de píxeis ou um frame buffer.

## Tipos

Aqui estão três tipos mais comuns de sombreamento (píxel, e vértice), com outros recentemente adicionados. Enquanto placas gráficas mais antigas usam unidades de processamento separadas, placas mais novas usam sombreamento unificado, capaz de executar qualquer tipo de sombreamento.

### Sombreamentos 2D

Sombreamentos 2D agem nas imagens digitais, também são chamados de textura na área de computação gráfica. Eles modificam atributos de píxeis. O sombreamento 2D também é utilizado em partes na geometria 3D. O único sombreamento 2D hoje é o chamado sombreamento de píxeis.

#### Sombreamento de píxeis

No sombreamento de píxeis, também chamados sombreamento de fragmentos, é feito vários cálculos para cor e outros atributos de cada "fragmento". O tipo mais simples de sombreamento de píxel retorna (saída) um píxel como um valor de cor; tipos mais complexos podem utilizar de múltiplas entradas/saídas. O sombreamento de píxeis variam de simplesmente devolver a mesma cor, apenas aplicando iluminação, até mapeamento de colisões, sombras, destaques espetaculares, translucidez e outros. Eles podem alterar a profundidade do fragmento, ou devolver mais de uma cor se múltiplos alvos de renderização estão ativos.

### Sombreamentos 3D

Sombreamentos 3D agem em modelos 3D mas pode também acessar as cores e texturas utilizadas para desenhar o modelo ou mesh. Sombreamento de Vértices é o mais antigo sombreamento 3D, geralmente aplicando mudanças em uma base por-vértice.

#### Sombreamento de vértices

São os mais estabilizados e comuns tipos de sombreamento 3D. Eles percorrem uma vez cada vértice dado para o processador gráfico. O objetivo é transformar cada posição 3D de um vértice em um espaço virtual para uma coordenada 2D quer será mostrada na tela. Sombreadores de vértices podem manipular propriedades como posição, cor e coordenada de texturas, mas não criar novos vértices.

#### Ray tracing

Ray tracing já é suportado pela Microsoft com o DirectX Raytracing, pelo grupo Khronos com o Vulkan, GLSL, e SPIR-V, e também pela Apple com o Metal.

## Processamento paralelo

Sombreamentos são escritos para aplicar transformações para uma grande quantidade de elementos ao mesmo tempo, por exemplo, para cada píxel em uma área na tela, ou para cada vértice de um modelo. Várias GPUs modernas apresentam múltiplas pipelines de sombreamento para se adequar ao processamento paralelo.
Um modelo de programação com sombreamento é parecido com uma função de alta ordem para renderização, recebendo os sombreamentos como argumentos, e providenciando um fluxo de dados específico entre os resultados intermediários, habilitando ambos paralelismo de dados (através píxeis, vérticies, etc.) e paralelismo de pipelines (entre os estágios).

## Programação

A linguagem onde o sombreado é programado depende bastante da plataforma alvo. A linguagem de sombreamento oficial do OpenGL e OpenGL ES é a Linguagem de Sombreamento OpenGL, conhecido como GLSL, e a linguagem oficial do Direct3D é a Linguagem de Sombreamento de Alto Nível, chamado de HLSL.

## Editores de sombreamento

Plataformas modernas de desenvolvimento de jogos eletrónicos como Unity, Unreal Engine e Godot cada vez mais incluem editores de texto baseado em nós que podem criar sombreamentos sem a necessidade de realmente programar; o usuário é invés disso apresentado com gráficos dirigidos dos nós conectados que permitem direcionar várias texturas, mapas, e funções matemáticas para o valores de saída. A compilação automática então cria um sombreador compilado