Notas de estudo 25

A primeira parte que assisti na renderização 16 antes, estava aquém do último ponto, que era sobre objetos transparentes. Esse ponto era muito misterioso e eu não entendi nada.

E sua operação se deve à diferença de versão, então não consigo encontrar o botão de operação relevante aqui.

Antes de usar este mapa de luz para nosso próprio material aqui, ainda temos que verificar se ele está ativado e precisamos usar uma palavra-chave variante.

A lógica é: podemos definir se deseja habilitar o cozimento e outras opções externas e, em seguida, a ativação afetará a geração de palavras-chave do shader, portanto, quando julgarmos em #if

Ele decidirá se deve realizar cálculos relacionados de acordo com o fato de o externo estar ligado ou não.

Além disso, preste atenção à exclusão mútua entre VERTEXLIGHT e LIGHTMAP que ele disse aqui.

Uma vez que o lightmap deve ser amostrado. Então uv deve ser usado, aqui está o segundo conjunto de UV.

A amostragem é realizada através do segundo conjunto de UVs e, antes da amostragem, é necessária uma conversão:

Isso é semelhante à transformação de nossas coordenadas de textura anteriores, mas quando ele disse o motivo aqui, ele não entendeu algo sobre desempacotamento de textura. . .

Depois, há o trabalho de amostragem, e o resultado da amostragem é usado como iluminação indireta.

O resultado da amostragem aqui também precisa de uma decodificação.

(Antes tínhamos uma pergunta, quando decodificar e quando codificar, desse ponto de vista, está relacionado ao armazenamento de imagens, se uma imagem requer armazenamento em um determinado formato, precisamos codificar,

E há algumas texturas que conseguimos, ele está codificado, então precisamos decodificá-lo. )

Aqui é sobre o nosso uso atual de lightmap ainda tem problemas, o uso simples não é problema.

Ele sempre pensa que nossos objetos frontais são brancos sólidos e opacos, então haverá alguns problemas quando eles forem opacos ou de outras cores.

Isso se torna mais aparente quando a opacidade é alterada para 0.

Eis porque tratar como opaco é como mencionei acima, principalmente porque quando ele estiver assando, se ele vir que você está translúcido, ele irá se referir ao canal alfa de _Color,

Mas não temos aqui, então temos que pensar que é opaco.

Portanto, a solução para isso é muito simples, basta substituí-lo.

Para a sombra deste recorte, é completamente semelhante, e também precisamos mudar o nome.

Aqui, ao assar, preste atenção se o resultado do cozimento é a luz indireta. Quando consideramos o efeito do cozimento, preste atenção na luz indireta da cena.

Então aqui é sobre a cor, o que você quer que a cor do próprio objeto faça com a luz indireta, não é apenas os efeitos de sangramento de cor e assim por diante.

Mas o colorbleeding aqui é sempre branco, ou seja, quando este lightmap processa a luz mapeada de todos os nossos objetos, ele considera

ficou branco.

Isso não é tão simples quanto mudar a cor, pois o próprio lightmap considera a cor do objeto incluindo albedo, autoiluminação, metalicidade, etc.

Todas essas situações determinam o resultado final do sangramento de cor.

Portanto, se queremos que o lightmap nos dê um efeito correto aqui, precisamos dizer a ele todas essas coisas relacionadas.

Os anteriores incluem recorte e transparência, nós também falamos, a diferença é que o nome foi acertado antes, e depois ele vai tirar o valor correspondente. Depois de acordo com o valor para gerar o efeito de luz indireta.

Especificamente como dizer as coisas relevantes quando o lightmap é gerado. É necessário um novo passe.

Prepare algumas variáveis ​​e funções que precisam ser usadas.

Porque quando essas funções funcionam, escrevemos muitas condições antes e precisamos confiar nessas condições para julgamento. Ou seja, as palavras-chave são necessárias para entrar em vigor.

Em seguida é o vértice.

Na verdade, é bom entender o núcleo aqui.

