Mapeamento de textura OSL [duplicado]

Dec 04 2020

Eu sou novo no OSL e no Blender. Estou usando o seguinte código para gerar um círculo em um avião. O plano, no entanto, parece estar dividido em dois triângulos. Alguém pode explicar como consertar isso para que meu círculo OSL seja mapeado corretamente? Obrigada!

shader Circle(
        float rad=0.75 [[float min=0, float max=1]],
        float sharp=0.8 [[float min=0, float max=1]],
        int rep=1[[int min=1, int max=10]],
        point cent=point(0.5, 0.5, 0),
    output color c = 0)
{
    point pt = point(rep*u, rep*v,0);
    float ctx = floor(pt[0])+cent[0];
    float cty = floor(pt[1])+cent[1];
    point ct = point(ctx, cty, 0);
    float d = fmod(distance(ct, pt), rep)/rad;

    c = 1-smoothstep(0.5*sharp, 1-0.5*sharp, d);

}

Respostas

1 RobinBetts Dec 04 2020 at 16:44

ue vsão variáveis ​​globais fornecidas pelo OSL. Eles se referem aos paramétricos U e V; as coordenadas baricêntricas normalizadas do ponto de sombreamento no triângulo sombreado atualmente. Eles são os mesmos U e V que são retornados no vetor 2D obtido no nó Geometria > Saída paramétrica .

Para obter o U e V do quadrante, conforme mapeado, você deve procurar o U e V no mapa UV ativo do objeto, usando getattribute():

shader Circle(
        float radius = 0.75,
        float sharpness = 0.8,
        int tiles = 1,
        point center = point(0.5, 0.5, 0.0),
        output color c = (0.0) 
        )
{
    vector UV = (0.0);
    int hasUV = getattribute( "geom:uv", UV);
  
    point pt = point(tiles*UV[0], tiles*UV[1],0);
    float ctx = floor(pt[0])+center[0];
    float cty = floor(pt[1])+center[1];
    point ct = point(ctx, cty, 0);
    float d = fmod(distance(ct, pt), tiles)/radius;

    c = 1-smoothstep(0.5*sharpness, 1-0.5*sharpness, d);
}

.. mas aqui, encontramos uma promessa não cumprida no manual do Blender, que a julgar pela idade desta resposta , você pode esperar que já tenha sido corrigida. Estranhamente, no que diz respeito ao usuário, a implementação de OSL do Blender se recusa a dar um valor a geom:uv, a menos que haja um nó Image Texture em algum lugar da árvore. (Se você deseja avaliar algum outro mapa UV pelo nome em seu OSL, a árvore também deve conter um nó de Mapa UV com o mesmo nome, conectado ao nó Textura de Imagem ).

Então, sua árvore acaba ficando assim:

Espero que esta resposta economize algum tempo .. :)