Instrucciones para llenar Unity Pit (2): oscurecimiento del horneado en dispositivos móviles
Dado que las pantallas de diferentes dispositivos tienen diferencias de color y brillo, el primer paso para confirmar el problema es tomar una captura de pantalla y copiarla en el mismo dispositivo para observar. Tomando una captura de pantalla del teléfono móvil, enviándola a la computadora y luego comparándola con la misma pantalla, descubrí que efectivamente había una gran diferencia en el brillo de la escena, que no se observó en el personaje, por lo que se especuló que era un problema relacionado con LIGHTMAP.
Para hacer una demostración sencilla, utilizamos materiales estándar para compararlos con los materiales utilizados en nuestros propios proyectos, y descubrimos que también teníamos este problema, lo que descartó errores en nuestros propios materiales.
Debido a que estamos usando un espacio lineal, cambiamos el espacio de color para experimentos de comparación y descubrimos que también hay una diferencia de color en el espacio gamma, pero no es tan obvia como el espacio lineal.
Como es habitual, primero buscamos y recopilamos información relevante.
Sospecho que es un error oficial en el motor de Unity (que es el punto fuerte de Unity).
Lo primero que hice fue buscar el error que quería informar en IssueTracker. AKED LIGHTMAP ES MÁS OSCURO EN LA PLATAFORMA ANDROID EN COMPARACIÓN CON LA PLATAFORMA PC, se dice que está solucionado en la versión Unity 5.5.5, pero no menciona la configuración del espacio lineal. Tenemos que realizar pruebas en julio y no podemos esperar a la versión 5.5.5, por lo que grabaremos. por ahora y continuar.
UWA Issues tiene un hilo con una pregunta y respuesta relacionadas: Lightmap se muestra bien en PC, pero hay diferencias de color cuando se traslada a Android, y los colores generalmente son más oscuros. Aquí hay una cita de la respuesta:
El motivo de la diferencia se da aquí, es decir, los mapas de Lightmap se almacenan en formato exr. Si se procesan de acuerdo con LDR, es normal que se produzcan desviaciones en el móvil. dispositivos También revisamos mis sugerencias y no hubo problemas correspondientes.
Entonces, ¿cómo solucionar el problema de que Lightmap es diferente en PC que en ios y Android?
Luego, encontramos una solución al diferente rendimiento de Lightmap en PC con ios y Android. Hay principios de análisis básicos, soluciones y código fuente, que parecen ser muy confiables. Hice una demostración e intenté seguir el proceso. Puede resolver el problema del oscurecimiento, pero también se volverá más brillante en comparación con la PC. Todavía hay una desviación, no sé si es un problema de espacio lineal, lo que no es ideal. Además, después de convertir la textura para usar el formato RGBA8, una textura 1024 necesita ocupar entre 4 y 5 M de espacio de almacenamiento y memoria, lo cual es ingrato de implementar.
No hace mucho, vi una publicación en Zhihu: Hablando sobre las habilidades de horneado de texturas ligeras, que mencionaba el tema de la multiplataforma y mencionaba:
Lo revisé y lo hice. Durante la demostración, el brillo de la textura era 0,63 y el brillo se ajustó a 1. El color antes de hornear probablemente tenía un brillo de aproximadamente 0,5-0,7. No sé si se debió a problemas de espacio lineal, pero aún así. no hay solución de todos modos. Sin embargo, este artículo cita directamente el código fuente en UnityCG.cginc, que es el proceso de análisis de color del mapa de luz. Vaya y eche un vistazo.
Después de luchar toda la noche, finalmente decidí modificar DecodeLightmapDeubleLDR para resolver este problema y lo probé al intentar modificar el material:
1. Cambie DecodeLightmapDeubleLDR a (decodeInstructions.x * pow(data.a, decodeInstructions.y)) * data.rgb; el resultado es el mismo;
3. Utilice unity_ Lightmap_HDR.x * color.rgb directamente;
Estoy muy preocupado. Aunque los resultados de la prueba son buenos, debido al proceso de cálculo diferente, no puedo buscar dónde se asigna un valor a unity_Lightmap_HDR y qué significa. Intenté modificar el valor y comparar los resultados. Siento que el valor es aproximadamente 5,0. Hay una definición de macro y un comentario, no sé si es relevante:
Ingrese PS para ver el mapa de luz y descubrí que el canal Alfa usado para ajustar los valores RGB casi no tiene negro o blanco, y solo algunos valores de escala de grises en algunos bordes. ¡Esto podría explicar por qué mis cálculos de ajuste después de eliminar el alfa parecen correctos! --Después de todo, el canal alfa no desempeña ningún papel. Encontré un mapa de iluminación de una escena interior y todavía se ve así, así que me pregunto si hay una configuración que no se usó correctamente en el horneado artístico.
Nota: Después de esta modificación, el mapa de luz se comprime en el formato ETC(2)_RGB4 y el canal alfa ya no es necesario. El mapa anterior de 1M 1024 se ha convertido en 0,5M, feliz ~~~. (ETC2_RGBA8 se usa en el medio Durante la prueba de formato, la escena resultó ser completamente negra. Es difícil para mí entender. Si alguien sabe el motivo, por favor dímelo. Muchas gracias ~~)
Finalmente, reemplácelo con el archivo UnityCG.cginc y elimine el archivo Libery. Compile el Shader en caché, reinicie Unity, configure el formato de textura de todos los formatos exr en ETC2_RGB4, vuelva a importarlo un poco y empaquetelo en el teléfono. y luego tomar capturas de pantalla a la PC para compararlas en la misma pantalla. Casi no hay diferencia en nuestras escenas.
En el diseño de ingeniería, el proceso de resolución de problemas siempre va acompañado de diversas conjeturas y confusiones. Al final, el problema se resuelve, algunas dudas también se resuelven y algunas dudas aún pueden resolverse.
La solución final se eligió en función del costo de tiempo, el costo de mantenimiento y la consistencia del resultado final, y soy muy consciente de que esta solución puede no ser adecuada para todos los proyectos. Dedicamos espacio lineal al desarrollo y producción en plataformas móviles para obtener efectos de personajes más detallados e iluminación consistente antes y después de hornear, y ahora, para resolver el problema de resultados de horneado inconsistentes en dispositivos y PC, hemos modificado nuevamente el archivo UnityCG.cginc, pero No sé dónde configurar la variable unity_Lightmap_HDR. .
De hecho, no sé si hay otros peligros ocultos en la solución que terminé usando, pero como dijo el artista cuando vio el resultado: "Es perfecto, se ve igual que la PC ¡Exactamente igual que antes!" Como dice el refrán en los gráficos por ordenador: si se ve bien, es correcto.
Hay mucho que se puede hacer en este momento...
Finalmente, si tienes el código fuente de Unity a mano, puede decirte los detalles de cómo configure la variable unity_Lightmap_HDR, o sepa Por favor dígame su documentación o lógica de configuración, y puede compartirla conmigo. Si hay algún problema al descubrir este programa, puede discutirlo conmigo ~ Muchas gracias. !