Na verdade, o cerne é a frase na caixa vermelha, ou seja: antes de mais nada, nosso passe é percorrer os objetos da cena.

Mas o resultado que produzimos não é o efeito visto pela projeção em perspectiva da perspectiva da câmera.

Em vez disso, queremos fazer um desdobramento de textura no mapa de luz.

Aqui é onde o cotão começa.

Primeiro, não importa quais são os objetos no espaço do mundo no início, e não importa quais são suas posições.

Na verdade, eles não estão diretamente relacionados ao resultado final da renderização.

O resultado final da renderização depende da posição passada para o fragmento e das informações de atributos necessárias para a coloração.

O primeiro determina o layout do conteúdo do gráfico de saída e o último determina os detalhes específicos do conteúdo.

Então, o que inserimos é a cena, podemos usá-la para renderizar essa textura desembrulhada no mapa de luz.

Como fazer isso? Na verdade, o mais importante é descobrir qual é a localização da saída.

O ponto correspondente a cada objeto em nossa cena terá um ponto correspondente nesta textura. Esta é a premissa para nós amostrar o lightmap.

Então, na verdade, se quisermos esse lightmap, só precisamos tirar cada ponto, e cada ponto corresponde a um ponto na cena.

Então surgiu a ideia, que é transformar os pontos da cena em pontos do lightmap, e depois passá-los para o fragmento como a posição.

Desta forma, percebemos: sombrear a luz indireta e salvá-la no lightmap.

Claro que alguns detalhes são necessários aqui, ou seja, transformar as coordenadas bidimensionais em coordenadas tridimensionais.A bidimensional é porque os pontos correspondentes aos vértices no lightmap são todas coordenadas bidimensionais.

Apenas escreva z como 0 aqui.

Aqui, devido à consideração de questões relacionadas à plataforma, um operador ternário é desenvolvido.

Para o fragmento, duas saídas são necessárias aqui, uma albedo e uma emissão. pass é executado duas vezes. Em relação à saída de cada vez, o Unity nos ajuda a preparar

Interface de julgamento relacionada:

Pode ser visto em sua definição que ele fez um julgamento sobre albedo e emissão. Além disso, ele também realizou alguma codificação ou pow, clamp

Esta simples operação de transformação.

Então, precisamos passar em várias quantidades que calculamos. Portanto, a próxima tarefa é calcular os parâmetros passados.

Aqui está uma chamada simples.

Claro, ainda existem alguns problemas de auto-iluminação aqui, ou seja, ao assar, se o objeto for auto-iluminado, ele terá que passar pelo cálculo da auto-iluminação e, em seguida, enviá-lo para o mapa de luz

haverá resultados,

E esse assunto precisa ser tratado no material para garantir que o objeto autoiluminado passe pelo passe de cálculo do autoiluminante.

Existem alguns problemas na implementação aqui, principalmente sobre a transformação de coordenadas.

Eu fui um pouco mal interpretado, pensando que as coordenadas de amostragem dos vértices foram passadas diretamente para o fragmento como as coordenadas do espaço de recorte.

Mas este não é o caso. O que o autor escreveu é usar as coordenadas de amostragem como as coordenadas do objeto e, em seguida, executar a transformação MVP. Em seguida, passe-o para o fragmento.

Mas fazer isso não tem efeito e, ao depurar aqui, escrevi diretamente um retorno vermelho no fragmento, mas não teve efeito.

Isso significa que o fragmento não entrou. O motivo será explicado mais adiante.

Então eu pesquisei as informações e encontrei a seguinte forma de escrever:

MetaPass em Unity5 - Esfog - Blog Park (cnblogs.com)

Entre eles, a diferença de nós é encontrada principalmente na transformação de coordenadas.

Uma função empacotada é usada diretamente aqui. Os parâmetros são coordenadas de vértice e dois uvs, e há duas coisas internas.

encontre seu código de implementação

Não definimos esse tal EDITOR_VISUALIZATION aqui, e aí ele tem duas ramificações aqui, conforme mencionado no link acima,

