Auteur Sujet: Raymarching - besoin d'explications  (Lu 20355 fois)

0 Membres et 1 Invité sur ce sujet

Originale comme forme de spikeball, les piques fins à fond, ca peux faire une bonne scène blood ! Chez moi ca donne ca (image attaché), rendu avec un petit exe homemade pour voir du quad shader.
Ca bug un peu, ya des points qui se baladent, mais ca c'est pas la premiere fois que je  vois des bugs de shaders glsl sur sur ma Radeon Mobility 5650. En utilisant "i += 1.0/32.0" (au lieu de 1.0/64.0) les petits points disparaissent, ca double le framerate, et visuellement on ne voit pas vraiment de différence.

Yopla ( oui oui deterrage  8))

Bon je voulais finir un petit truc, et je me heurte à un petit problème.
L'idée est d'avoir 2 sphères de diametre 2.4 et 0.8, et respectivement de centre ( 0., 0., 0.) et (2.4, 0., 0.).
Je voudrais calculer la meta-surface reliant les 2. De mémoire je faisais distanceSphere1 * distanceSphere2 / (rayon1* rayon2) ;
Mais le résultat n'est pas probant du tout.

  for(int i = 0; i<64; i++)
  {
    vec3 c = ro + d *rd;
    float d1 = length(c)-2.4;
    float d2 = distance(c,vec3(2.,0.,0.))-.8;
    float e = min(d1,d2);
    if(e < .1)
    {
      color = vec3(1.,d1,d2);
    }
    d+=e;
  }

Du coup en l'etat je suis revenu sur un raymarcher avec 2 Spheres, mais j'ai vraiment besoin de la metasurface ;-)
Si quelqu'un peut me filer une piste pour la fonction distance à appliquer s'il vous plait ?

Merci beaucoup

S

P.S : j'ai bien vu le message de nystep 2 pages avant ( c'est d'ailleurs comme ca qu ej'ai trouvé le thread), sauf que j'ai du rater une marche...

Etant donné que ca m'embeter legerement, je me suis dis que j'allais tenter un blending :

float smoothCurves(float x)
{
  return (x<0.)?0.:x;
}

void main()
{
  vec2 p = -1.0 + 2.0 * gl_FragCoord.xy / resolution.xy;
  p.x *= resolution.x/resolution.y;

  vec3 ro = ExtractCameraPos(modelViewMatrix);
  vec3 ww = normalize(vec3(0.0) - ro);
  vec3 uu = normalize(cross( vec3(0.0,1.0,0.0), ww ));
  vec3 vv = normalize(cross(ww,uu));
  vec3 rd = normalize( p.x*uu + p.y*vv + 1.5*ww );

  vec3 color = vec3(0.,.5,.5);
  float d =0.;

  for(int i = 0; i<64; i++)
  {
    vec3 c = ro + d *rd;
    float d1 = length(c)-1.2;
    float d2 = distance(c,vec3(1.2,0.,0.))-.4;
    float e = mix(d1,d2,smoothCurves(d1-d2));
    if(e < .01)
    {
      color = vec3(1.,d1,d2);
    }
    d+=e;
  }

  gl_FragColor = vec4(color, 1.0);
}

Sauf que la surface est toujours pas assez smooth ... Je vais y arriver, je vais y arriver !

C'est mieux, mais c'est toujours pas ce qui m'interesse :

for(int i = 0; i<64; i++)
  {
    vec3 c = ro + d *rd;
    vec3 c1 = c;
    float mbd1 = 1.2/(1.2+dot(c1,c1));
    vec3 c2 = c-vec3(1.2,0.,0.);

    float mbd2 = .4/(.4+dot(c2,c2));
    float e = mbd1 + mbd2;
   
    if(e < .055 )
    {
      color = vec3(1.,mbd1,mbd2);
      break;
    }
    d+=e;
}

Grrr ... Tout ce que je souhaite, c'est relier 2 sphères avecune jolie enveloppe englobante  :-\ Ca va le faire ...

Tu as essayé de faire simplement un blend des distances à tes deux sphères ? Une interpolation linéaire devrait déjà donner quelque chose. J'avais fait un truc dans le genre il y a quelques temps, je ne me souviens plus de la méthode (mais elle doit être dans ce thread). Ce n'était pas parfait, mais c'était un début...

Ouep, justement (c'est en page 3) ^^ J'ai fait le test et c'est d'ailleurs c'est actuellement la meilleure solution.
Mais J'ai du raté quelque chose...  dans le sens ou la surface était pas assez ouverte à l'intersection. (trop angulaire)
Ca va bien finir par le faire  :o

Bilan, je me rapproche de ce que je veux, j'ai un peu triché mais bon ca devrait le faire. Aller plus qu'à réussir à faire un fake subsurface ...