[RESOLU] Tags Queue, RenderMode et LightMode

Questions à propos du scripting Shader.
Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6216
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

[RESOLU] Tags Queue, RenderMode et LightMode

Message par boubouk50 » 18 Fév 2016 12:29

Salut tout le monde,

Je suis un peu en galère aujourd'hui avec les queues de rendu et les lightmodes.
J'ai 2 shaders maison: un premier en Blending et le suivant en AlphaTest. Lorsque je les superpose, le shader AlphaTest apparaît toujours derrière le Blending. Pourtant, dans le shader j'ai bien:

Code : Tout sélectionner

Tags { "Queue" = "AlphaTest" "RenderType" = "TransparentCutout" }	//Pour l'AlphaTest
Tags { "Queue" = "Transparent" "RenderType" = "Transparent" }			//Pour le Blending
Normalement, ça devrait donner l'ordre de rendu correct pour mes objets non? J'oublie quelque chose? J'ai copié/collé les tags des shaders Legacy transparent et transparent Cutout pour bien être sûr, mais rien n'y fait. Any Idea?

- EDIT - En cherchant pour le lightMode, je suis tombé sur les directives de compilation, qui m'ont fait tester pour voir: #pragma surface surf Lambert alphatest:Cutoff
J'avais alpha, il me fallait alphatest ou rien et c'est bon. Donc y'a une sorte d'override des queues de rendu avec les directives de compilation.
1er partie résolue. :lol:

Ensuite, le LightMode: si j'en mets un, c'est tout noir. Donc là, je rame, je ne sais pas quoi faire. Alors que dans la doc il me faut se tag pour activer les ombres. Et ben non! Parce que grâce aux directives de compilations trouvées en même temps que la rédaction de ce post, je viens de tester la directive addshadow et bim, des ombres. Pas besoin d'inclure un tag de lightmode, de .cginc, de SHADOW_ATTENUATION ou autre que je me coltine depuis longtemps et qui ne marchaient pas pour ce cas.

Donc voilà Résolu en temps réel, mesdames et messieurs, ce post fera uniquement office de documentation.
Merci à moi et bonne journée.
::d :hello:
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
F@B
Messages : 1844
Inscription : 01 Août 2013 10:41
Contact :

Re: [RESOLU] Tags Queue, RenderMode et LightMode

Message par F@B » 19 Fév 2016 11:26

t'as pas de soucis avec les skybox du coup? Je pense avoir le même cas mais ma passe Transparent est rendu derrière la skybox (uniquement dans la game, en editor c'est niquel) elle est en Zwrite Off?

j'ai peut être pas pigé ce que tu faisais... :p
ʕ·͡ᴥ·ʔ ==> Mon Portfolio <== ʕ·͡ᴥ·ʔ

Merci de lire et de prendre en considération la Nétiquette des Forums avant de poster un sujet !

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6216
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [RESOLU] Tags Queue, RenderMode et LightMode

Message par boubouk50 » 19 Fév 2016 11:42

Pour mon objet en alphaTest:

Code : Tout sélectionner

 Tags { "Queue"="AlphaTest" "IgnoreProjector"="true" "RenderType"="TransparentCutout" "LightMode" = "Always" }
        
		CGPROGRAM
		#pragma surface surf Lambert addshadow
Pour mon objet en Blending:

Code : Tout sélectionner

Tags {"Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" }
		
		ZWrite Off
        Blend SrcAlpha OneMinusSrcAlpha 
		
		CGPROGRAM
		#pragma surface surf Lambert alpha
J'ai une vitre (blending) et une grille (alphatest) qui se chamaillait la priorité de rendu. Maintenant, tout est en ordre.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
F@B
Messages : 1844
Inscription : 01 Août 2013 10:41
Contact :

Re: [RESOLU] Tags Queue, RenderMode et LightMode

Message par F@B » 19 Fév 2016 14:15

j'ai la même chose mais pas avec du surface, avec un custom vertex frag, et la ma pass en Zwrite Off seulement "in game" passe derrière la skybox...

