Iluminação em um mundo Minecraftian

10

O Minecraft é um jogo que é amplamente baseado em um mapa de altura e usa essas informações do heigtmap para inundar o mundo com luz. Pelo meu entendimento, o ponto mais alto no mapa de altura é o fim da área influenciada pela luz solar. Tudo acima disso é iluminado pela luz solar, tudo abaixo disso é apenas influenciado pela luz próxima em um raio de 8 blocos.

Assim, se você tem uma ilha flutuante no topo do seu mundo, tudo abaixo dela será visto essencialmente como uma caverna. Quando duas luzes influenciam o mesmo ponto, a luz mais brilhante vence (insegura sobre isso).

De qualquer maneira, existem alguns problemas com o modelo de iluminação de minecrafts: primeiro, se o seu mundo não possui um mapa de altura, fica mais difícil descobrir o que exatamente deve emitir luz solar e o que não. Uma maneira simples seria assumir que o mundo é (no meu caso) uma rocha flutuante e, em seguida, percorrer cada eixo de ambas as direções e descobrir onde a rocha começa e termina. Mas isso não elimina completamente o problema, pois os dentes da rocha não devem estar no escuro.

O próprio Minecraft armazenará em cache as informações de luz em seus blocos, juntamente com as informações sobre o material de um bloco. Portanto, somente se o mundo for modificado, a iluminação deverá ser atualizada. Infelizmente, esse processo ainda é bastante lento nas atualizações e nas rápidas mudanças de luz, pode-se ver o atraso da iluminação. Isso é especialmente verdadeiro se muitos blocos forem alterados (TNT, pôr do sol etc.) e você não estiver executando o computador mais rápido (ou Java no Mac).

Do meu conhecimento ainda limitado de gráficos 3D que ilumina um mundo como minecraft não deve ser o maior problema. Como você resolveria o problema?

Eu acho que os requisitos básicos para iluminação em um mundo voxel seriam

  1. atualizar rápido o suficiente para que isso possa ocorrer em um único quadro. Pode-se conseguir fazer a iluminação no dispositivo gráfico e baixar as informações de luz alteradas na RAM principal.
  2. as informações de luz devem estar rapidamente disponíveis para a lógica principal do jogo, de modo que não sejam inteiramente baseadas no dispositivo gráfico: raciocínio: a luz afeta o crescimento da grama, a desova de monstros etc.
  3. as atualizações de luz teriam que ser localizadas em um pedaço ou ter algum outro limite para que não fosse necessário reavivar o mundo inteiro, que pode ter um tamanho muito grande.

A idéia principal seria tornar as atualizações de luz rápidas, não necessariamente mais bonitas. Para melhorias gerais no desempenho da renderização leve, pode-se adicionar facilmente o SSAO além daquilo que deve resultar em mundos muito melhores.

Armin Ronacher
fonte

Respostas:

7

A iluminação no Minecraft é calculada de forma assíncrona e é inserida na geometria. Não é feito em tempo real.

Cada voxel armazena a iluminação para esse voxel, provavelmente como um byte único (ou 2, o entalhe usa uma abordagem em camadas para possibilitar ciclos diurnos e noturnos). Existem apenas 16 níveis de luz. Para iluminar o mundo, o Minecraft faz 2 passes. Um para a luz do sol e outro para propagar ou inundar a luz em cavernas e tal. A iluminação é localizada porque qualquer fonte de luz só pode propagar sua luz no máximo a 16 quarteirões de distância. Água e lava funcionam quase da mesma maneira.

Mais informações estão disponíveis em seu blog: http://notch.tumblr.com/post/434902871/per-request-this-is-how-the-new-lighting-will-work

zfedoran
fonte
Eu sei. Acho que escrevi isso acima (menos a resolução de brilho de 4 bits).
Armin Ronacher
1

Você não pode usar GPU Render to Texture e armazenar seus resultados em buffer duplo para ter sempre informações de iluminação computadas disponíveis para reler cada quadro?

Como você organizaria esses dados para a iluminação depende inteiramente de você, mas não vejo por que essa não deve ser a primeira opção de investigação se tudo o que você deseja fazer é melhorar a velocidade do seu algoritmo de iluminação ..?


fonte
Exatamente o que eu estava pensando. Praticamente todas as GPUs, diferentemente da maioria das CPUs, são PROJETADAS para esse tipo de exercício computacional paralelo maciço.
Grant Peters
1

As pessoas de renderização em tempo real parecem ter um caso de amor com o Minecraft. Houve um comentário sobre como eles ainda não descobriram a iluminação .. mas você pode querer ficar atento a novos desenvolvimentos / links.

http://www.realtimerendering.com/blog/?s=minecraft

Viciado em Oolong
fonte