Jump to content
UnitySpain
Sign in to follow this  
Guest

Materiales, texturas y optimización

Recommended Posts

Guest

Buenas a todos.

Llevo tiempo con una duda rondándome la cabeza. Estoy creando un escenario para mi videojuego para PC. Esto es una casa donde además todo el juego se desarrollaría aquí dentro. Quiero conseguir una buena optimización y tengo entendido que no se recomiendan muchos materiales para la misma escena ya que resulta costoso para la GPU. El caso es que no se cuándo estoy ejerciendo una buena práctica en materia de optimización.

Cogí el escenario, con sus objetos repartidos por los distintos espacios, y lo convertí en un solo objeto. Entonces, desplegué las UVs con proyección inteligente para pintar sobre estas en substance Painter. La calidad baja mucho cuanto más grande es el objeto y menos espacio ocupa en el cuadro de UV. Entonces empecé a pintar y se vio borroso. La solución que vi era la de dividir el escenario en objetos independientes (pasillo, sala de estar, cocina...) para aplicarles un material distinto y de esta manera la calidad de las texturas aumentaría al expandir sus UVs por un espacio más amplio. También pensé en hacer de todos los objetos del escenario (sillas, lámparas, mesas...) un mismo objeto para así aplicarles el mismo material, habiendo antes desplegado las UVs y pintando luego para obtener la textura. Sin embargo, no se si voy a pasarme con los materiales en la escena. Podría probar y ver qué tal corre con varios materiales repartidos a los que además pensaba darles reflectividad y dotarlos de más realismo. Entonces ya nos metemos en tema de luces y también tengo entendido que no es muy recomendado meterle muchas luces a la misma escena porque resulta muy costoso para la GPU. Me gustaría que me recomendaran, si pudieran y la hubiera,  una mejor práctica para poder obtener el detalle que estoy buscando con los materiales y texturas dentro del marco de una buena optimización.

Muchas gracias y un saludo.

 

escenario3.jpg

Edited by Antonio Casas Rojas

Share this post


Link to post
Share on other sites

Buenas, antes de nada los puntos y aparte son tus amigos xD Facilitar la lectura ayuda a que la gente lea el post y sea más fácil entender tu problema.

Básicamente veo dos cosas importantes.

1- Con el tema de la optimización es mejor no obsesionarse. Sobre todo al principio y cuando la gente empieza tendemos a intentar a aplicar buenas prácticas sin mucho conocimiento, provocando dolores de cabeza. Lo más lógico de cara a empezar a trabajar es ir siempre de menos a más. Configura la escena con un control lógico sobre consumo, pero no te molestes en intentar reducir recursos al mínimo. Monta la escena, mira el consumo, y una vez en ese punto es cuando vemos qué y cómo podemos reducir consumo.

2- Relacionado con el primer punto. Estás siguiendo un flujo de trabajo que no es para nada óptimo. A la hora de montar niveles la forma estándar de cara a mejorar recursos como texturas o materiales es generar los assets de forma modular (un cacho de pared, una puerta, un cacho de suelo) y una vez importados a Unity montas el nivel. Eso te permitiría generar todo el interior a partir de un número determinado de assets. Te dejo un vídeo para que entiendas mejor a lo que me refiero.

https://www.youtube.com/watch?v=s0xe1OHD5Ow

Share this post


Link to post
Share on other sites
Guest

Buenas y gracias por contestar.
Intentaré que el texto sea más entendible :)

He visto el video pero no entiendo por qué esa práctica es mas óptima que la de exportar el escenario completo a Unity y aplicarle el material.

De la manera que sale en el video habría que trozear el escenario, exportarlo a Unity e ir metiendo cada pedazo en la escena. Sin embargo, me he fijado en el video que unas partes del escenario tienen materiales diferentes. ¿No es mejor utilizar el mismo material para todo el escenario o, al provenir todo de un mismo asset, no es tan costoso utilizar varios materiales para cada pedazo de escenario?

