Jump to content

Bem vindo à Unidev
Registre para ter acesso a todos os recursos do site. Uma vez registrado e logado, você poderá criar tópicos, postar em tópicos já existentes, gerenciar seu perfil e muito mais. Se você já tem uma conta, faça login aqui - ou então crie aqui uma conta agora mesmo!
Photo

Como passar mais de uma posição de luz


  • Please log in to reply
1 reply to this topic

#1
renanrosa_java

renanrosa_java

    Membro

  • Membro
  • PipPip
  • 469 posts
  • LocationBrasil

Olá pessoal, estou estudando o GLSL e peguei alguns exemplos de multiplas luzes, mas apenas o EXE e não codigo fonte.

Olhando apenas o código do shader que veio junto eu vi que tem os dados das luzes apenas como se fosse uma unica luz:


varying vec4 lpos; //light position in view space

e depois o calculo para iluminação normal:


float attenuation = 1 / ((((length(ltop)/(1-((length(ltop)/radius)*(length(ltop)/radius))))/radius)+1)*(((length(ltop)/(1-((length(ltop)/radius)*(length(ltop)/radius))))/radius)+1));
vec4 diffuse = c * diffuseModifier * vec4(diffuseLightColor, 1.0) * attenuation * noZTestFix;
	
//Set the color
gl_FragColor = diffuse;// + (c*vec4(0.2, 0.2, 0.2, 1.0));

Minha pergunta é... como que é declarado apenas uma posição da luz (lpos) e na execução é gerado várias luzes ?

O resultado é esse:

 

deferred_shading.png

 

 

 

Alguem poderia me esclarecer essa dúvida ?


Posted Image

#2
Lucas B. Luna

Lucas B. Luna

    Membro

  • Membro
  • PipPip
  • 217 posts

Irei tentar dar uma resposta rápida apenas para dar uma ideia. Não vou entrar em detalhes pois meu tempo está muito curto mesmo.

 

Como esse efeito foi conseguido nesse caso especificamente, eu não sei, mas uma forma de se fazer isso é usando a técnica a qual eu já mencionei em outro tópico que é multipass rendering, ou seja, você desenha a mesma geometria várias vezes e mistura cada imagem gerada no framebuffer após cada passagem através de um combinação de blend equation (equação de mistura) e blend function (função de mistura), não se esquecendo de habilitar GL_BLEND, é claro. O que mudaria em cada passagem seria somente a informação sobre a(s) luz(es).

 

Na wiki do OpenGL é mencionado que o efeito de várias fontes de luz em um pixel costuma deixar de ser perceptível quando são aplicados os efeitos de mais de 3 ou 4 luzes. É bom lembrar disso também (não queira então tentar iluminar um mesmo pixel com um número arbitrariamente grande de luzes). Considerando, evidentemente, que essas 3 ou 4 fontes de luz tenham, por sua vez, uma influência não-desprezível na cor do pixel.

 

Também chamo a atenção para o fato de que, geralmente, a maior parte da iluminação em um cenário é estática, então você pode abrir mão de cálculos de iluminação dinâmica em boa parte dos casos.

 

Fica a seu critério decidir se é melhor passar a informação de luz através de uniforms, vertex attributes, ou uma combinação de ambos.


SS-SW.jpg




0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users