[presque résolu] Transparence ave Speedtree

Questions à propos du scripting Shader.
Ran
Messages : 32
Inscription : 04 Déc 2015 10:43

[presque résolu] Transparence ave Speedtree

Message par Ran » 01 Mars 2018 18:27

Salut les aminches,

Je galère comme un malpropre depuis quelques jours avec Speedtree... Je voudrais juste que les arbres deviennent semi-transparents quand ils sont entre la caméra et le joueur, ce qui ma foi me semble une fonctionnalité tout à fait classique.

Toutefois, cette fonction n'est pas prévue dans le shader fourni par Speedtree : j'ai donc commencé à le modifier malgré mon manque de connaissance sur le sujet. Finalement, au prix de deux grabpass et une fusion manuelle en fin de shaders, j'ai fini par obtenir un résultat parfaitement conforme à ce que je voulais... dans l'éditeur (le jeu tourne parfaitement et tout).

Le truc horrible, c'est qu'une fois compilé, les shaders en question ne se comportent plus de la même manière (les zones transparentes deviennent noires) et, peut-être liés à ça, j'obtiens deux erreurs lors de la compilation :
Did not find shader kernel 'frag_surf' to compile (on d3d9)
Did not find shader kernel 'frag_surf' to compile (on d3d11)


Je désespère un peu... Est-ce que quelqu'un aurait la solution à mon problème de compilation, ou plus généralement une bonne solution pour rendre semi-transparents les arbres de Speedtree (sans toucher aux textures elles-mêmes, il faut appliquer la transparence au rendu final sinon on obtient un effet de rayons-X de mauvais aloi).

Mon problème et quelques réponses de l'équipe de Speedtree sont décrits avec quelques détails de code en plus ici.
Dernière édition par Ran le 01 Mars 2018 21:30, édité 1 fois.

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

Re: Transparence ave Speedtree

Message par Max » 01 Mars 2018 18:34

Bonjour,
Ran a écrit :
01 Mars 2018 18:27
Le truc horrible, c'est qu'une fois compilé, les shaders en question ne se comportent plus de la même manière (les zones transparentes deviennent noires) et, peut-être liés à ça, j'obtiens deux erreurs lors de la compilation :
Did not find shader kernel 'frag_surf' to compile (on d3d9)
Did not find shader kernel 'frag_surf' to compile (on d3d11)
poste le code du shader en question, cela devrait aider à trouver ce qui peut clocher.
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

Ran
Messages : 32
Inscription : 04 Déc 2015 10:43

Re: Transparence ave Speedtree

Message par Ran » 01 Mars 2018 19:37

Ah ben du coup laissez tomber, j'ai nettoyé mon shader des lignes qui servaient à rien pour pouvoir vous le montrer et maintenant ça remarche ! Enfin, la fonctionnalité principale remarche (la transparence), mais j'ai perdu au passage une fonctionnalité secondaire (la colorisation de la silhouette transparente).

Pour remercier cet excellent forum de l'aide sans faille qu'il apporte aux pauvres gens, je posterai le shader modifié dès que j'aurai réussi à tout concilier (ou dès que j'aurai renoncé à la fonction secondaire)

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

Re: Transparence ave Speedtree

Message par Max » 01 Mars 2018 19:47

Tu as pu avancer de ton coté, c'est l'essentiel.
Ran a écrit :
01 Mars 2018 19:37
Pour remercier cet excellent forum de l'aide sans faille qu'il apporte aux pauvres gens, je posterai le shader modifié dès que j'aurai réussi à tout concilier (ou dès que j'aurai renoncé à la fonction secondaire)
cool, cela pourra toujours rendre service à quelqu'un ;)
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

Ran
Messages : 32
Inscription : 04 Déc 2015 10:43

Re: Transparence ave Speedtree

Message par Ran » 01 Mars 2018 21:22

Bon, voila le résultat de mes recherches : la transparence marche, mais j'ai du déconnecter l'effet de colorisation, qui marche dans l'éditeur mais fait planter la compilation (jamais compris pourquoi, mais le shader de speedtree est compliqué donc c'est très empirique...). Il y a trois lignes à remettre (signalées) si vous voulez voir comme l'effet est chouette dans l'éditeur.

Attention, ce shader est uniquement conçu pour être appliqué sur des matériaux d'arbres Speedtree, je n'ai aucune idée de ce qu'il peut donner appliqué dans un autre contexte : probablement rien de bon.

Voila, hennejauille comme on dit outre-Atlantique.

Code : Tout sélectionner

