Pergunta

Como jogos de computador tornam a sua terra? Eu vou estar usando um heightmap para a geometria (embora eu vou depois otimizá-lo), mas eu estou querendo saber qual a melhor técnica é, por exemplo, para 'pintar' a minha terra; grama mais em todos os lugares, caminhos de terra, aqui e ali, cascalho dentro cidades e suavizar as transições entre cada tipo de material.

Do eu só uso um enorme textura pré-cozido? Isso parece muito ineficiente, quando eu poderia telha texturas existente. Assim então eu uso um mapa alfa enorme para cada textura existente? Em teoria, isso soa bem para mim, mas como eu realmente vai fazer sobre isso e quais são as consequências? Eu realmente não sei por onde começar, e minhas pesquisas do Google não estão se mostrando muito eficaz.

Eu prefiro não ter de 'tirar' a textura à rede (ou seja, o espaço (0,0) é grama, espaço (0,2) é sujeira, espaço (0,1) é de transição grama de terra) ; Eu prefiro ser capaz de pintar arbitrariamente de modo que parece mais convincente. É claro que seria o caminho mais fácil, mas é muito de um sacrifício na qualidade gráfica e 'realismo'.

Estou na maior parte apenas olhando para a teoria e as opções aqui. Eu estou usando OpenGL isso, se você pode fornecer dicas, tanto quanto maneira de fazer as coisas de OpenGL e funções que eu nunca deve ter ouvido falar, isso seria ótimo.

Apenas para esclarecimento, Oblivion é uma boa referência sobre o que eu estou procurando. Eu não sei como a geometria do terreno é (heightmap, 3D modelos estáticos, etc), mas seu terreno tem diferentes tipos de solo e suavizar as transições entre eles, como eu estou falando. Aqui está uma imagem de exemplo, observe como as misturas de paralelepípedos na grama, irrealisticamente, mas sem problemas: http://www.elitistsnob.com/images/Oblivion%202006-05-21%2008-38-25-15.jpg

Também acho que eu li sobre isso em um dos jogos de programação Gems livros, mas eu não prestei muita atenção a ela no momento, e agora que é verão eu não tenho acesso à biblioteca da minha universidade para verificação ! Estou à procura de tabelas de conteúdos agora e editar vontade se eu encontrá-lo, mas eu ainda não será capaz de lê-lo até meados de agosto.

EDIT: Homem Ah, Gems programação de jogos 7 tem um capítulo 5.8 intitulado "Mapeamento de Texturas grandes para exterior Terrain Rendering", que soa como exatamente o que eu preciso, mas biblioteca do meu U não tem mesmo esse livro! Eu não poderia encontrar qualquer coisa exatamente assim nos outros livros Gems Jogo de programação, apesar de um casal teve alguns artigos geometria terreno.

Foi útil?

Solução

Eu escrevi recentemente um motor de renderização terreno pequeno em OpenGL que faz algo semelhante ao que você está falando. O uso técnica que é melhor descrito como textura splatting .

Eu uso cinco texturas para alcançar este objetivo. Quatro desses texturas são detalhe texturas: grama, pedra, água e areia. Estas texturas são pequenos, 512x512 texturas, e eles estão lado a lado em todo o terreno. O quinto textura é um mixmap. O mixmap é uma textura gigante que cobre todo o terreno, no meu caso é 4096x4096.

MixMap

Esta mixmap usa todos os 4 canais de cor (R, G, B, A) para descrever o quanto de uma textura detalhe para exibição naquele local específico. Eu estou usando o canal de cor vermelha para determinar quão opaca a areia é, o verde é para a grama, azul é para a água, e alfa é para rock. Este mixmap é calculado com base fora do heightmap na inicialização e uso altitudes para determinar esses valores. Por exemplo, perto do nível do mar, que na maior parte quer de água, de modo que definido um valor elevado no canal azul e valores baixos nas outras os canais. Como eu recebo mais elevada para as montanhas, eu definir o canal alfa da cor para um valor alto desde que eu quero um monte de textura da rocha, mas eu definir todos os outros canais de cor para valores mais baixos.

Fragment Shader

Esta mixmap é então colocado em uso no shader de fragmento, onde eu levar esses canais de cor da mixmap e usá-los para combinar as texturas de detalhe. Aqui está o código GLSL que estou usando para o shader de fragmento:

uniform sampler2D alpha;
uniform sampler2D grass;
uniform sampler2D water;
uniform sampler2D rock;
uniform sampler2D sand;
uniform float texscale;

