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.
[presque résolu] Transparence ave Speedtree
[presque résolu] Transparence ave Speedtree
Dernière édition par Ran le 01 Mars 2018 21:30, édité 1 fois.
Re: Transparence ave Speedtree
Bonjour,
poste le code du shader en question, cela devrait aider à trouver ce qui peut clocher.Ran a écrit : ↑01 Mars 2018 18:27Le 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)
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
Re: Transparence ave Speedtree
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)
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)
Re: Transparence ave Speedtree
Tu as pu avancer de ton coté, c'est l'essentiel.
cool, cela pourra toujours rendre service à quelqu'un
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
Re: Transparence ave Speedtree
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.
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"
}