(sim) Escrevendo shaders para a esfera de Vegas
(whenistheweekend.com)- A página The Sphere mostra, com 5 exemplos e trechos de shader GLSL, como a cor da superfície da esfera é calculada
- As entradas do shader são
time,vUvevNormal, e o tempo e as coordenadas UV são o centro da variação de cor main()calcula a cor final de cada pixel atribuindovec4(...)agl_FragColor- Os valores RGB são criados com base em
cos(time + vUv.xyx + vec3(0., 2., 4.)), representando uma variação baseada no tempo - O
vNormaldeclarado não é usado dentro do trecho de código fornecido, então atualmente não afeta o cálculo da cor
Estrutura da página The Sphere
- O título é The Sphere
- No corpo, há marcações de exemplos de
example 1atéexample 5 - Em seguida, é apresentado um código de shader que parece ser GLSL
Fluxo do código do shader GLSL
- As variáveis de entrada são três:
time,vUvevNormaltimeéuniform floatvUvévarying vec2vNormalévarying vec3
- A função
main()definegl_FragColor - A cor é calculada na forma
0.5 + 0.5 * cos(...) - Na entrada de
cos(), entram juntos o valor de tempo,vUv.xyxevec3(0., 2., 4.) - O valor alfa é fixado em
1.
1 comentários
Comentários no Hacker News
Fiz um efeito de Matrix funcionar
Tentei ajustar o UV para mostrar a parte de cima da esfera, mas desisti; ainda assim, os uniforms projectionMatrix e modelViewMatrix do three.js podiam ser referenciados só declarando-os no topo do GLSL
Fiz um tiling de Penrose estático: https://gist.github.com/vjeranc/265db912d4004c7c0b0f16ae5fda...
Como a esfera não é infinita, usar um tiling aperiódico não tem muito sentido prático, mas ainda fica bonito
Ainda não sei se existe algum conjunto semelhante de tiles, ou um único tile, que permita azulejar um cone infinito
Continua sendo uma pergunta interessante, mas não está claro o suficiente qual projeção faria sentido, então é difícil se aprofundar mais
Fugindo um pouco do assunto, é fascinante o tamanho do projeto de engenharia que The Sphere realmente é
Inclui desde a própria estrutura até a sincronização de milhares de painéis de LED dentro e fora da esfera, o resfriamento no calor de Las Vegas e manter os 18.000 assentos internos suficientemente frescos e ventilados
Há muitos prédios de escritório comuns que nem conseguem uma ventilação decente
Fiz um smiley.frag simples: https://gist.github.com/nickbarth/4ec5147bd1288fd2bcfc4c5b46...
O projeto é muito bom
Seria mais fácil de compartilhar se cada código tivesse uma URL separada. Embutir o código na própria URL também parece uma boa ideia
Fiz um shader de rosto sorridente grande
É um código GLSL que usa
sdRingpara fazer a boca, trata os olhos de uma vez usando simetria esquerda-direita e depois renderiza tudo em amareloFoi a primeira vez que mexi com shaders e fiz uma melancia girando
Entendo mais ou menos que ele lida com tuplas RGB, que
fract()parece uma operação de resto, e que ele eleva esse valor ao quadrado e soma para criar faixas suaves, mas ainda é meio opaco para mim como exatamente o shader funciona, o que évUve ondegl_FragColoré atribuídoDepois ela divide os triângulos em fragmentos, isto é, pixels, e executa o fragment shader para cada fragmento
Aqui, as entradas são o uniform
time, que entra com o mesmo valor para todos os fragmentos, evUv, que é emitido pelo vértice e depois interpolado linearmente dentro do triângulovUvcorresponde às coordenadas do pixel sobre a esferagl_FragColoré a saída de cor RGBA aplicada àquele fragmentoEm um shader típico de jogo ou do Google Earth, isso ainda incluiria texturização e iluminação, e embora o modelo de execução da GPU pareça programação de um pixel por vez, na prática é SIMT, então a NVIDIA processa 32 pixels e a AMD 64 pixels ao mesmo tempo
Em geral, dá para pensar nos condicionais como operações condicionais em que os dois ramos acabam sendo executados
Você provavelmente também vai gostar de https://www.shadertoy.com/
Os shaders de https://www.glslsandbox.com também valem a pena
Só que pessoas imaturas costumam postar shaders NSFW por lá, e o administrador aparentemente não faz uma moderação muito minuciosa, então é bom tomar cuidado
Fiquei curioso sobre qual seria a complexidade de Kolmogorov de “conteúdo GLSL NSFW”
https://www.glslsandbox.com/e#108133.0
NSFW: https://www.glslsandbox.com/e#108230.3
Nos comentários do código ficaram prompts pedindo ao ChatGPT para deixar o corpo mais gordo, adicionar linhas de scroll no fundo, mudar as cores e acrescentar certas partes do corpo
Muito bom
No meu projeto isocity, a solução que alguém enviou permite compartilhar a cidade criada por URL
Parece que daria para implementar algo parecido: https://github.com/victorqribeiro/isocity/commit/c6588171e37...
The Sphere parece um ótimo lugar para sediar uma demoparty
https://en.wikipedia.org/wiki/Demoscene#Parties