Pregunta

Cómo hacer juegos de ordenador hacen que su suelo?Voy a estar usando un mapa de la geometría (a pesar de que más tarde optimizar) pero me estoy preguntando cuál es la mejor técnica es, por ejemplo, a la 'pintura' de mi tierra;la hierba de la mayoría en todas partes, senderos de tierra aquí y allá, grava interior de las ciudades, y suaves transiciones entre cada tipo de material.

¿Sólo tiene que utilizar una gran pre-horneados textura?Que parece muy ineficiente, cuando podía azulejo existente texturas.Así que, a continuación, hacer uso un enorme alfa mapa para cada textura existente?En teoría suena bien para mí, pero ¿cómo puedo realmente hacerlo y cuáles son las consecuencias?Yo realmente no sé por dónde empezar, y mis búsquedas de Google no están demostrando ser muy eficaz.

Yo prefiero no tener a 'snap' la textura a la red (es decir,espacio (0,0) es la hierba, el espacio (0,2) es la suciedad, el espacio (0,1) es la hierba-la suciedad de transición);Yo preferiría poder arbitrariamente de pintura para que parezca más convincente.Por supuesto que sería el camino más fácil, pero es demasiado de un sacrificio en la calidad de los gráficos y 'realismo'.

Estoy en su mayoría sólo en busca de la teoría y de opciones aquí.Estoy usando OpenGL, así que si usted puede proporcionar consejos tan lejos como OpenGL manera de hacer las cosas, y las funciones que puede que nunca lo han escuchado, eso sería genial.

Sólo una aclaración, el Olvido es una buena referencia en cuanto a lo que estoy buscando.No sé cómo el suelo de la geometría (mapa, la estática de los modelos 3D, etc), pero su terreno tiene diferentes tipos de suelo y transiciones suaves entre ellos, al igual que yo estoy hablando.He aquí un ejemplo de la imagen, observe cómo el adoquín se integra en la hierba, poco realista, pero sin problemas: http://www.elitistsnob.com/images/Oblivion%202006-05-21%2008-38-25-15.jpg

También creo que he leído acerca de esto en una de la Programación de un Juego de Gemas de libros, pero yo no le presto mucha atención a ella en el momento, y ahora que es verano no tengo acceso a mi biblioteca de la universidad para comprobar!Estoy buscando tablas de contenido ahora y editar si me parece, pero yo todavía no será capaz de leer hasta mediados de agosto.

EDITAR:Ah hombre, de la Programación del Juego Gemas 7 tiene un capítulo 5.8 titulado "Cartografía de Grandes Texturas de Terreno al aire libre de Representación", que suena exactamente lo que necesito, pero mi U la biblioteca no tener ese libro!No pude encontrar nada exactamente como esta en el otro Juego de Programación de Gemas libros, a pesar de que una pareja había algunos terrenos de la geometría de los artículos.

¿Fue útil?

Solución

Recientemente he escrito un pequeño motor de renderizado del terreno en OpenGL que hace algo similar a lo que está hablando. La técnica que utilizo es mejor descrito como textura splatting .

utilizo cinco texturas para lograr esto. Cuatro de estas texturas son texturas detalle: hierba, roca, agua y arena. Estas texturas son más bien pequeñas, 512x512 texturas, y ellos son de baldosas a través del terreno. El quinto textura es un mixmap. El mixmap es una textura gigante que cubre todo el terreno, en mi caso es 4096x4096.

MixMap

Esta mixmap utiliza todos los canales 4 de color (r, g, b, a) para describir la cantidad de un detalle de la textura que se vea en esa ubicación específica. Estoy utilizando el canal de color rojo para determinar el grado de opacidad es la arena, el verde es para la hierba, el azul es para el agua, y alfa es para el rock. Este mixmap se calcula con base fuera del mapa de altura en la inicialización y lo uso altitudes para determinar estos valores. Por ejemplo, cerca del nivel del mar, que en su mayoría quieren agua, por lo que establece un valor alto en el canal azul y valores bajos en los otros canales. Mientras que consigo más arriba en las montañas, me puse el canal de color alfa a un valor alto ya que quiero un montón de textura de la roca, pero me puse todos los demás canales de color a valores más bajos.

Fragmento de Shader

Esta mixmap se pone entonces para utilizar en el shader fragmento, donde tomo estos canales de color de la mixmap y utilizarlos para combinar las texturas de detalle. Aquí está el código que estoy usando GLSL para el 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);
}

El texscale uniforme es un valor que determina cuántas veces las texturas de detalle son de baldosas a través del terreno. Los valores más altos harán que las texturas del detalle un aspecto más nítido en el riesgo de hacer que se vean más repetitivo.

Otros consejos

horneado previo sin duda no es ineficiente. Es la más eficiente, de hecho, debido a que su código de ejecución no tiene que hacer cualquier combinación u otros cálculos. sólo hace que la textura. Por supuesto, las técnicas dinámicas ofrecen una simplificación de la cadena de herramientas y más opciones.

Identificación parecen haber hecho la gran "megatextura" (estamos hablando de 32 K ^ 2-128K ^ 2) trabajar en QuakeWars.

Hay una interesante Q & A con Carmack sobre él en

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

(enlace original, parece muerto en la actualidad, pero no no hacer lo anterior un enlace debido a que parece tener problemas con los enlaces de Internet Archive, sino que se ven bien en la edición de vista previa, y luego romper en la página principal).

Una de las formas estándar, utilizado por ejemplo en la fuente(hl2) del motor, es tener una por cada vértice de la alfa a la mezcla entre los dos materiales.Los materiales suelen consistir de al menos un albedo y un mapa normal.En el motor de la fuente sólo 2 materiales por "textura" de material es que está permitido, que es el tipo de mierda.

Si desea más de 2 materiales para simular texturado diferentes desplazamientos con diferentes texturas, asegurándose de que cualquier individuo azulejo sólo contiene 2 materiales que en la mayoría de los.

Tener un alfa por vértice en lugar de por píxel da un muy mal aspecto.Como se señaló en el Olvido de obtener adoquines mezclar suavemente en la arena, por ejemplo.Existe una solución para este defecto;utilice otra textura que modula el alfa en cada píxel, de modo que las grietas entre los adoquines de relleno con arena fácilmente, pero las copas de los adoquines permanecer en casi 1.0 alpha hasta el interpolados vértice alfa es casi 0 para el cobble material.Esto puede hacer que la transición se ven muy bonitos en lugar de sólo un feo de desprestigio.

También se puede utilizar una baja resolución de la textura que contiene los alphas(pero sigue siendo mucho mayor que 1 alfa por vértice).El suelo de baldosa terain las texturas pueden ser 2048x2048, pero la textura se utiliza para mezclar juntos no necesita por texel resolución.Una de 256x256 8 bits por texel de la textura es sólo 96 kB con los mapas mip.

En general, las áreas de transición están precreated, aunque es posible hacer algunas cosas con canales alfa y mezcla de texturas.

no puedes correr lejos del suelo de baldosas, pero tal vez si se utiliza una textura de la base que hace un poco de ruido en el suelo, parece que no hay suelo de baldosas ...

textura uso de la base con las mismas coordenadas de textura de la textura alfa. Textura base puede ser cualquier cosa .. una imagen satélite, o una textura de la hierba .. coincidiría perfecto si está relacionada con su forma de tierra ..

y tratar de usar texturas sin fisuras para su hierba, texturas de rocas ... no resuelve sino que hace que parezca que no hay problema

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top