ambiance RPG

Questions à propos du scripting Shader.
juliuson
Messages : 76
Inscription : 03 Mai 2017 18:00

ambiance RPG

Message par juliuson » 27 Jan 2018 11:44

Coucou à tous,

je souhaiterais réaliser un jeu video avec l'ambiance de team fortress 2.
J'utilise le code suivant :

http://leodomingues.com/2016/05/team-fo ... -in-unity/

Code : Tout sélectionner

Shader "Cell Shading/Team Fortress 2"
{
	Properties
	{
		_DiffTex("Diffuse Texture", 2D) = "white" {}
		_NormalMap("Normal Map", 2D) = "bump" {}
		_RampTex("Ramp Texture", 2D) = "white" {}
		_SpecExp("Specular Exponent", Range(0.1, 150)) = 20.0
		_SpecBoost("Specular Boost", Float) = 0.3
		_RimExp("Rim Light Exponent", Range(0.1, 150)) = 4.0
		_RimBoost("Rim Light Boost", Float) = 2.0
	}

	Subshader
	{
		Pass
		{

			Tags { "LightMode" = "ForwardBase" }

			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma multi_compile_fwdbase
			#include "AutoLight.cginc"
			#include "UnityCG.cginc"

			// Properties
			uniform sampler2D _DiffTex;
			uniform float4 _DiffTex_ST;
			uniform sampler2D _NormalMap;
			uniform float4 _NormalMap_ST;
			uniform sampler2D _RampTex;
			uniform float _SpecExp;
			uniform float _SpecBoost;
			uniform float _RimExp;
			uniform float _RimBoost;

			// Unity
			uniform float4 _LightColor0;

			struct a2v
			{
				float4 vertex : POSITION;
				float3 normal : NORMAL;
				float4 tangent : TANGENT;
				float4 texcoord : TEXCOORD0;
			};

			struct v2f
			{
				float4 pos : SV_POSITION;
				float4 tex : TEXCOORD0;
				float3 posWorld : TEXCOORD1;
				float3 normal : TEXCOORD2;
				float3 tangent : TEXCOORD3;
				float3 binormal : TEXCOORD4;
				float3 viewDir : TEXCOORD5;
				float3 lightDir : TEXCOORD6;
				LIGHTING_COORDS(7, 8)
			};

			v2f vert(a2v v)
			{
				v2f o;

				o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
				o.tex = v.texcoord;
				o.posWorld = mul(_Object2World, v.vertex);

				o.normal = mul(float4(v.normal, 0.0), _World2Object).xyz;
				o.tangent  = mul(_Object2World, v.tangent).xyz;
				float tangentSign = v.tangent.w * unity_WorldTransformParams.w;
				o.binormal = cross(o.normal, o.tangent) * tangentSign;
				o.viewDir = _WorldSpaceCameraPos.xyz - o.posWorld;
				o.lightDir = UnityWorldSpaceLightDir(o.posWorld);

				TRANSFER_VERTEX_TO_FRAGMENT(o);

				return o;
			}

			float4 frag(v2f i) : COLOR
			{
				// Directions
				i.normal = normalize(i.normal);
				i.tangent = normalize(i.tangent);
				i.binormal = normalize(i.binormal);
				i.lightDir = normalize(i.lightDir);
				i.viewDir = normalize(i.viewDir);
				float3 reflViewDir = reflect(-i.viewDir, i.normal);
				float3 reflLightDir = reflect(-i.lightDir, i.normal);

				// Normal
				float3 normalTangentSpace = UnpackNormal(tex2D(_NormalMap, i.tex * _NormalMap_ST.xy + _NormalMap_ST.zw));
				float3x3 tangentToWorldSpace = float3x3(i.tangent, i.binormal, i.normal);
				float3 normal = mul(normalTangentSpace, tangentToWorldSpace);

				// Albedo
				float4 albedo = tex2D(_DiffTex, i.tex.xy * _DiffTex_ST.xy + _DiffTex_ST.zw);

				// Lighting
				float atten = LIGHT_ATTENUATION(i);

				//// Diffuse
				float nDotL = dot(normal, i.lightDir);
				float4 ramp = tex2D(_RampTex, float2(nDotL * 0.5 + 0.5, 0.5));
				float4 diffuse = atten * _LightColor0 * ramp;

				//// Specular
				float vDotR = max(0.0, dot(i.viewDir, reflLightDir));
				float4 specular = atten * _LightColor0 * _SpecBoost * pow(vDotR, _SpecExp);

				//// Rim
				float fr = pow(1 - max(0.0, dot(normal, i.viewDir)), 4);
				float rim = fr * _RimBoost * pow(vDotR, _RimExp);

				//// Dedicated Rim
				float4 drim = max(0.0, dot(normal, float3(0, 1, 0))) * fr * _RimBoost;

				float4 lighting = UNITY_LIGHTMODEL_AMBIENT + diffuse + specular + rim + drim;
				float4 final = albedo * lighting;
				return float4(final.rgb, 1.0);
			}

			ENDCG
		}

		Pass
		{
			Tags { "LightMode" = "ForwardAdd" }
			Blend One One

			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma multi_compile_fwdadd
			#include "AutoLight.cginc"
			#include "UnityCG.cginc"

			// Properties
			uniform sampler2D _DiffTex;
			uniform float4 _DiffTex_ST;
			uniform sampler2D _NormalMap;
			uniform float4 _NormalMap_ST;
			uniform sampler2D _RampTex;
			uniform float _SpecExp;
			uniform float _SpecBoost;
			uniform float _RimExp;
			uniform float _RimBoost;

			// Unity
			uniform float4 _LightColor0;

			struct a2v
			{
				float4 vertex : POSITION;
				float3 normal : NORMAL;
				float4 tangent : TANGENT;
				float4 texcoord : TEXCOORD0;
			};

			struct v2f
			{
				float4 pos : SV_POSITION;
				float4 tex : TEXCOORD0;
				float3 posWorld : TEXCOORD1;
				float3 normal : TEXCOORD2;
				float3 tangent : TEXCOORD3;
				float3 binormal : TEXCOORD4;
				float3 viewDir : TEXCOORD5;
				float3 lightDir : TEXCOORD6;
				LIGHTING_COORDS(7, 8)
			};

			v2f vert(a2v v)
			{
				v2f o;

				o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
				o.tex = v.texcoord;
				o.posWorld = mul(_Object2World, v.vertex);

				o.normal = mul(float4(v.normal, 0.0), _World2Object).xyz;
				o.tangent  = mul(_Object2World, v.tangent).xyz;
				float tangentSign = v.tangent.w * unity_WorldTransformParams.w;
				o.binormal = cross(o.normal, o.tangent) * tangentSign;
				o.viewDir = _WorldSpaceCameraPos.xyz - o.posWorld;
				o.lightDir = UnityWorldSpaceLightDir(o.posWorld);

				TRANSFER_VERTEX_TO_FRAGMENT(o);

				return o;
			}

			float4 frag(v2f i) : COLOR
			{
				// Directions
				i.normal = normalize(i.normal);
				i.tangent = normalize(i.tangent);
				i.binormal = normalize(i.binormal);
				i.lightDir = normalize(i.lightDir);
				i.viewDir = normalize(i.viewDir);
				float3 reflViewDir = reflect(-i.viewDir, i.normal);
				float3 reflLightDir = reflect(-i.lightDir, i.normal);

				// Normal
				float3 normalTangentSpace = UnpackNormal(tex2D(_NormalMap, i.tex * _NormalMap_ST.xy + _NormalMap_ST.zw));
				float3x3 tangentToWorldSpace = float3x3(i.tangent, i.binormal, i.normal);
				float3 normal = mul(normalTangentSpace, tangentToWorldSpace);

				// Albedo
				float4 albedo = tex2D(_DiffTex, i.tex.xy * _DiffTex_ST.xy + _DiffTex_ST.zw);

				// Lighting
				float atten = LIGHT_ATTENUATION(i);

				//// Diffuse
				float nDotL = dot(normal, i.lightDir);
				float4 ramp = tex2D(_RampTex, float2(nDotL * 0.5 + 0.5, 0.5));
				float4 diffuse = atten * _LightColor0 * ramp;				

				//// Specular
				float vDotR = max(0.0, dot(i.viewDir, reflLightDir));
				float4 specular = atten * _LightColor0 * _SpecBoost * pow(vDotR, _SpecExp);

				//// Rim
				float fr = pow(1 - max(0.0, dot(normal, i.viewDir)), 4);
				float rim = atten * fr * _RimBoost * pow(vDotR, _RimExp);

				float4 lighting = diffuse + specular + rim;
				float4 final = albedo * lighting;
				return float4(final.rgb, 1.0);
			}

			ENDCG
		}
	}
	Fallback "Diffuse"
}
Le problème c'est lorsque je clique et déplace (drag and drop) le shaders dans le material, celui-ci devient de couleur magenta.

