Círculos, caixas e linhas
Medir a distância de cada pixel até um ponto, uma caixa ou uma linha e recortar uma forma dela com um limiar.
Cards
2 exemplos ao vivo para ajustar, aprender e copiar.
Como funciona
Um shader de fragmento não desenha um círculo como um programa de desenho. Não existe um comando “círculo”. Cada pixel roda o mesmo código sozinho e decide uma coisa só: que cor eu tenho? Uma forma aparece quando essa decisão depende de onde o pixel está.
A receita tem duas partes. Primeiro, transforme a UVUma posição 2D numa superfície ou na tela, em geral de 0 a 1 nos dois eixos. Shaders desenham formas e padrões como funções dela. Coordenadas UV Uma posição 2D numa superfície ou na tela, em geral de 0 a 1 nos dois eixos. Shaders desenham formas e padrões como funções dela. Vetor Um grupo de dois a quatro números tratado como um só valor (vec2, vec3, vec4). O mesmo tipo guarda uma posição, uma direção, uma cor ou uma UV. Smoothstep Um limiar suave. Vale 0 abaixo da primeira borda, 1 acima da segunda e segue uma curva em S com as pontas planas entre elas.uv = gl_FragCoord.xy / resolutionstep duro deixa a borda
serrilhada; um smoothstepUm limiar suave. Vale 0 abaixo da primeira borda, 1 acima da segunda e segue uma curva em S com as pontas planas entre elas.t = clamp((x − e0) / (e1 − e0), 0, 1); s = t² (3 − 2t)
Todo o resto depende do que você entrega ao limiar. Use a diferença absoluta em relação ao raio e o disco vira um anel.
Faça o raio seguir um seno do tempo e o anel respira. A mesma medida, combinada com outras, é o começo dos
campos de distância com sinalUma função que devolve a distância de um ponto até a borda de uma forma, negativa dentro e positiva fora. O zero é o próprio contorno. Campo de distância com sinal (SDF) Uma função que devolve a distância de um ponto até a borda de uma forma, negativa dentro e positiva fora. O zero é o próprio contorno.circle(p) = |p| − r sobre os quais as técnicas de composição de SDF 2D e de raymarching
são construídas.
Engines e ferramentas raramente trazem isso como um nó pronto, porque é pequeno demais: um length e um smoothstep,
ou um nó Distance e um nó SmoothStep num grafo. É também por isso que a técnica funciona igual em qualquer lugar.
Leitura complementar
- step (abre em uma nova aba)Referência
- smoothstep (abre em uma nova aba)Referência
- Shaping functions (abre em uma nova aba)Livro
- gl_FragCoord (abre em uma nova aba)Referência
- Uniforms (abre em uma nova aba)Livro
- UV mapping (abre em uma nova aba)Referência
- Euclidean vector (abre em uma nova aba)Referência
- length (abre em uma nova aba)Referência
- normalize (abre em uma nova aba)Referência
- Shapes (abre em uma nova aba)Livro
- 2D distance functions (abre em uma nova aba)Artigo
- Smoothstep (abre em uma nova aba)Referência
- sin (abre em uma nova aba)Referência
- abs (abre em uma nova aba)Referência
- Sine wave (abre em uma nova aba)Referência