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.

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


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 ..?


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.