si tu ne constate pas ça avec le surface je suis intrigué.... bug unity? j'ai trouvé de tout et rien sur le sujet...
ʕ·͡ᴥ·ʔ ==> Mon Portfolio <== ʕ·͡ᴥ·ʔ

Merci de lire et de prendre en considération la Nétiquette des Forums avant de poster un sujet !

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6216
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [RESOLU] Tags Queue, RenderMode et LightMode

Message par boubouk50 » 19 Fév 2016 14:26

Hum... Build StandAlone ou Mobile?
Je fais du mobile.
Un autre shader de verre en vert + frag:

Code : Tout sélectionner

Tags { "QUEUE"="Transparent" "IGNOREPROJECTOR"="true" "RenderType"="Transparent" "LightMode" = "Always"}
		Pass {

        	ZWrite Off
        	Blend SrcAlpha OneMinusSrcAlpha
			
			CGPROGRAM

			#pragma vertex vert
			#pragma fragment frag
Et je n'ai pas de soucis sous Android. Je te MP le shader en question que tu puisses le tester.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
F@B
Messages : 1844
Inscription : 01 Août 2013 10:41
Contact :

Re: [RESOLU] Tags Queue, RenderMode et LightMode

Message par F@B » 19 Fév 2016 14:51

merci boubouk je regarde ça,

C'est du standalone, c'est mon shader de poipoil un peu plus bas dans les topic! :D
ʕ·͡ᴥ·ʔ ==> Mon Portfolio <== ʕ·͡ᴥ·ʔ

Merci de lire et de prendre en considération la Nétiquette des Forums avant de poster un sujet !

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6216
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [RESOLU] Tags Queue, RenderMode et LightMode

Message par boubouk50 » 19 Fév 2016 14:56

Ouais, là tu m'étonnes, c'est pas la même chose que moi. Une seule passe, je vais au plus court pour mobile.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
F@B
Messages : 1844
Inscription : 01 Août 2013 10:41
Contact :

Re: [RESOLU] Tags Queue, RenderMode et LightMode

Message par F@B » 19 Fév 2016 15:38

RAS tout marche bien sur ton shader... il y a un truc qui m'échappe... je reposerais ma question sur mon sujet en temps voulu si besoin.

merci Boubouk !
ʕ·͡ᴥ·ʔ ==> Mon Portfolio <== ʕ·͡ᴥ·ʔ

Merci de lire et de prendre en considération la Nétiquette des Forums avant de poster un sujet !

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: [RESOLU] Tags Queue, RenderMode et LightMode

Message par Alesk » 06 Mars 2016 14:27

Salut !

J'ai un problème similaire avec un fragment shader : en fonction de la position ou de l'angle de la caméra, mon mesh transparent est affiché (un peu aléatoirement) derrière mon mesh opaque, alors qu'il est clairement devant.
Ce n'est pas un souci de bounding box, j'ai vérifié avec un mesh opaque loin et bien plus petit que mon mesh transparent...

Voici le shader en question, si quelqu'un a une idée de comment régler ça :
(je n'ai pas trouvé comment coller un pragma qui va bien)

Code : Tout sélectionner

Shader "Custom/GS Billboard"
    {
        Properties
        {
            _SpriteTex ("Base (RGB)", 2D) = "white" {}
            _Size ("Size", Range(0, 3)) = 0.5
        }
     
        SubShader
        {

            Pass
            {
            	Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"  }
                Blend SrcAlpha OneMinusSrcAlpha
		   		Cull Off
		   		Lighting Off
		   		ZWrite Off
		        LOD 200

                CGPROGRAM
	            #pragma target 5.0
	            #pragma vertex VS_Main
	            #pragma fragment FS_Main
	            #pragma geometry GS_Main

	            #include "UnityCG.cginc"

	            // **************************************************************
	            // Data structures                                              *
	            // **************************************************************
	            struct GS_INPUT
	            {
                    float4  pos     : POSITION;
                    float3  normal  : NORMAL;
                    float2  tex0    : TEXCOORD0;
                };

                struct FS_INPUT
                    {
                    float4  pos     : POSITION;
                    float2  tex0    : TEXCOORD0;
                };

                // **************************************************************
                // Vars                                                         *
                // **************************************************************
     
                float _Size;
                float4x4 _VP;
                Texture2D _SpriteTex;
                SamplerState sampler_SpriteTex;
                // **************************************************************
	            // Shader Programs                                              *
	            // **************************************************************

	            // Vertex Shader ------------------------------------------------
                GS_INPUT VS_Main(appdata_base v)
                {
                    GS_INPUT output = (GS_INPUT)0;
                    output.pos =  mul(_Object2World, v.vertex);
                    output.normal = v.normal;
                    output.tex0 = float2(0, 0);
                    return output;
                }
          
	            // Geometry Shader -----------------------------------------------------
	            [maxvertexcount(4)]
	            void GS_Main(point GS_INPUT p[1], inout TriangleStream<FS_INPUT> triStream)
	            {
                    //float3 up = float3(0, 1, 0);
					//float3 look = _WorldSpaceCameraPos - p[0].pos;
					//look.y = 0;
					//look = normalize(look);
					//float3 right = cross(up, look);


					float3 look = UNITY_MATRIX_V[2].xyz;
					float3 up = UNITY_MATRIX_V[1].xyz;
					float3 right = cross(up, look);

                    float halfS = 0.5f * _Size;

                    //offsets
                    float4 v[4];
                    v[0] = float4(p[0].pos + halfS * right - halfS * up, 1.0f);
                    v[1] = float4(p[0].pos + halfS * right + halfS * up, 1.0f);
                    v[2] = float4(p[0].pos - halfS * right - halfS * up, 1.0f);
                    v[3] = float4(p[0].pos - halfS * right + halfS * up, 1.0f);
                    float4x4 vp = mul(UNITY_MATRIX_MVP, _World2Object);
                    FS_INPUT pIn;
                    pIn.pos = mul(vp, v[0]);
                    pIn.tex0 = float2(1.0f, 0.0f);
                    triStream.Append(pIn);
                    pIn.pos =  mul(vp, v[1]);
                    pIn.tex0 = float2(1.0f, 1.0f);
                    triStream.Append(pIn);
                    pIn.pos =  mul(vp, v[2]);
                    pIn.tex0 = float2(0.0f, 0.0f);
                    triStream.Append(pIn);
                    pIn.pos =  mul(vp, v[3]);
                    pIn.tex0 = float2(0.0f, 1.0f);
                    triStream.Append(pIn);
                }

	            // Fragment Shader -----------------------------------------------
	            float4 FS_Main(FS_INPUT input) : COLOR
	            {
                    return _SpriteTex.Sample(sampler_SpriteTex, input.tex0);
                }

                ENDCG
            }

        }//end subshader
        Fallback "Diffuse"
    }//end shader
     

Avatar de l’utilisateur
F@B
Messages : 1844
Inscription : 01 Août 2013 10:41
Contact :

Re: [RESOLU] Tags Queue, RenderMode et LightMode

Message par F@B » 06 Mars 2016 20:38

je suis pas sur de piger ton problème? t'es en Zwrite Off, ce qui fait qu'il va passer derrière tout le monde. t'en a besoin?

Le Zwrite Off de toute façon ça fait que des merdes, a bannir ou alors il faut que je pige comment! car même si ça parait ok dans l'éditeur, dans le Game tu vas passer derrière la skybox.

autre chose ton render Queur doit être dans le subshader et pas dans la pass, sinon ça ne le prend pas en compte.
j'ai ajouté une variable cutout et un clip.

si tu veux essayer tu peux activer ce que j'ai mis en commentaire "AlphaToMask True" et plus besoin du clip, ni du render Queue, mais je crois que ça limite a DX11 (c'est super mal documenté cette commande) mais c'est le seul moyen que j'ai trouvé pour la semitransparence cutout avec ombre.

dis moi si c'est ça? sinon explique j'ai pas trop piger ;)