Votre aide est la bienvenue,

A+

Avatar de l’utilisateur
Max
Newser
Newser
Messages : 7871
Inscription : 30 Juil 2011 13:57

Re: ambiance RPG

Message par Max » 27 Jan 2018 12:02

Hello,

Le shader semble fonctionnel. Tu t'y prend comment exactement pour créer le shader ?
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

juliuson
Messages : 76
Inscription : 03 Mai 2017 18:00

Re: ambiance RPG

Message par juliuson » 27 Jan 2018 13:29

Pour créer un shader, je clique avec le bouton droit et je choisis "create puis , shaders, puis Standard Surface Shader".

Merci à vous,

A+

Avatar de l’utilisateur
Max
Newser
Newser
Messages : 7871
Inscription : 30 Juil 2011 13:57

Re: ambiance RPG

Message par Max » 27 Jan 2018 14:24

juliuson a écrit :
27 Jan 2018 13:29
Pour créer un shader, je clique avec le bouton droit et je choisis "create puis , shaders, puis Standard Surface Shader".
Une fois que tu as créé ce fichier, il te faut l'éditer, tu supprimes le code qui a été généré par défaut, et tu le remplace par l'intégralité du code donné sur la page dont tu fournis le lien. Par contre, en regardant le listing, en haut de page tu as deux fois Shader "Cell Shading/Team Fortress 2", bien sûr il ne faut en copier qu'un seul (en cas de doute, je l'ai ajouté dans ton premier message).
Une fois sauvegardé, tu vas sur ton material, et tu changes le shader 'Standard' par celui-ci (ou tu le drag direct sur ton material).
Cela devrait fonctionner.
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

