Unity – Map d’Ambiant Occlusion et Diffuse dans Atlas

Bonjour,

j’utilise fréquemment des atlas créés sous Photoshop comme supports pour des modélisations simples, tels que des bâtiments ou certains objets mécaniques répétés dans une scène.

ao_print_exemple

Pour un rendu réaliste, et sur une scène de petite taille, il faut dire que le calcul de lightmap avec ambient occlusion fonctionne très bien pour un rendu très correct.

Cependant, si l’on doit utiliser cette méthode sur une scène lourde, avec un nombre de meshs conséquent, on va droit au mur.. .Une des solutions est de baker une passe d’ambient occlusion sur l’objet low poly, et de l’utiliser dans Unity.

CGTextures est mon ami,  je prends plusieurs textures que je réuni dans une seule : l’Atlas.

Pour la normale et la spéculaire, j’utilise crazy bump.

Une fois ma texture d’Atlas créée, je modélise mon mesh sous blender.

ao_blender

 

ao_blender_uv

Avec ce système, il est facile de créer différents mesh avec la même texture.

Pour préparer le mesh au baking de l’Ambient Occlusion, vu que l’on utilise une texture atlas, il faut créer un deuxième channel sur lequel on va utiliser un autre dépliage UV. Pour le dépliage, on peux utiliser le dépliage dédié au lightmapping, U -> Lightmap Pack.

Ensuite, il faut baker l’AO. Sous Blender, c’est possible, mais pas terrible. On va utiliser 3DCoat pour cette tache. J’ai supprimé le premier channel d’UV et j’ai exporter en .obj mon objet.

Ensuite j’ai importé ce mesh dans 3D Coat pour baker l’Ambient Occlusion :

ao_3dcoat

J’ai choisi « Hémisphère » comme source lumineuse, et le nombre de lumière à 512 – Sûrement inutile d’aller si haut.

Un café plus tard, on a un résultat semblable :

ao_map

Ce que j’ai fait sur ce mesh, c’est que j’ai peint sur sa base un peu de noir avec un opacité faible. Cela permettra plus tard de simuler l’AO avec le sol de la scène. Une autre solution consiste à utiliser un plane que l’on colle à la base du mesh (Merci Alex ;)). J’exporte la texture dans un format non destructeur comme du .png.

Maintenant, dernière étape : Unity

Problème : Aucun shader pour utiliser ma map d’Ambient Occlusion.

Donc j’en ai créé un :

 

Shader "Ambiant Occlusion/Bumped Specular Ambient Occlusion" {
	Properties {
		_Color ("Main Color", Color) = (1,1,1,1)
		_SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 1)
		_Shininess ("Shininess", Range (0.03, 1)) = 0.078125
		_MainTex ("Base (RGB) Gloss (A)", 2D) = "white" {}
		_BumpMap ("Normal Map", 2D) = "bump" {}
		_AOTex ("Ambient Occlusion (RGB)", 2D) = "white" {}
		_AOFac ("Ambient Occlusion factor", Range (0.5, 30)) = 0.078125
		_Emis ("Emission factor", Range (0, 1)) = 0
	}
	SubShader { 
		Tags { "RenderType"="Opaque" }
		LOD 400

	CGPROGRAM
	#pragma surface surf BlinnPhong

	sampler2D _MainTex;
	sampler2D _BumpMap;
	sampler2D _AOTex;
	fixed4 _Color;
	half _Shininess;
	half _AOFac;
	half _Emis;

	struct Input {
		float2 uv_MainTex;
		float2 uv_BumpMap;
		float2 uv2_AOTex;
	};

	void surf (Input IN, inout SurfaceOutput o) {
		fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
		fixed4 ao = tex2D(_AOTex, IN.uv2_AOTex);
		ao.rgb = ((ao.rgb - 0.5f) * max(_AOFac, 0)) + 0.5f;
		o.Albedo = tex.rgb * _Color.rgb * ao.rgb;
		o.Gloss = tex.a;
		o.Alpha = tex.a * _Color.a;
		o.Specular = _Shininess;
		o.Emission = tex.rgb * _Emis;
		o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
	}
	ENDCG
	}

	FallBack "Specular"
}

J’ai ajouté deux réglages également : un qui augmente le contraste de la map d’AO, ce qui a pour effet direct d’augmenter ou atténuer l’effet en temps réel, un autre pour l’émission, ce qui, dans mon cas est très utile.

ao_shader

N’hésitez pas à présenter vos solutions !

2 commentaires

  1. Beau boulot, bravo ! Super rendu réaliste.
    N’étant pas un spécialiste de l’AO, le beast ne permet-il pas d’obtenir le même effet en jouant le paramètre d’AO ?

  2. Merci 😉
    Avec le beast, on obtient un résultat visuel supérieur, mais il y’a un temps de rendu important, et le poids des textures qui peux poser problème, surtout pour du webplayer.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Website Protected by Spam Master


*