Modifications taille objet = texture reste taille réelle

Questions à propos du scripting Shader.
Oliver
Messages : 119
Inscription : 08 Sep 2015 15:41

Modifications taille objet = texture reste taille réelle

Message par Oliver » 19 Mai 2016 22:57

Bonjour,

Pour une meilleur explication du titre.

J'ai une maps avec des mêmes rochers mais avec des tailles différentes? Mais le problème, la texture prend la même taille du rocher.

Ce que j'aimerais faire, c'est que la texture reste égale (même taille) pour tous les rochers de toutes tailles (Donc, un material pour tous).

A-t-il une solution ? déjà existant ? bumped specular si possible ?

Merci.

Avatar de l’utilisateur
F@B
Messages : 1844
Inscription : 01 Août 2013 10:41
Contact :

Re: Modifications taille objet = texture reste taille réelle

Message par F@B » 20 Mai 2016 09:05

salut

Un objet 3D possède ce qu'on appelle des coordonées UV, c'est un dépliage a plat de l'objet pour y appliquer une texture plate en 2D forcement.

Le fait d'agrandir un objet n'agrandit pas sa texture, c'est normal il faudrait changer son UV, pour ça tu le tilling dans le material qui permet de répéter une texture sur une UV. Tu peux faire un script qui scale l'UV inversement a l'objet.
ʕ·͡ᴥ·ʔ ==> Mon Portfolio <== ʕ·͡ᴥ·ʔ

Merci de lire et de prendre en considération la Nétiquette des Forums avant de poster un sujet !

Avatar de l’utilisateur
Titan
Messages : 582
Inscription : 12 Sep 2011 13:54
Contact :

Re: Modifications taille objet = texture reste taille réelle

Message par Titan » 20 Mai 2016 11:32

En passant par un shader de "triplanar mapping" Tu obtiendrais peut être un résultat qui te conviendrai. Modifier les coordonnées des UV à l'arrache va forcément faire apparaître les "seams".
____________________________________________
Hop Boy

Avatar de l’utilisateur
F@B
Messages : 1844
Inscription : 01 Août 2013 10:41
Contact :

Re: Modifications taille objet = texture reste taille réelle

Message par F@B » 20 Mai 2016 13:55

Titan a écrit :En passant par un shader de "triplanar mapping" Tu obtiendrais peut être un résultat qui te conviendrai. Modifier les coordonnées des UV à l'arrache va forcément faire apparaître les "seams".

oui bien entendu il faut une texture seamless

en tout cas le triplanar est une solution également,
http://www.martinpalko.com/triplanar-mapping/
ʕ·͡ᴥ·ʔ ==> Mon Portfolio <== ʕ·͡ᴥ·ʔ

Merci de lire et de prendre en considération la Nétiquette des Forums avant de poster un sujet !

Oliver
Messages : 119
Inscription : 08 Sep 2015 15:41

Re: Modifications taille objet = texture reste taille réelle

Message par Oliver » 20 Mai 2016 14:47

C'est exactement ce que je cherchais, merci.

J'ai trouvé un et j'ai modifié pour rajouté "bumped specular" mais comme je ne suis pas fort de tout, il y a des erreurs.

Code : Tout sélectionner

Shader "TriPlanar"
{
    Properties
    {
        _Color ("Main Color", Color) = (1,1,1,1)
		_SpecColor("Specular Color", Color) = (0.5, 0.5, 0.5, 1)
		_Shininess("Shininess", Range(0.03, 1)) = 0.078125
        _MainTex ("Base (RGB)", 2D) = "white" {}
 		_BumpMap ("NormalMap (_Y_X)", 2D) = "bump" {}

        _SizeX("SizeX", Float) = 1
        _SizeY("SizeY", Float) = 1
       
        _NX("NX", Range(0,1)) = 1
        _NY("NY", Range(0,1)) = 1
        _NZ("NZ", Range(0,1)) = 1
    }
    SubShader
    {
            Tags { "RenderType"="Opaque" }
            LOD 200
 
        CGPROGRAM
        #pragma surface surf Lambert
 
        sampler2D _MainTex;
        sampler2D _BumpMap;

       
        fixed4 _Color;
        fixed _NX;
        fixed _NY;
        fixed _NZ;
        half _SizeX;
        half _SizeY;
        half _Shininess;
 
        struct Input
        {
            half3 worldPos;
            fixed3 worldNormal;
        };
 
        void surf (Input IN, inout SurfaceOutput o)
        {
            half2 scale = half2(_SizeX, _SizeY);
 
            fixed4 c0 = tex2D(_MainTex, IN.worldPos.xz/scale);
            fixed4 c1 = tex2D(_MainTex, IN.worldPos.xy/scale);
            fixed4 c2 = tex2D(_MainTex, IN.worldPos.zy/scale);
           
            fixed3 d0 = text2D(_BumpMap, IN.worldPos.xz/Scale);
            fixed3 d1 = text2D(_BumpMap, IN.worldPos.xz/Scale);
            fixed3 d2 = text2D(_BumpMap, IN.worldPos.xz/Scale);
 
            fixed3 nWNormal = normalize(IN.worldNormal*fixed3(_NX, _NY, _NZ));
            fixed3 projnormal = saturate(pow(nWNormal*1.5, 4));
 
            half4 resultText = lerp(c0, c1, projnormal.z);
            resultText = lerp(resultText, c2, projnormal.x);
           
            half4 resultBump = lerp(d0, d1, projnormal.z);
            resultBump = lerp(resultBump, d2, projnormal.x);
 
            o.Albedo = resultText.rgb * _Color.rgb;
            o.Alpha = resultText.a * _Color.a;
            o.Specular = _Shininess;
           
            o.Normal = normalize * resultBump.rgb);
           
        }
        ENDCG
    }
 
    Fallback "VertexLit"
}
 
