Shader pour faire un trou dans une texture

Questions à propos du scripting Shader.
EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Shader pour faire un trou dans une texture

Message par EmileF » 03 Déc 2019 17:33

Bonjour à tous,

Décidément les shaders me font des misères.

Je voudrai dans quad appliquer une simple texture, mais faire un trou dans lequel je peux voir ce qu'il y a derrière.

Je sais que je peux créer un mesh avec un trou, mais la taille du trou n'est pas défini, elle peut être différente selon le cas, et la position du trou aussi.

J'ai regardé dans les shaders, et j'ai trouvé le DephtMask qui me fait bien un trou dans ma texture, mais je n'arrive pas à trouver la solution pour voir les objets à travers ce trou

Voici le DephtMask, qui est très simple en fait :

Code : Tout sélectionner

Shader "DepthMask"
{
	SubShader
	{
		Tags {"Queue" = "Geometry-1" }
		Lighting Off
		Pass
		{
			ZWrite On
			ZTest LEqual
			ColorMask 0
		}
	}
}
Au cours de mes recherches j'ai cru comprendre qu'il fallait mettre ce script sur le cache :

Code : Tout sélectionner

using UnityEngine;

[AddComponentMenu("Rendering/SetRenderQueue")]

public class SetRenderQueue : MonoBehaviour
{

    [SerializeField]
    protected int[] m_queues = new int[] { 3000 };

    protected void Awake()
    {
        Material[] materials = GetComponent<Renderer>().materials;
        for (int i = 0; i < materials.Length && i < m_queues.Length; ++i)
        {
            materials[i].renderQueue = m_queues[i];
        }
    }
}
Ce que j'ai fait, j'ai modifié la valeur du Queue[0], mais rien n'y fait,
Voilà l'image en mode Edit
Image
Voilà le résultat que j'obtiens et mode Play, on voit bien l'arrière plan mais pas le coin du cube
Image
Au secours
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Avatar de l’utilisateur
Max
Messages : 8763
Inscription : 30 Juil 2011 13:57
Contact :

Re: Shader pour faire un trou dans une texture

Message par Max » 03 Déc 2019 17:50

Bonjour,

Je n'ai peut-être pas saisi, mais ton soucis me semble pouvoir se régler simplement en passant par exemple
par un material avec un shader Standard Cutout non ?

Image
Image
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

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: Shader pour faire un trou dans une texture

Message par EmileF » 03 Déc 2019 17:58

Je ne crois pas

Disons que ma texture c'est un mur, et que je veux creuser un trou dans mon mur, mais que ce trou peut-être placé au hasard au début du jeu par exemple...
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: Shader pour faire un trou dans une texture

Message par EmileF » 03 Déc 2019 18:14

Décidément le forum me donne chance.
Je cherche depuis hier, je poste mon message, et je trouve la solution dans les 5 minutes.
Merci le forum

En fait mon erreur venait du fait que le script "SetRenderQueue" je le mettais sur le cache, le mur.

Il fallait en fait le mettre sur les objets placés derrières pour les voir et dans mon cas mettre sa valeur à 1999.

Je n'avais pas compris ce détail.

Pour le masque j'avais utilisé un cube qui traversait mon mur, un simple quad suffit à placer devant le mur entre la caméra et le mur.

Merci Max pour ta réponse.
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

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

Re: Shader pour faire un trou dans une texture

Message par Alesk » 03 Déc 2019 18:24

Salut,

Ton shader écrit dans le ZBuffer, donc il bloque le rendu de tout ce qui se trouvera derrière.

Une solution serait de gérer le rendu en 2 temps :

- d'abord le rendu de tous les objets qui ne sont pas percés par ton shader
- puis le rendu de ceux qui sont percés

Ainsi tu seras-sûr que tout ce qui est potentiellement derrière est bien affiché.

EDIT : ha je vois que tu as répondu pendant que j'écrivais mon message.
Parfait.
Pour ce qui est du réglage, je te recommande de mettre 1998 au lieu de 1999, pour être sûr que le rendu des objets de derrière se fasse bien avant tout le reste.

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: Shader pour faire un trou dans une texture

Message par EmileF » 03 Déc 2019 18:55

Merci Alesk
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: Shader pour faire un trou dans une texture

Message par EmileF » 03 Déc 2019 20:15

Je voudrais ajouter un petit détail,

est-il possible de voir les effets du shader en mode Edit
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: Shader pour faire un trou dans une texture

Message par EmileF » 03 Déc 2019 20:28

