Page 1 sur 1

[RESOLU] Alpha cache les autres textures

Publié : 02 Déc 2018 16:07
par Maki-Sama
Salut à tous :hello: ,

Voilà mon soucis est le suivant, j'ai récupérer un shader permettant d'avoir un aspect de transparence contenant une outline. Jusque là, tout va bien, mais voilà qu'il y à un petit problème au niveau de l'affichage de l'alpha.

Il y bien l'effet de Cutout (donc transparence par découpage) mais cela efface également les autres textures qu'il y a derrière celle-ci.

J'ai donc décidé d'utiliser un model afin de vous montrer de quoi il en retourne.
Je tiens à préciser que le matériel et le shader de la fourrure n'est pas la même que le reste du loup.

Image

J'ai essayé de faire quelques modifs mais échec, j'ai même trouvé sur un autre forum quelqu'un d'autre qui avait le même problème, sauf que lui c'était pour la version mobile 3DS et je n'ai pas trop compris. :/

Je vous laisse le code, je pense que cela viens de la :

Code : Tout sélectionner

Shader "Toon_Transparent" {
	Properties{
		_MainTex("Texture", 2D) = "white" {}
		_Color("Couleur", Color) = (1,1,1,0)
		_Emission("Couleur d'émission", Color) = (0,0,0,0)

		_OutlineColor("Outline couleur", Color) = (0,0,0,1)
		_Outline("Outline taille", Range(0.0, 10)) = 0.01
	}

		CGINCLUDE
#include "UnityCG.cginc"

		struct appdata {
		float4 vertex : POSITION;
		float3 normal : NORMAL;
	};

	struct v2f {
		float4 pos : POSITION;
		float4 color : COLOR;
	};

	uniform float _Outline;
	uniform float4 _OutlineColor;

	v2f vert(appdata v) {

		v2f o;
		o.pos = UnityObjectToClipPos(v.vertex);

		float3 norm = mul((float3x3)UNITY_MATRIX_IT_MV, v.normal);
		float2 offset = TransformViewToProjection(norm.xy);
		o.pos.xy += offset * o.pos.z * _Outline;
		o.color = _OutlineColor;
		return o;
	}
	ENDCG

		SubShader{
		Tags{ "RenderType" = "TransparentCutout" "Queue" = "AlphaTest" "IgnoreProjector"="True" }
		Pass{
		ColorMask 0
		AlphaTest Greater 1
}
		Pass{
		Name "BASE"
		Blend SrcAlpha OneMinusSrcAlpha
		ColorMask RGB
		Material{
		Diffuse[_Color]
		Specular[_SpecColor]
		Emission[_Emission]
		}

		Lighting On
		SetTexture[_MainTex]{
		Combine texture * primary DOUBLE, texture * primary
	}
	}

		Pass{
		Name "OUTLINE"
		Tags{ "LightMode" = "Always" }
		Cull Front

		Blend SrcAlpha OneMinusSrcAlpha

		CGPROGRAM
#pragma vertex vert
#pragma fragment frag

		half4 frag(v2f i) :COLOR{
		return i.color;
	}
		ENDCG
	}
	}
		Fallback "Diffuse"
}
De mon côté je cherche toujours, merci par avance.

Re: Alpha cache les autres textures

Publié : 02 Déc 2018 17:48
par djulio74
Salut.
Alors je n'ai encore jamais utilisé les fragment shader, mais dans le fond ça a l'air de ressembler assez au surface shader.
le probleme avec les transparence, c'est que tu n'as jamais d'ombre ( ni reçue ni projetée).
Par contre il y a le clip(float) pour un shader opaque qui peut être intéressant. En grgos permet d'afficher ou non les parties d'un mesh.

regarde dans la doc unity, vers le milieu il y a un exemple sur base de damier, ou encore en surface shader, idem environ au milieu de la page.

Re: Alpha cache les autres textures

Publié : 03 Déc 2018 10:59
par boubouk50
Ce serait pas juste une question de tri ou de profondeur? de Depth buffer? de Queue?
Z-Write ou un autre tag pour dessiner le mesh derrière?

EDIT -
https://stackoverflow.com/questions/507 ... ency-issue

Re: Alpha cache les autres textures

Publié : 03 Déc 2018 23:35
par Maki-Sama
Salut Boubouk50, c'est effectivement cela.

Il fallait juste remplacer "Queue"="AlphaTest" par "Queue"="Transparent"

Et aussi ajouter ZWrite Off dans le pass nommé "BASE"

Finalement j'ai eu ce que je voulais.

Merci encore, à plus.