juliuson
Messages : 76
Inscription : 03 Mai 2017 18:00

Re: ambiance RPG

Message par juliuson » 27 Jan 2018 16:13

Salut,

Lorsque je déplace le shader dans l'option "standard" d'un material celui-ci affiche une croix avec le curseur.
Par contre si je drag and drop le shader dans un material, ce dernier ne prends plus une couleur magenta, mais fonce un peu la texture.

Je me demandais ce que faisais le shader dans le material.
Est-ce que le code change la couleur, les textures, l'atmosphère...

Merci de votre attention,

A+

Avatar de l’utilisateur
Max
Newser
Newser
Messages : 7871
Inscription : 30 Juil 2011 13:57

Re: ambiance RPG

Message par Max » 27 Jan 2018 17:04

juliuson a écrit :
27 Jan 2018 16:13
Je me demandais ce que faisais le shader dans le material.
Est-ce que le code change la couleur, les textures, l'atmosphère...
Il serait bon de commencer par là alors. C'est dommage que tu n'ailles pas vers l'information alors que tu cherches à insérer tes propres shaders (même si tu utilises des codes existant).
Tient, pour y voir plus clair, un lien qui pourrait t'aider (en français). Cela parle des shaders GLSL, mais cette introduction vulgarise assez bien le concept.
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

juliuson
Messages : 76
Inscription : 03 Mai 2017 18:00

Re: ambiance RPG

Message par juliuson » 04 Fév 2018 15:52

Coucou à tous,
Ma question est la suivante : j'essaie d'avoir le rendu de l'image suivante (c'est un rendu Team Fortress):
https://blenderartists.org/forum/sho...fortress+spyro

Je crée un shader (Standard Surface Shader )

J'utilise le scripte Team Fortress suivant dans le shader :

http://leodomingues.com/2016/05/team...ader-in-unity/

Le problème, c'est que quand je drag le scripte dans un material,celui-ci devient de couleur magenta.
Il y a aussi une histoire de color band que je ne comprends pas non plus (sprites).

De plus qu'et ce que crée le scripte (couleurs, textures, ambiance)

S'il vous vous plait , est ce quelqu'un peut m'aider à créer un rendu Teeam Fortress étapes par étapes.
Excusez moi mais je galère trop.

Merci de votre aide,

A+

Avatar de l’utilisateur
Max
Newser
Newser
Messages : 7871
Inscription : 30 Juil 2011 13:57

Re: ambiance RPG

Message par Max » 04 Fév 2018 16:14

Bonjour,

Les liens que tu donnes ne sont pas bon. Il manque des bouts, qui sont remplacés par les ... (même si il doit s'agir du lien donné dans ton premier message).
juliuson a écrit :
04 Fév 2018 15:52
Le problème, c'est que quand je drag le scripte dans un material,celui-ci devient de couleur magenta.
C'est que le shader n'est pas valide et contient des erreurs. Il faut les identifier.
Après, pour la procédure, as-tu suivit quelque peu ce qui était dit ICI ?
La doc peut t'aider aussi, comme Creating and Using Materials, ou encore Creating a new shader.

Pour ce qui est des shaders, si tu veux un cours en vidéo et en français, alors pourquoi ne pas regarder ceci (parmi d'autres...): Comprendre les shaders - Anthony Blechet
https://www.youtube.com/watch?v=qUpQbaENPcg
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Répondre

Revenir vers « les Shaders »