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