Na verdade, x representa o GI estático, que é nossa escolha. O componente y representa GI dinâmico.

Portanto, os dois uvs aqui realmente significam que um é estático e o outro é dinâmico.

Então aqui vamos entrar no primeiro ramo, e aí a operação dentro é na verdade a mesma que a nossa, a única diferença é que no final temos que multiplicar a matriz VP ao invés do MVP

O que foi dito acima é que retornar ao fragmento e escrever diretamente uma cor vermelha não causará nenhuma reação.Na verdade, isso tem algo a ver com a nossa multiplicação de uma matriz M.

Achei que a saída da matriz M deveria ser uma matriz zero após a depuração, então depois de multiplicar o acima, não há nada, então fica tudo preto, o que também pode explicar a multiplicação do MVP.

Mas depois de depurar a matriz M, acabou não sendo.

Apenas lembre-se de fazer isso primeiro, é muito estranho.

Volte e aprenda a depuração do renderdoc

Para o metal bruto aqui, de fato, o efeito de reflexão de sua própria cor é mais óbvio, então este ponto é complementado no padrão,

Para o efeito que conseguimos antes, outra questão é levantada aqui, que é sobre os detalhes da superfície após o cozimento da luz.

O principal motivo é que ele se preocupa apenas com as informações do vértice da superfície ao assar e, em seguida, obtém o resultado da iluminação, de modo que o desempenho do nosso normal para os detalhes é perdido.

Então, queremos recuperar os detalhes, precisamos levar em consideração as informações normais.

Esta lacuna não é uma estrela e meia.

O método de ativar o Direcional aqui tem algumas melhorias, mas não é muito grande. (O direito na foto acima é melhorado)

A principal razão é que a frequência de amostragem do lightmap aqui não é suficiente. Se a frequência de amostragem for alta o suficiente,

(Além disso, a luz direta não é considerada acima e a luz indireta é assada, então é normal que os detalhes normais não sejam óbvios.)

Após ligar este direcional, ele produzirá mais um gráfico.

Anteriormente, nosso mapa de luz registrava apenas a intensidade da luz recebida em uma determinada posição da cena e a utilizava diretamente como o brilho da cor da luz indireta.

Mas agora, mais um mapa é gerado, que corresponde ao lightmap acima, e a intensidade é registrada nele, e uma informação geral de direção é adicionada aqui. porque afinal é

A luz indireta não tem uma direção exata.

Então, com a direção geral da luz, ao amostrar a luz ambiente para o ponto de sombreamento, você pode realizar um cálculo de sombreamento semelhante ao difuso, que leva em consideração o normal.

Claro, porque a direção da luz é aproximadamente, aproximadamente significa desfoque significa filtragem, significa média, então o efeito é ligeiramente melhorado, mas não muito forte.

Então aqui se diz que quando houver uma luz dominante, o resultado será melhor.

Como sempre, considere primeiro as instruções de compilação relevantes.

A coisa maravilhosa aqui é sobre a variável de textura, que contém dados e status de amostragem, o último pode incluir alguns modos de filtro, etc.

Normalmente, uma textura é ambos. Mas às vezes podemos considerar manter apenas um para economizar.

Aqui, como os métodos de amostragem de direcional e intensidade são exatamente os mesmos, a unidade não nos ajudou a gerar o estado de amostragem ao gerar o primeiro.

Neste momento, precisamos usar o mesmo estado de amostragem como intensidade. Em seguida, as funções usadas aqui são transformadas.

Como não há estado de amostragem próprio, é necessário indicar claramente qual estado de amostragem está sendo usado, portanto, uma macro é alterada aqui e um parâmetro adicional é passado.

Depois de obtê-lo, existem algumas operações de decodificação e alguns outros problemas de comprimento de unidade, e todas essas funções do Unity resolveram isso para nós, basta chamá-lo diretamente.

Eu era estúpido antes e comparei diretamente antes de usá-lo, é claro que não tem efeito.