Code : Tout sélectionner

Shader "Custom/GS Billboard Alesk"
{
	Properties
	{
		_SpriteTex("Base (RGB)", 2D) = "white" {}
		_Size("Size", Range(0, 3)) = 0.5
		_Cutoff("Base Alpha cutoff", Range(0,1)) = .5

	}

		SubShader
	{
		Tags{ "Queue" = "AlphaTest" } //shadow receiver but no semi transparent (ugly aliasting cutout)

		Pass
	{
		//Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" }
		Blend SrcAlpha OneMinusSrcAlpha
		Cull Off
		Lighting Off
		//ZWrite Off
		//AlphaToMask True

		LOD 200

		CGPROGRAM
#pragma target 5.0
#pragma vertex VS_Main
#pragma fragment FS_Main
#pragma geometry GS_Main

#include "UnityCG.cginc"

		// **************************************************************
		// Data structures                                              *
		// **************************************************************
	struct GS_INPUT
	{
		float4  pos     : POSITION;
		float3  normal  : NORMAL;
		float2  tex0    : TEXCOORD0;
	};

	struct FS_INPUT
	{
		float4  pos     : POSITION;
		float2  tex0    : TEXCOORD0;
	};

	// **************************************************************
	// Vars                                                         *
	// **************************************************************

	float _Size;
	float4x4 _VP;
	Texture2D _SpriteTex;
	SamplerState sampler_SpriteTex;
	float _Cutoff;

	// **************************************************************
	// Shader Programs                                              *
	// **************************************************************

	// Vertex Shader ------------------------------------------------
	GS_INPUT VS_Main(appdata_base v)
	{
		GS_INPUT output = (GS_INPUT)0;
		output.pos = mul(_Object2World, v.vertex);
		output.normal = v.normal;
		output.tex0 = float2(0, 0);
		return output;
	}

	// Geometry Shader -----------------------------------------------------
	[maxvertexcount(4)]
	void GS_Main(point GS_INPUT p[1], inout TriangleStream<FS_INPUT> triStream)
	{
		//float3 up = float3(0, 1, 0);
		//float3 look = _WorldSpaceCameraPos - p[0].pos;
		//look.y = 0;
		//look = normalize(look);
		//float3 right = cross(up, look);


		float3 look = UNITY_MATRIX_V[2].xyz;
		float3 up = UNITY_MATRIX_V[1].xyz;
		float3 right = cross(up, look);

		float halfS = 0.5f * _Size;

		//offsets
		float4 v[4];
		v[0] = float4(p[0].pos + halfS * right - halfS * up, 1.0f);
		v[1] = float4(p[0].pos + halfS * right + halfS * up, 1.0f);
		v[2] = float4(p[0].pos - halfS * right - halfS * up, 1.0f);
		v[3] = float4(p[0].pos - halfS * right + halfS * up, 1.0f);
		float4x4 vp = mul(UNITY_MATRIX_MVP, _World2Object);
		FS_INPUT pIn;
		pIn.pos = mul(vp, v[0]);
		pIn.tex0 = float2(1.0f, 0.0f);
		triStream.Append(pIn);
		pIn.pos = mul(vp, v[1]);
		pIn.tex0 = float2(1.0f, 1.0f);
		triStream.Append(pIn);
		pIn.pos = mul(vp, v[2]);
		pIn.tex0 = float2(0.0f, 0.0f);
		triStream.Append(pIn);
		pIn.pos = mul(vp, v[3]);
		pIn.tex0 = float2(0.0f, 1.0f);
		triStream.Append(pIn);
	}

	// Fragment Shader -----------------------------------------------
	float4 FS_Main(FS_INPUT input) : COLOR
	{
		clip(_SpriteTex.Sample(sampler_SpriteTex, input.tex0).a - _Cutoff) ;
		return _SpriteTex.Sample(sampler_SpriteTex, input.tex0);
	}

		ENDCG
	}

	}//end subshader
		Fallback "Diffuse"
}//end shader

ʕ·͡ᴥ·ʔ ==> Mon Portfolio <== ʕ·͡ᴥ·ʔ

Merci de lire et de prendre en considération la Nétiquette des Forums avant de poster un sujet !

Répondre

Revenir vers « les Shaders »