varying vec3 normal, lightDir ;

void main()
{
   // Get the color information
   vec3 alpha    = texture2D( alpha, gl_TexCoord[0].st ).rgb;
   vec3 texSand  = texture2D( sand, gl_TexCoord[0].st * texscale ).rgb;
   vec3 texGrass = texture2D( grass,  gl_TexCoord[0].st * texscale ).rgb;
   vec3 texWater = texture2D( water, gl_TexCoord[0].st * texscale ).rgb;
   vec3 texRock  = texture2D( rock,  gl_TexCoord[0].st * texscale ).rgb;

   // Mix the colors together
   texSand *= mixmap.r;
   texGrass = mix(texSand,  texGrass, mixmap.g);
   texWater = mix(texGrass, texWater, mixmap.b);
   vec3 tx  = mix(texWater, texRock,  mixmap.a);

   // Lighting calculations
   vec3 dl = gl_LightSource[0].diffuse.rgb;   
   vec3 al = gl_LightSource[0].ambient.rgb;
   vec3 n = normalize(normal);
   vec3 d = tx * (dl * max( dot ( n, lightDir), 0.0 ) + al );   

   // Apply the lighting to the final color   
   vec4 finalColor = vec4( min(d, 1.0), 1.0);
   gl_FragColor = mix(gl_Fog.color, finalColor, fogFactor);
}

O texscale uniforme é um valor que determina quantas vezes as texturas de detalhe são de azulejos em todo o terreno. Valores mais altos fará com que as texturas detalhe olhar mais nítidas com o risco de fazê-los parecer mais repetitivo.

Outras dicas

prebaking certamente não é ineficiente. que é o mais eficiente na verdade, porque o seu código de tempo de execução não tem que fazer qualquer mistura ou outros cálculos. ele apenas torna a textura. Claro, as técnicas dinâmicas oferecem uma simplificação do conjunto de ferramentas e mais opções.

ID parecem ter feito o único grande 32K "megatextura" (estamos falando ^ 2-128K ^ 2) trabalho em QuakeWars.

Há um Q & A interessantes com Carmack sobre ele em

http://web.archive.org/web/20080121072936/http://www.gamerwithin.com/?view=article&article=1319&cat=2

(link original parece morto atualmente, mas não não fazer o acima de um link, porque SO parece ter problemas com links Internet Archive; eles ficam bem na edição prévia, em seguida, quebrar na página principal).

Uma das maneiras convencionais, utilizados, por exemplo no motor de fonte (HL2), é ter um vértice alfa por se misturar entre os dois materiais. Os materiais consistem geralmente em pelo menos um albedo e um mapa normal. No motor de fonte apenas 2 materiais por material de "mistura textura" é é permitido, que é tipo de porcaria.

Se você quiser mais de 2 materiais que você tem que simulá-lo por texturização diferentes deslocamentos com diferentes texturas, certificando-se de que qualquer telha indivíduo só contém 2 materiais no máximo.

Ter um alfa por vértice ao invés de por pixel dá uma aparência muito ruim. Como você anotou na Oblivion você começa paralelepípedos misturando suavemente na areia por exemplo. Há uma correção para esse defeito; você usa outra textura que modula o alfa em uma base por pixel, de modo que as fendas entre as pedras do pavimento encher com areia prontamente, mas os topos das pedras do pavimento permanecem em quase 1.0 alpha até o alfa vértice interpolada é quase 0 para a calçada material. Isso pode fazer o olhar de transição muito bom em vez de apenas uma mancha feia.

Você também pode usar um res textura baixa que contém os alfas (mas ainda muito maior do que 1 alfa por vértice). O azulejos terain texturas pode ser 2048x2048, mas a textura usada para misturá-los toghether não precisa de resolução por texel. Um 256x256 8-bit por textura texel é apenas 96 kB com mapas MIP.

Geralmente, áreas de transição são precreated, embora seja possível fazer algumas coisas com alfa canais e mistura de texturas.

Você não pode fugir de ladrilhos, mas talvez se você usar uma textura base que faz um pouco de barulho no chão, parece que não há nenhuma telha ...

Textura de base

uso com as mesmas coordenadas de textura de alfa textura. Textura de base pode ser qualquer coisa .. uma imagem satélite, ou uma textura de grama .. ele iria corresponder perfeito se ele está relacionado com a sua forma chão ..

e tentar usar texturas sem emenda para seu grama, texturas de rock ... não resolve, mas faz com que pareça como não há nenhum problema

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top