En fait je fais les questions et les réponses dans ce post.

Pour avoir l"effet en mode Edit il faut modifier le script des objets à voir ainsi:

Code : Tout sélectionner

using UnityEngine;

[AddComponentMenu("Rendering/SetRenderQueue")]
[ExecuteInEditMode]
public class SetRenderQueue : MonoBehaviour
{

    [SerializeField]
    protected int[] m_queues = new int[] { 3000 };

    bool run;
    private void Update()
    {
        if (!run)
        {
            run = Application.isPlaying;
            Material[] materials = GetComponent<Renderer>().sharedMaterials;
            for (int i = 0; i < materials.Length && i < m_queues.Length; ++i)
            {
                materials[i].renderQueue = m_queues[i];
            }

        }
    }
}
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: Shader pour faire un trou dans une texture

Message par EmileF » 03 Déc 2019 23:16

Encore une question s'il vous plait.

mon shader DepthMask est sans effet si le shader de mon mur est le suivant:

Code : Tout sélectionner

Shader "Custom/RotColorTexture"
{
	Properties
	{
		_Color("Main Color", Color) = (1,1,1,1)
		_SpecColor("Specular Color", Color) = (0.5,0.5,0.5,1)
		_Shininess("Shininess", Range(0.01, 1)) = 0.078125
		_ReflectColor("Reflection Color", Color) = (1,1,1,0.5)
		_MainTex("Base (RGB) RefStrGloss (A)", 2D) = "white" {}
		_Cube("Reflection Cubemap", Cube) = "" {}
		_BumpMap("Normalmap", 2D) = "bump" {}
		_Fresnel("Fresnel Coef.", Range(0.01, 0.7)) = 0.35
	}

		SubShader
		{
		Tags { "RenderType" = "Opaque"}
		LOD 400
		CGPROGRAM
		#pragma surface surf BlinnPhong
		#pragma target 3.0

		sampler2D _MainTex;
		sampler2D _BumpMap;
		samplerCUBE _Cube;

		float4 _Color;
		float4 _ReflectColor;
		float _Shininess;
		float _Fresnel;
		float4x4 _TextureRotation;

		struct Input {
				float2 uv_MainTex;
				float2 uv_BumpMap;
				//float3 normal;
				float3 viewDir;
				float3 worldRefl;
				INTERNAL_DATA
		};

		//taken from somewhere in internet
		float fresnel(float VdotN, float eta)
		{
			float sqr_eta = eta * eta; // square of IOR
			float etaCos = eta * VdotN; // η·cos(Θ)
			float sqr_etaCos = etaCos * etaCos; // squared
			float one_minSqrEta = 1.0 - sqr_eta; // 1 – η2
			float value = etaCos - sqrt(one_minSqrEta + sqr_etaCos);
			value *= value / one_minSqrEta; // square and divide by 1 – η2
			return min(1.0, value * value); // square again
		}

		//float fFresnel = fresnel(dot(vViewNormal, vNormalWS), indexOfRefraction);

		void surf(Input IN, inout SurfaceOutput o)
		{
			IN.uv_MainTex.xy = mul(_TextureRotation, float4(IN.uv_MainTex, 0, 1)).xy;

			half4 tex = tex2D(_MainTex, IN.uv_MainTex);
			half4 c = tex * _Color;
			o.Albedo = c.rgb;

			o.Gloss = tex.a;
			o.Specular = _Shininess;

			o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_MainTex.xy));

			float3 worldRefl = WorldReflectionVector(IN, o.Normal);

			half4 reflcol = texCUBE(_Cube, worldRefl);
			reflcol *= tex.a;

			//reflcol = lerp(c, reflcol, fresnel(worldRefl, _Fresnel));
			reflcol = lerp(c, reflcol, fresnel(dot(normalize(IN.viewDir),o.Normal), _Fresnel));

			o.Emission = reflcol.rgb * _ReflectColor.rgb;
			o.Alpha = reflcol.a * _ReflectColor.a;
		}
		ENDCG
		}

			FallBack "Reflective/Bumped Diffuse"
Que faut-il que j'ajoute a ce shader pour que mon mask fonctionne, je n'arrive pas à trouver
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

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

Re: Shader pour faire un trou dans une texture

Message par Alesk » 04 Déc 2019 08:04

ça fonctionne chez moi.

J'ai remarqué qu'il manquait une accolade } à la fin du shader que tu as posté, est-ce une erreur de copie ou bien as-tu la même erreur dans ton fichier original ?

Répondre

Revenir vers « les Shaders »