Je suis actuellement en train de travailler sur un système de forêt billboard inspiré de TurboForest (http://forum.unity3d.com/threads/turbof ... ng.224165/)
Mais le shader utilisé par le système d'origine ne me convient pas.
Pour résumer c'est du billboard classique mais en fonction de la position de la caméra on a une vue différente de l'arbre (vue de dessus, de 3/4 ect)
L'idée est bonne mais il faudrait bien améliorer le shader pour avoir un bon résultat.
D'ailleurs on peux obtenir des résultat assez fou avec ce genre de technique :
https://www.youtube.com/watch?v=4Ghulpp6CPw
Enfin Bref c'est pas la question, pour l'instant je voudrais me contenter d'un billboarding classique mais qui permet la rotation du billboard uniquement sur l'axe Y.
Ce qui évite les rotation des arbres lorsque la caméra fait une rotation sur Z par exemple.
D'après ce que j'ai pu lire sur le net ce type de billboarding est appelé Cylindrical Billboarding.
J'ai trouvé et adapté une bonne solution qui utilise un geometry shader mais j'aimerais utiliser un shader compatible avec du matériel plus ancien et aussi compatible mac.
Donc je cherche une méthode alternative et comme je ne connais pas encore très bien le dev de shader j'ai besoin de votre aide .
J'ai donc trouvé un shader de billboarding tout simple que je vais utiliser comme point de départ :
Code : Tout sélectionner
Shader "Cg shader for billboards" {
Properties {
_MainTex ("Texture Image", 2D) = "white" {}
}
SubShader {
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// User-specified uniforms
uniform sampler2D _MainTex;
struct vertexInput {
float4 vertex : POSITION;
float4 tex : TEXCOORD0;
};
struct vertexOutput {
float4 pos : SV_POSITION;
float4 tex : TEXCOORD0;
};
vertexOutput vert(vertexInput input)
{
vertexOutput output;
output.pos = mul(UNITY_MATRIX_P,
mul(UNITY_MATRIX_MV, float4(0.0, 0.0, 0.0, 1.0))
- float4(input.vertex.x, input.vertex.y, 0.0, 0.0));
output.tex = input.tex;
return output;
}
float4 frag(vertexOutput input) : COLOR
{
return tex2D(_MainTex, float2(input.tex.xy));
}
ENDCG
}
}
}
De ce que je comprend du shader et de l'explication donnée avec, voir source: https://en.wikibooks.org/wiki/Cg_Progra ... Billboards
On transforme l'origine de l'object dans les coordonnées de l'espace relatif à la caméra et on y soustrait la position des vertex sur l'axe x et y ce qui fait que l'objet est toujours face à la caméra.
donc si on applique une rotation sur :
output.pos = mul(UNITY_MATRIX_P,
mul(UNITY_MATRIX_MV, float4(0.0, 0.0, 0.0, 1.0))
- float4(input.vertex.x, input.vertex.y, 0.0, 0.0));
Il y est possible de bloquer le billboard sur l'axe Y uniquement.
Le problème c'est que je comprend bien qu'il faut calculer une matrice de rotation pour ça, mais je ne sais pas comment m'y prendre.
Help ?
Merci pour votre aide !