Linguagem de sombreamento aberto

Cycles Only

Também é possível criar seus próprios nós usando a Linguagem de Sombreamento Aberto (LSA). Note que esses nós irão funcionar apenas para renderização CPU; não há suporte para rodar código LSA na GPU.

Para ativá-la, selecione Linguagem de Sombreamento Aberto como o sistema de sombreamento nas configurações de renderização.

Nota

On Linux, C/C++ compiler tools (in particular /usr/bin/cpp) must be installed to compile OSL scripts.

Nó Script

../../_images/render_shader-nodes_osl_script-node.png

Nó Scripts.

LSA foi desenhada para sombreamento baseado em nós, e cada sombreador LSA corresponde a um nó em uma configuração de nó. Para adicionar um sombreador LSA, adicione um nó script e conecte ele a um bloco de dados ou a um arquivo externo. Soquetes de entrada e saída serão criados a partir dos parâmetros do sombreador ao clicar no botão atualizar no Nó ou Editor de Texto.

Sombreadores LSA podem ser conectados ao nó de algumas diferentes maneiras. Com o modo Interno, um bloco de dados de texto é usado para armazenar o sombreador LSA, e o OSO bytecode é armazenado no próprio nó. Isso é útil para distribuir um arquivo blend com tudo armazenado nele.

O modo Externo pode ser usado para especificar um arquivo .osl de uma unidade, e isso será então automaticamente compilado em um arquivo .oso no mesmo diretório. Também é possível especificar um caminho para um arquivo .oso, que será então usado diretamente, com a compilação feita manualmente pelo usuário. A terceira opção é especificar apenas o nome do módulo, que será procurado no caminho de busca do sombreador.

O caminho de busca do sombreador está localizado no mesmo lugar que os scripts ou caminho de configuração, dentro de:

Linux
$HOME/.config/blender/2.80/shaders/
Windows
C:\Users\$user\AppData\Roaming\Blender Foundation\Blender\2.80\shaders\
macOS
/Users/$USER/Library/Application Support/Blender/2.80/shaders/

Dica

Para uso em produção, nós sugerimos usar um grupo de nó para agrupar os nós de script de sombreadores, e conectá-los a outros arquivos blend. Isso torna mais fácil fazer modificações aos nós depois a medida que soquetes são adicionados ou removidos, sem precisar atualizar os nós de script em todos os arquivos.

Escrevendo Sombreadores

Para mais detalhes sobre como escrever sombreadores, veja `especificação LSA<https://github.com/imageworks/OpenShadingLanguage/blob/master/src/doc/osl-languagespec.pdf>`__. Aqui está um simples exemplo:

shader simple_material(
    color Diffuse_Color = color(0.6, 0.8, 0.6),
    float Noise_Factor = 0.5,
    output closure color BSDF = diffuse(N))
{
    color material_color = Diffuse_Color * mix(1.0, noise(P * 10.0), Noise_Factor);
    BSDF = material_color * diffuse(N);
}

Encerramentos

LSA é diferente de, por exemplo, RSL ou GLSL, no fato de que não possui um laço de luz. Não há acesso a luzes na cena, e o material deve ser construído a partir de encerramentos que são implementados no próprio renderizador. Isso é mais limitado, mas também torna possível o renderizador fazer otimizações e assegura que todos os sombreadores possam ter importância amostrada.

The available closures in Cycles correspond to the shader nodes and their sockets; for more details on what they do and the meaning of the parameters, see the shader nodes manual.

BSDF

  • diffuse(N)
  • oren_nayar(N, roughness)
  • diffuse_ramp(N, colors[8])
  • phong_ramp(N, exponent, colors[8])
  • diffuse_toon(N, size, smooth)
  • glossy_toon(N, size, smooth)
  • translucent(N)
  • reflection(N)
  • refraction(N, ior)
  • transparent()
  • microfacet_ggx(N, roughness)
  • microfacet_ggx_aniso(N, T, ax, ay)
  • microfacet_ggx_refraction(N, roughness, ior)
  • microfacet_beckmann(N, roughness)
  • microfacet_beckmann_aniso(N, T, ax, ay)
  • microfacet_beckmann_refraction(N, roughness, ior)
  • ashikhmin_shirley(N, T, ax, ay)
  • ashikhmin_velvet(N, roughness)

Cabelo

  • hair_reflection(N, roughnessu, roughnessv, T, offset)
  • hair_transmission(N, roughnessu, roughnessv, T, offset)
  • principled_hair(N, absorption, roughness, radial_roughness, coat, offset, IOR)

BSSRDF

  • bssrdf_cubic(N, radius, texture_blur, sharpness)
  • bssrdf_gaussian(N, radius, texture_blur)

Volume

  • henyey_greenstein(g)
  • absorption()

Outro

  • emission()
  • ambient_occlusion()
  • holdout()
  • background()

Atributos

Alguns objetos, atributos de partículas e malhas são disponíveis para a função embutida getattribute(). Mapas UV e cores de vértices podem ser recuperadas usando seu nome. Outros atributos são listados abaixo.

geom:generated
Coordenadas de textura geradas.
geom:uv
Mapa UV padrão para a renderização.
geom:dupli_generated
Para instâncias, coordenada gerada a partir de um objeto duplicador.
geom:dupli_uv
Para instâncias, coordenada UV a partir de objeto duplicador.
geom:trianglevertices
3 coordenadas de vértices do triângulo.
geom:numpolyvertices
Número de vértices no polígono (sempre retorna três atualmente).
geom:polyvertices
Matriz de coordenadas de vértices do polígono (sempre três vértices atualmente).
geom:name
Nome do objeto.
geom:is_curve
É o objeto uma vertente ou não.
geom:curve_intercept
Aponta ao longo da vertente, da raiz à ponta.
geom:curve_thickness
Espessura da vertente.
geom:curve_tangent_normal
Normal Tangente da vertente.
path:ray_length
Distância do raio desde o último encontro.
object:location
Localização do objeto.
object:index
Número do índice de objeto.
object:random
Número randômico gerado por objeto a partir do índice e nome do objeto.
material:index
Número do índice de material.
particle:index
Número da instância de partícula.
particle:age
Idade da partícula em quadros.
particle:lifetime
Vida útil total da partícula em quadros.
particle:location
Localização das partículas.
particle:size
Tamanho das partículas.
particle:velocity
Velocidade das partículas.
particle:angular_velocity
Velocidade angular das partículas.

Traço

Nós suportamos a função traço(pos ponto, dir vetor, ...), para traçar raios a partir do sombreador LSA. O parâmetro «sombreador» não é suportado atualmente, mas atributos podem ser recuperados do objeto que foi atingido usando a função getmessage("traço", ..). Veja a especificação LSA para mais detalhes em como usar isso.

Essa função não pode ser usada em vez de iluminação; o principal objetivo é permitir sombreadores «examinar» a geometria próxima, por exemplo para aplicar uma textura projetada que pode ser bloqueada por geometria, aplicar mais «roupa» à geometria exposta, ou fazer outros efeitos tipo oclusão ambiente.