Pouvez-vous corriger SVP ? comme je ne suis pas très fort :mrgreen:

Merci.

Avatar de l’utilisateur
Titan
Messages : 582
Inscription : 12 Sep 2011 13:54
Contact :

Re: Modifications taille objet = texture reste taille réelle

Message par Titan » 22 Mai 2016 11:11

F@B a écrit :
Titan a écrit :En passant par un shader de "triplanar mapping" Tu obtiendrais peut être un résultat qui te conviendrai. Modifier les coordonnées des UV à l'arrache va forcément faire apparaître les "seams".
oui bien entendu il faut une texture seamless
Je ne parlais pas des bords de la texture mais des coutures du mesh. Même avec une texture qui boucle et même en ne multipliant que par des nombres entier, j'imagine mal comment on pourrait le faire coller (exemple de dépliage de caillou comme je le voie).
Pouvez-vous corriger SVP ? comme je ne suis pas très fort
La prochaine fois que tu a un probléme demande si on peut t’aiguiller plutôt que de demander à ce qu'on te le corrige, donne les erreurs de la console ou un screenshoot du résultat...

Il ne suffit pas de multiplier la normal de la texture par la normal de l'objet, il faut mettre les deux valeurs dans un référentiel commun. Pour ça tu a besoin d'ajouter la tangente aux informations des vertices mais Je ne me rappel plus des détails. Si tu n'a pas envie de te prendre la tête, prend le pack de shader triplanar PBR du store, mais si tu a le temps, fait le c'est un bon exercice.
____________________________________________
Hop Boy

Oliver
Messages : 119
Inscription : 08 Sep 2015 15:41

Re: Modifications taille objet = texture reste taille réelle

Message par Oliver » 22 Mai 2016 17:16

Ok merci.

J'ai corrigé cette ligne :

Code : Tout sélectionner

o.Normal = normalize * _resultBump.rgb;
Mais après je ne comprend les autres erreurs :

- incompatible types in initialization; invalid initialization at line 62
- assignment of incompatible types at line 6
3

- implicit cast from "half4" to "half3" at line 63
- implicit cast from "float4" to "float3" at /UnityCG.cginc(304)
- implicit cast from "float4" to "float3" at /UnityCG.cginc(603)


Code ligne 62 et 63 :

Code : Tout sélectionner

half4 resultBump = lerp(d0, d1, projnormal.z);
            resultBump = lerp(resultBump, d2, projnormal.x);

Avatar de l’utilisateur
Titan
Messages : 582
Inscription : 12 Sep 2011 13:54
Contact :

Re: Modifications taille objet = texture reste taille réelle

Message par Titan » 23 Mai 2016 10:41

Je t'ai expliqué que même une fois que tu aura corrigé toutes tes erreurs de compilation, ton bump ne marchera toujours pas correctement. Maintenant je suis d'accord que la première étape reste d'être capable de coder un truc qui compile.

Les erreurs "implicit cast" te disent que tu essai de faire une opération/assignation entre un vecteur de 4 valeurs et un vecteur de 3 valeurs.
pour les résoudre tu peut faire "value.XZWX"pour définir quels membres assigner, ou alors float4 (value.x, value.z, value.w, value.x)
Même probléme ligne 63, 64: d0 et d1 sont des float3, lerp utilise donc la version float3, mais tu essai de l'assigner à un half4.
____________________________________________
Hop Boy

Répondre

Revenir vers « les Shaders »