Page 1 sur 2

Shader pour faire un trou dans une texture

Publié : 03 Déc 2019 17:33
par EmileF
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

Re: Shader pour faire un trou dans une texture

Publié : 03 Déc 2019 17:50
par Max
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

Re: Shader pour faire un trou dans une texture

Publié : 03 Déc 2019 17:58
par EmileF
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...

Re: Shader pour faire un trou dans une texture

Publié : 03 Déc 2019 18:14
par EmileF
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.

Re: Shader pour faire un trou dans une texture

Publié : 03 Déc 2019 18:24
par Alesk
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.

Re: Shader pour faire un trou dans une texture

Publié : 03 Déc 2019 18:55
par EmileF
Merci Alesk

Re: Shader pour faire un trou dans une texture

Publié : 03 Déc 2019 20:15
par EmileF
Je voudrais ajouter un petit détail,

est-il possible de voir les effets du shader en mode Edit

Re: Shader pour faire un trou dans une texture

Publié : 03 Déc 2019 20:28
par EmileF
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];
            }

        }
    }
}

Re: Shader pour faire un trou dans une texture

Publié : 03 Déc 2019 23:16
par EmileF
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

Re: Shader pour faire un trou dans une texture

Publié : 04 Déc 2019 08:04
par Alesk
ç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 ?