Depois de aplicar este normal aqui, você pode realmente ver uma grande otimização, mas ainda existem algumas diferenças em relação à luz direta.

O efeito está ficando cada vez melhor e os problemas são resolvidos um a um. Agora vem o problema novamente.

Trata-se de objetos dinâmicos, que não são afetados pela luz de cozimento, portanto, quando há luz de cozimento e esse objeto dinâmico na cena,

Este objeto dinâmico está um pouco fora de lugar. Uma situação extrema é dada acima, ou seja, quando há apenas luz de cozimento, o objeto dinâmico é diretamente preto.

Para adicionar luz ambiente à luz dinâmica aqui, a sonda, a sonda de luz, é usada aqui.

No passado, o cálculo da luz ambiente era baseado nos dados ambientais globais ao redor do objeto atual, mas agora é calculado usando sondas, e as informações de luz do ambiente circundante são armazenadas nas sondas.

Pode ser entendido como absorvedor de luz, ele absorve a luz ambiente circundante e, em seguida, ilumina objetos dinâmicos.

Esta sonda é feita usando harmônicos esféricos.

Aqui estão alguns recursos sobre sondas.

Por exemplo, cada sonda mencionada aqui será particionada e, em seguida, interpolará a função harmônica esférica de acordo com a posição e tratará o objeto dinâmico como um ponto.

—————————————————————————————————————————————————— ——————————————————————————————————————————————————

Renderização

Existem muitas limitações na luz indireta do efeito de cozimento anterior.

Tanto o tempo real completo quanto o completo têm suas próprias limitações.

Aqui é dito principalmente que a luz indireta é possuída pela luz de cozimento, mas não pela luz em tempo real. E ela pode trazer bons resultados, então considere uma colheitadeira.

Isso é realmente viável.

Não basta modificar apenas uma configuração acima, precisamos também fazer uma configuração na própria luz.

Altere o modo da luz para misto.

Aqui para corrigir um erro cognitivo anterior, pensei que toda a luz indireta foi cozida antes, o que é um grande erro.

Como o único modo de luz em nossa cena é cozido, é óbvio que essa luz paralela é cozida.

A razão pela qual é considerada toda a luz indireta do Bake é que, ao calcular no shader, o resultado da amostragem do lightmap é atribuído a indirect.diffuse

De fato, apenas olhar para este ponto parece apenas assar a luz indireta, mas não considera que o resultado do cálculo da luz direta no passe de corrente é 0.

Como a luz está definida para assar, ela não é considerada ao calcular a luz direta.

Portanto, toda a iluminação é assada.

Mas quando mudamos o modo de luz para misto, só podemos assar luz indireta, e a parte da luz direta é calculada em tempo real.

Portanto, para a parte da luz indireta, há o efeito de escurecimento do lightmap acima.

Neste momento, o problema volta, o efeito de fade da sombra é inválido, podemos reduzir a distância da sombra para observar isso com mais clareza.

O principal motivo é que o Unity fez uma atualização para algumas coisas sobre esse cálculo de sombra.

Anteriormente, nossa operação de sombra era uma trilogia. Primeiro, criamos uma variável de coordenada, depois a transformação de coordenadas e, finalmente, amostramos o mapa de sombra.

As duas primeiras macros agora foram alteradas. Torna-se a forma acima,

Aqui está um ponto digno de nota: após a atualização, apenas as coordenadas de sombra do espaço da tela da luz paralela são colocadas no interpolador.

Além disso, as coordenadas do mapa de luz são usadas em uma máscara de sombra. Aqui você precisa fornecer as coordenadas de um lightmap.

Além disso, há um bug aqui, então devemos inicializar o Interpolador.

Agora que observamos essa sombra, ainda não há efeito de fade.

Principalmente porque está atualmente no modo misto, com iluminação em tempo real e efeitos de mapa de luz ao mesmo tempo.