Shader "Nature/SpeedTreeAvecTransparence"
{
    Properties
    {
        _Color ("Main Color", Color) = (1,1,1,1)
        _Transparence ("Transparence", Range(0.0,1.0)) = 0
        [Toggle] _ForceCouleur("Colorisation forcée", float) = 0
        _Couleur ("Ma couleur", Color) = (1,0,1,1)
        _HueVariation ("Hue Variation", Color) = (1.0,0.5,0.0,0.1)
        _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
        _DetailTex ("Detail", 2D) = "black" {}
        _BumpMap ("Normal Map", 2D) = "bump" {}
        _Cutoff ("Alpha Cutoff", Range(0,1)) = 0.333
        [MaterialEnum(Off,0,Front,1,Back,2)] _Cull ("Cull", Int) = 2
        [MaterialEnum(None,0,Fastest,1,Fast,2,Better,3,Best,4,Palm,5)] _WindQuality ("Wind Quality", Range(0,5)) = 0
    }

    // targeting SM3.0+
    SubShader
    {
        Tags
        {
            //"Queue"="Geometry"
            "Queue" = "Transparent"
            "IgnoreProjector"="True"
            //"RenderType"="Opaque"
            "RenderType"="Transparent"
            "DisableBatching"="LODFading"
        }

        LOD 400
        Cull [_Cull]

        GrabPass { "_GrabFondScene" }

        CGPROGRAM
            #pragma surface surf Lambert vertex:SpeedTreeVert nodirlightmap nodynlightmap noshadowmask dithercrossfade
            #pragma target 3.0
            #pragma multi_compile_vertex __ LOD_FADE_PERCENTAGE
            #pragma instancing_options assumeuniformscaling lodfade maxcount:50
            #pragma shader_feature GEOM_TYPE_BRANCH GEOM_TYPE_BRANCH_DETAIL GEOM_TYPE_FROND GEOM_TYPE_LEAF GEOM_TYPE_MESH
            #pragma shader_feature EFFECT_BUMP
            #pragma shader_feature EFFECT_HUE_VARIATION
            #define ENABLE_WIND
            #include "SpeedTreeCommon.cginc"

            void surf(Input IN, inout SurfaceOutput OUT)
            {
                SpeedTreeFragOut o;
                SpeedTreeFrag(IN, o);
                SPEEDTREE_COPY_FRAG(OUT, o)
            }
        ENDCG

        Pass
        {
            Tags { "LightMode" = "ShadowCaster" }

            CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                #pragma target 3.0
                #pragma multi_compile_vertex __ LOD_FADE_PERCENTAGE LOD_FADE_CROSSFADE
                #pragma multi_compile_fragment __ LOD_FADE_CROSSFADE
                #pragma multi_compile_instancing
                #pragma instancing_options assumeuniformscaling lodfade maxcount:50
                #pragma shader_feature GEOM_TYPE_BRANCH GEOM_TYPE_BRANCH_DETAIL GEOM_TYPE_FROND GEOM_TYPE_LEAF GEOM_TYPE_MESH
                #pragma multi_compile_shadowcaster
                #define ENABLE_WIND
                #include "SpeedTreeCommon.cginc"

                struct v2f
                {
                    V2F_SHADOW_CASTER;
                    #ifdef SPEEDTREE_ALPHATEST
                        float2 uv : TEXCOORD1;
                    #endif
                    UNITY_VERTEX_INPUT_INSTANCE_ID
                    UNITY_VERTEX_OUTPUT_STEREO
                };

                v2f vert(SpeedTreeVB v)
                {
                    v2f o;
                    UNITY_SETUP_INSTANCE_ID(v);
                    UNITY_TRANSFER_INSTANCE_ID(v, o);
                    UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
                    #ifdef SPEEDTREE_ALPHATEST
                        o.uv = v.texcoord.xy;
                    #endif
                    OffsetSpeedTreeVertex(v, unity_LODFade.x);
                    TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)

                    return o;
                }

                float4 frag(v2f i) : SV_Target
                {
                    UNITY_SETUP_INSTANCE_ID(i);
                    #ifdef SPEEDTREE_ALPHATEST
                        clip(tex2D(_MainTex, i.uv).a * _Color.a - _Cutoff);
                    #endif
                    UNITY_APPLY_DITHER_CROSSFADE(i.pos.xy);
                    SHADOW_CASTER_FRAGMENT(i)
                }
            ENDCG
        }

        Pass
        {
            Tags { "LightMode" = "Vertex" }

            CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                #pragma target 3.0
                #pragma multi_compile_fog
                #pragma multi_compile_vertex __ LOD_FADE_PERCENTAGE LOD_FADE_CROSSFADE
                #pragma multi_compile_fragment __ LOD_FADE_CROSSFADE
                #pragma multi_compile_instancing
                #pragma instancing_options assumeuniformscaling lodfade maxcount:50
                #pragma shader_feature GEOM_TYPE_BRANCH GEOM_TYPE_BRANCH_DETAIL GEOM_TYPE_FROND GEOM_TYPE_LEAF GEOM_TYPE_MESH
                #pragma shader_feature EFFECT_HUE_VARIATION
                #define ENABLE_WIND
                #include "SpeedTreeCommon.cginc"

                struct v2f
                {
                    UNITY_POSITION(vertex);
                    UNITY_FOG_COORDS(0)
                    Input data      : TEXCOORD1;
                    UNITY_VERTEX_INPUT_INSTANCE_ID
                    UNITY_VERTEX_OUTPUT_STEREO
                };

                v2f vert(SpeedTreeVB v)
                {
                    v2f o;
                    UNITY_SETUP_INSTANCE_ID(v);
                    UNITY_TRANSFER_INSTANCE_ID(v, o);
                    UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
                    SpeedTreeVert(v, o.data);
                    o.data.color.rgb *= ShadeVertexLightsFull(v.vertex, v.normal, 4, true);
                    o.vertex = UnityObjectToClipPos(v.vertex);
                    UNITY_TRANSFER_FOG(o,o.vertex);
                    return o;
                }

                fixed4 frag(v2f i) : SV_Target
                {
                    UNITY_SETUP_INSTANCE_ID(i);
                    SpeedTreeFragOut o;
                    SpeedTreeFrag(i.data, o);
                    UNITY_APPLY_DITHER_CROSSFADE(i.vertex.xy);
                    fixed4 c = fixed4(o.Albedo, o.Alpha);
                    UNITY_APPLY_FOG(i.fogCoord, c);
                    return c;
                }

            ENDCG
        }

        //C'est là qu'on mélange le rendu normal et le fond d'écran pour obtenir la transparence partielle...

        GrabPass {}

        Pass
        {
            //Tags { "LightMode" = "Vertex" }
            Tags { "LightMode" = "Always" }

            CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                #pragma target 3.0
                #pragma multi_compile_fog
                #pragma multi_compile_vertex __ LOD_FADE_PERCENTAGE LOD_FADE_CROSSFADE
                #pragma multi_compile_fragment __ LOD_FADE_CROSSFADE
                #pragma multi_compile_instancing
                #pragma instancing_options assumeuniformscaling lodfade maxcount:50
                #pragma shader_feature GEOM_TYPE_BRANCH GEOM_TYPE_BRANCH_DETAIL GEOM_TYPE_FROND GEOM_TYPE_LEAF GEOM_TYPE_MESH
                #pragma shader_feature EFFECT_HUE_VARIATION
                #define ENABLE_WIND
                #include "SpeedTreeCommon.cginc"

                struct v2f
                {
                    UNITY_POSITION(vertex);
                    UNITY_FOG_COORDS(0)
                    Input data      : TEXCOORD1;
                    UNITY_VERTEX_INPUT_INSTANCE_ID
                    UNITY_VERTEX_OUTPUT_STEREO
                    float4 uvgrab : TEXCOORD0;
                };

                float4 _Couleur;
                float _Transparence;
                float _ForceCouleur;
 				sampler2D _GrabTexture;
 				sampler2D _GrabFondScene;

                v2f vert(SpeedTreeVB v)
                {
                    v2f o;
                    UNITY_SETUP_INSTANCE_ID(v);
                    UNITY_TRANSFER_INSTANCE_ID(v, o);
                    UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
                    SpeedTreeVert(v, o.data);
                    o.data.color.rgb *= ShadeVertexLightsFull(v.vertex, v.normal, 4, true);
                    o.vertex = UnityObjectToClipPos(v.vertex);
                    UNITY_TRANSFER_FOG(o,o.vertex);
                    o.uvgrab = ComputeGrabScreenPos(o.vertex);
                    return o;
                }

                fixed4 frag(v2f i) : SV_Target
                {
                	//Nota : remettre les 3 lignes suivantes pour un effet de colorisation qui marche dans l'éditeur mais fait planter la compilation.
                    //UNITY_SETUP_INSTANCE_ID(i);
                    //SpeedTreeFragOut o;
                    //SpeedTreeFrag(i.data, o);
                    //UNITY_APPLY_DITHER_CROSSFADE(i.vertex.xy);
                    //fixed4 c = fixed4(o.Albedo, o.Alpha);
                    fixed4 c;
                    if(_ForceCouleur==1)
                    {
                    	c = _Couleur*(1-_Transparence) + tex2Dproj( _GrabFondScene, i.uvgrab)*_Transparence;
                    }
                    else
                    {
                    	c = tex2Dproj( _GrabTexture, i.uvgrab)*(1-_Transparence) + tex2Dproj( _GrabFondScene, i.uvgrab)*_Transparence;
                    }
                    //UNITY_APPLY_FOG(i.fogCoord, c);
                    return c;
                }
 
 			ENDCG
		}
    }
    FallBack "Transparent/Cutout/VertexLit"
    CustomEditor "SpeedTreeMaterialInspector"
}

Répondre

Revenir vers « les Shaders »