Hay algo más que no entiendo:  yo ya tengo el escenario montado en Blender. Si lo exporto a Unity me guarda toda la organización de los objetos. Si lo hago como en el video, tendría que montarlo de nuevo en la escena de Unity. Es por eso que no entiendo por qué es mejor ir metiéndolo por partes en la escena.

Muchas gracias y un saludo.

Share this post


Link to post
Share on other sites

Son varios aspectos, pero sin ver como has montado las Uvs es dificil ser más preciso.

Básicamente el problema que tenías es normal. Cuantos más objetos tengas en un mapa de de uvs mas resolución necesitará para que no haya pérdida de calidad. No estoy muy seguro de si te voy a explicar algo que ya sabes, pero me curo en salud explicándolo por si acaso. Si por ejemplo quisieses una pared larguísima muy detallada y pretendieses hacer la textura al completo tendrías un gran problema. Asumiendo que es un juego en primera persona y juegas en un monitor 1920 x 1080 en cuanto te acerques y la pared ocupase todo tu monitor, necesitarías al menos un mapa de 2048 x 24048 para que no hubiese pérdida, Si la pared en cuestión ocupase unas 5 pantallas estaríamos hablando de que necesitas en tu textura al menos 9600 px de ancho  (1920 px x 5) 

1.jpg

2.jpg

Obviamente esto no tiene ningún sentido. Necesitarías un mapa de varios miles de píxeles para poder montar una pared larga, así que la solución es tilear la textura. Hacemos una textura repetible y conseguimos el mismo efecto, reduciendo el coste.

3.jpg















Entonces, una vez entendido esto. ¿Porqué es mejor utilizar assets separados para montar el nivel? Pues hay varias respuestas. Como has visto, la mejor solución para grandes texturas es tilearlas, ¿es la única forma de hacerlo? No exactamente.

Para hacer este ejemplo, se podría hacer de cuatro formas diferentes, te las dejo de lo que me parece el más optimo al que menos, y te voy explicando el porque:

1. Prefab de fragmento de la pared y repetirlo en el editor: Te permite reeditar el nivel, cosa importante de cara al diseño. Es mucho más fácil tirar pruebas y encima es el consumo más reducido. Unity gestiona de forma diferentes los prefabs y al instanciarlo consume menos recursos que mallas independientes entre sí.

2- Hago la pared completa y un único material y uso su tiling: En este preciso caso la mejor solución, aunque  dependiendo de lo que tengas que hacer estarás más limitado que de la primera forma.

3. Hago la pared completa y depliego las uvs en cinco partes superpuestas sobre la textura repetible: Te generaría el mismo efecto pero pierdes capacidades. Vas a añadir más consumo y encima te limita la edición dentro del motor.

4.Hago un supermapa de 20000K para toda la pared: RIP ordenador.

Conclusión: El workflow de montar el nivel en el propio motor siempre es el más acertado. En el campo profesional, los artistas que se encargan de generar los assets no tienen porque ser precisamente quien los monte, pero aunque fuese así, sigue siendo el mejor. Tener la capacidad de montar el nivel, probarlo, hacer y deshacer dentro del mismo motor te ahorrará muchos quebraderos de cabeza ante cambios posibles. De cara a la optimización como te comenté también es mejor. Si hablamos de casos aislados da igual, pero siempre va a consumir menos 100 instancias de un prefab que 100 mallas independientes completamente iguales.
 

Edited by Shovah

Share this post


Link to post
Share on other sites

Podrías hacer un shader de bleding texture controlado por los canales RGBA con texturas tiling, esto también permitiría cambiar el tamaño de las UV de cada canal sin que afecte a los otros, con lo que podrías unir todos los objetos y usar un solo material en tu escena claro estaría limitado a los canales por lo que si quisieras añadir otros materiales en el mismo objeto tendrías problemas con la mezcla pero eso solucionario con objetos intermediarios.

Share this post


Link to post
Share on other sites
Sign in to follow this  

×
×
  • Create New...