Não, precisamos escrever nós mesmos. Felizmente, já escrevemos coisas relacionadas quando atrasamos a renderização, para que possamos atribuir valores diretamente aqui e fazer uma pequena modificação.

Por fim, só precisamos fazer esse fade manualmente quando a definição de macro acima for necessária, portanto, adicione um julgamento.

Aqui, como o Bake indireto é caro, um novo modo é introduzido, que é o Shadowmask, que também tem Baked Light indireto.

e luz direta em tempo real.

O que o primeiro faz: para todos os objetos, ele passará em tempo real, independentemente de estático e dinâmico. Em seguida, faça uma amostra no mapa de luz cozido e complemente a parte da luz indireta

ir para cima. Esta parte tem apenas luz indireta e é complementada apenas para objetos estáticos.

Para o modo de máscara de sombra, ele armazenará luz indireta e atenuação de sombra no mapa de luz.

Na verdade, para ser franco, é um mapa de luz tradicional, porque o armazenamento de luz inevitavelmente contém informações de atenuação de sombra. O lightmap que não considera a existência de luz direta também é

Existem algumas sombras. Essa é a sombra aqui. Na verdade, é um gráfico de mapa de luz simples que registra o valor da luz indireta.

Depois, há a máscara de sombra, que é uma imagem semelhante ao mapa de sombras do espaço da tela anterior (uma imagem que é 0 ou 1)

Quando a luz indireta não é considerada, o cálculo normal da iluminação e, em seguida, a amostragem do mapa de sombra para fazer uma atenuação, o lightmap aqui é equivalente ao antigo cálculo normal da iluminação.

O último é a atenuação.

Há muitos erros nas ideias acima, e todos eles são peidos. Vamos resumir e classificar:

O que é luz indireta cozida? O que são sombras cozidas? Como os objetos recebem sombras cozidas?

Para uma cena que considera apenas luz indireta, imagine uma bola e um chão. Se for considerada apenas a luz indireta, de fato, a diferença de cor entre as duas é basicamente a mesma, e o fundo da bola pode ser um pouco mais escuro.

Neste momento, toda a cena é registrada no mapa , que é a luz indireta assada.

Quanto às sombras, a luz direta precisa ser considerada. Na verdade, quando se trata de sombras, o jogo considera sombras diretas. Ou seja, sombras produzidas pela luz direta.

E sombras cozidas consideram uma cena com luz cozida . Nesse momento, ele iluminará o objeto.Como a bola impede que o chão receba luz, o chão projeta uma sombra.

Isso é o que chamamos de sombras cozidas. Um ponto importante disso é que ele precisa ser Bake Light, e somente Bake Light será considerado ao gerar lightmap .

No começo aqui ficou uma dúvida, ou seja, as sombras cozidas, não foram todas geradas quando o lightmap é gerado. amostragem direta

Você pode obter o resultado da sombra, por que você precisa de uma máscara de sombra como uma máscara, que é 0 ou 1 para gravar a área de sombra.

O ponto-chave desse mal-entendido é que ele não leva em conta que objetos dinâmicos aceitam sombras cozidas.

Em primeiro lugar, objetos estáticos aceitam sombras assadas, e você realmente não precisa se preocupar com as áreas de sombra que são 0 ou 1 , porque todas são assadas. Este é o tipo de cena em que a iluminação é assada

Como renderizar. Todas as cores de objetos estáticos vêm da amostragem.

Mas, uma vez considerados os objetos dinâmicos, não há como fazê-lo. Não há nenhuma informação sobre isso no mapa cozido. Não foi possível amostrar.

E se você quiser que ele receba sombras cozidas. Então você só pode usar o método de processamento de sombra semelhante antes, ou seja, preparar uma máscara de sombra .

Indica que essas áreas são áreas de sombra cozida. Como esta é a área de sombra assada, este mapa pode ser completamente pré-gerado.

Após a pré-geração, ao renderizar, apenas experimente. Para uniformidade, os objetos estáticos também usam cálculos de máscara de sombra ao considerar as sombras integradas recebidas .

Em vez de ir para a amostragem de mapa de luz .

Modo de Iluminação: Baked Indirect - Unity Manual

Agora, de volta ao artigo, no modo shadowmask,

Nesta frase, a atenuação indireta de luz e sombra é armazenada em mapas de luz.

Em primeiro lugar, não há dúvidas sobre a luz indireta. O que é a sombra de atenuação mencionada aqui? Na verdade, é a sombra cozida, ou seja, a sombra gerada pela luz de cozimento é cozida nos mapas de luz.

Então, no modo shadowmask, uma textura adicional será criada para a formação da sombra cozida, que é a shadowmask.

Então o seguinte, o que ele disse é um pouco impreciso, para ser preciso, essa máscara de sombra não tem nada a ver com objetos dinâmicos, então todos os objetos dinâmicos que forem iluminados aparecerão na máscara de sombra.

Neste efeito, não importa se é estático ou dinâmico, há menos sombras cozidas.Primeiramente, não deve haver menos objetos estáticos, porque suas informações de sombras cozidas podem ser obtidas do mapa de luz.

Mas não fez isso. Dissemos antes que, para garantir a unidade, o efeito de sombra é feito por meio da amostragem de máscara de sombra, assim como objetos dinâmicos.

Nós não fizemos o trabalho de samplear máscara de sombra até agora, então não há nenhum efeito dessa sombra assada.

Na verdade, a sombra assada não deve ser salva no mapa de luz, uma porque não há necessidade de amostrar a sombra assada e a outra é que, se for salva, afetará o

A amostragem de luz indireta afeta.

Em seguida, precisamos de amostragem para complementar esse efeito de sombra cozida.

Em primeiro lugar, isso é primeiro amostrado para obter BakedAtten.Na verdade, é 0 ou 1, semelhante ao mapa de sombras do espaço da tela, e esse valor é usado como a atenuação da sombra Baked.

Em seguida, combinada com a atenuação, esta é a atenuação das sombras em tempo real. Há também uma variável sobre o fade da sombra da borda, e esses três são considerados de forma abrangente para obter

O valor de queda final.

Preste atenção na captura de tela do documento acima, máscara de sombra pura, objetos estáticos não têm sombras em tempo real, apenas sombras cozidas, preste atenção na diferença da indireta de cozimento anterior

E o mapa de sombras de distância estará lá.

Para objetos dinâmicos, sombras em tempo real serão projetadas, então aqui está:

O que é dito aqui é que objetos estáticos estão sujeitos a sombras em tempo real e sombras cozidas de objetos dinâmicos ao mesmo tempo.

E aí vem outro problema, que é o problema dos limites das sombras cozidas.

Suplemento: Objetos dinâmicos não possuem a macro LightMap_On, portanto, eles não amostrarão o mapa de luz.

Ao considerar a máscara de sombra na renderização diferida, na verdade, apenas mais uma imagem de máscara de sombra precisa ser armazenada e o restante é completamente semelhante às sombras anteriores.

O julgamento posterior aqui depende principalmente se a plataforma está OK, porque o gbuffer de saída é armazenado usando o destino de renderização e o número de destinos de renderização é limitado.

Quando é usado aqui, é pontilhado com um seletor aqui, principalmente como mencionado acima, uma imagem de máscara é toda vermelha, porque os dados são armazenados no canal R

Relacionado, aqui está para tirar a máscara de sombra de uma certa luz sob a máscara de sombra. Então como atenuação.

Então, sobre esse fade, em primeiro lugar, o shadowFade da bola é calculado de acordo com o tipo de fonte de luz da passagem atual. De acordo com o algoritmo antigo,

Estamos fazendo uma modificação no shadowAtten, que é a atenuação direta da sombra da luz atual.

Na verdade, a atenuação indireta da sombra é trazida aqui e, em seguida, uma função é alterada para fazer o cálculo final.

Acho que você gosta

Origin blog.csdn.net/yinianbaifaI/article/details/127702725
Recomendado
Clasificación