Author Topic: Courbe iso sur surface bilinéaire...  (Read 4912 times)

0 Members and 2 Guests are viewing this topic.

Offline Patapom

  • Base
    • View Profile
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Courbe iso sur surface bilinéaire...
« on: 14 October 2011 à 01:47:15 »
Yo !

Long time no see. J'ai une question pour les matheux :

Voici un beau pixel avec 4 valeurs à ses 4 coins :


L'interpolation bilinéaire de ces valeurs nous donne, pour x,y € [0,1] :

z(x,y) = z0 + dz1.x + (z2 - z0).y + (dz1 - dz0).xy

Comment feriez-vous pour trouver l'ensemble des solutions z(x,y) = constante ??

Bisou(x,y).
.  Pom  .

Offline krabob

  • Base
    • Pouet.net
    • View Profile
    • www.m4nkind.com
  • Ancienneté: 1994
  • Groupe: Mankind
  • Rôle: code amiga / linux / OpenGL
  • Ville: Toulouse
Re : Courbe iso sur surface bilinéaire...
« Reply #1 on: 14 October 2011 à 11:44:21 »
bah tu trouves les solutions sur les arrêtes, puis tu devines les courbes qui lient les différentes solutions des arrêtes à l'intérieur du carré avec le même genre de bidouille que pour les marchin cube (edit: une table des 16 configurations de carré suivant que chacun des 4 coins sont < ou > la cte.) ... Pour l'équation d'interpolation que tu donnes, les solutions doivent être des lignes, pour d'autres interpolation des courbes. ( trouver les courbes par subdivision en carré plus petits, ou trouver la gueule de la courbe par analyse): déjà, aussi, tu peux écarter les carrés ou tout les points sont out du même sens: pas de solution. (2 cas sur les 16)
attention aux cas "croisé" ( cas ou : une diago <cte, l'autre diago > cte)
« Last Edit: 14 October 2011 à 12:06:52 by krabob »
Votez comme ça Mélenchon ... ou Clément Wittman, ... ou Eva ! Oo

Offline Patapom

  • Base
    • View Profile
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : Courbe iso sur surface bilinéaire...
« Reply #2 on: 14 October 2011 à 12:55:26 »
Yep, effectivement, très bonne réponse de Krabob. ;D

Bon je peux faire ça mais là je cherchais une solution plus analytique. Et notre brave Skal national m'a répondu aussi un truc intéressant que je vous livre ici (ça peut peut-être vous servir aussi ?) :

Quote
ta surface, c'est une hyperboloïde à une ou deux nappes, et si tu l'intersectes avec un plan pour trouver les z qui vont bien, ca va te donner une conique, le plus souvent une hyperbole.

Et maintenant, la solution:

L'equation general que tu cherche a resoudre, c'est :

z-z0 = a.x + b.y + c.x.y

Si tu factorise, ca donne: (z - z0)/c = xy +a/c.x + b/c.y = (x + a/c) . (y + b/c) - ab/c^2.

Si tu poses le changement de variable:
  x' = x + a/c
  y' = y + b/c
  z' = (z-z0)/c + ab/c^2

tu as simplement: z' = x' * y'

Soit : une hyperbole (avec une infinite' de solutions, oui).

skal

J'avais dit une parabole, j'm'étais gouré. Merci Skal et Krabob ! ;D

.  Pom  .

Offline Patapom

  • Base
    • View Profile
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : Courbe iso sur surface bilinéaire...
« Reply #3 on: 14 October 2011 à 13:40:42 »
Pour ceux qui se demandent pourquoi j'ai besoin de ça : voilà ma situation.

J'ai un buffer downsamplé x0.25 où j'ai calculé des valeurs d'éclairage qui ne sont valides que pour un Z également downsamplé x0.25 .
Quand je veux appliquer ce rendu downsamplé à ma scène, je fais un upsampling mais j'ai besoin de la valeur d'éclairage pour le Z de la scène, qui est sans doute différent du Z downsamplé, sauf dans le coin (0,0) du pixel downsamplé.

L'idée est donc de résoudre cette équation d'hyperbole pour trouver l'ensemble des solutions où Z(x,y) équivaut au Z de la scène. De préférence avec x,y € [0,1], sinon on clampe.

Ensuite, hében interpoilation bilinéaire des 4 valeurs d'éclairage et zou ! Ca devrait nous donner l'éclairage qu'on aurait eu si on avait calculé plus finement.

Bien entendu, ça ne fonctionne que pour des variations légères de Z. Ca doit donner une catastrophe sur les edges des objets... Idéalement, dans le cas où on trouve x,y en dehors de [0,1], il faudrait relancer un calcul d'éclairage complet...
.  Pom  .

Offline krabob

  • Base
    • Pouet.net
    • View Profile
    • www.m4nkind.com
  • Ancienneté: 1994
  • Groupe: Mankind
  • Rôle: code amiga / linux / OpenGL
  • Ville: Toulouse
Re : Courbe iso sur surface bilinéaire...
« Reply #4 on: 14 October 2011 à 16:01:12 »
j'ai pas de bidouille à énoncer pour ça, mais présenté comme ça, on dirait en loin la même problématique que pour l'AA. (besoin de plus de précision sur les bords des polys.)

 au fait, dans les conf' des GPU il est pas possible d'avoir de l'interpolation autre que bilinéaire ? - cubique, gaussien ou autre , qui fasse pas d'artefact en "croix" quand on zoome ?
 
ah oui, et yavait pas une bidouille de décalage de plusieurs image transparentes pour avoir un flou parfait à partir d'une interpolation bilinéaire ?

 Une fois j'avais codé un zoom RGB en software juste avec des poly carrés en goureau", (que des additions) et je m'étais demandé si ça vallait pas le coup d'appliquer des bézier sur les RGB pour avoir des interpolations plus "continues"...( et le faire avec seulement des additions pour le vieux matos), mais bon je suis hors sujet. 
Votez comme ça Mélenchon ... ou Clément Wittman, ... ou Eva ! Oo

Offline ponce

  • Base
    • Pouet.net
    • Coup de coeur
    • View Profile
  • Ancienneté: 2009
Re : Courbe iso sur surface bilinéaire...
« Reply #5 on: 14 October 2011 à 20:29:09 »
Oui la solution que j'avais vue pour ce genre de downsampling avec des valeurs très loin c'est de mettre des 0 dans un channel, des 1 là où tu écris effectivement, puis ensuite tu divises par la valeur downsamplée pour faire une pondération. Ca nécessite un channel de plus.
Mais bon vous devez déjà connaître ce truc de shadowmap.

Quote
ah oui, et yavait pas une bidouille de décalage de plusieurs image transparentes pour avoir un flou parfait à partir d'une interpolation bilinéaire ?
Sans doute qu'on peut reproduire un kernel compliqué avec du blend mais le fillrate va souffrir.

iq a écrit sur son site un truc pour avoir une interpolation cubique en utilisant un sampling bilinéaire sinon. Les interpolations futées coûteuse genre sinc c'est décevant à cause du clipping que ça entraine et ça supporte pas vraiment les valeurs réparties selon une loi de puissance (RGB linéaire).

D'après ce que j'ai compris, une méthode populaire pour avoir un blur d'un buffer c'est de downsampler les niveaux de mipmaps inférieurs avec la carte et de refaire quelques passes pour les N derniers niveaux supérieurs avec un shader style bicubique, là où les artefact en "croix" sont les pires.

Offline u2Popsy

  • Base
    • View Profile
    • u2 Blog
  • Ancienneté: 1996
  • Groupe: PoPsY TeAm
  • Rôle: coder
  • Ville: Lyon
Re : Courbe iso sur surface bilinéaire...
« Reply #6 on: 16 October 2011 à 11:15:28 »
Il faut faire du bilateral filtering lorsque tu upsample + calculé en full res les endroits qui n'ont pas de solution possible avec le downsampling.
Pata : Mais j'ai l'impression de t'en avoir déjà parlé 36 fois de cette solution ou je me trompe...

Offline Patapom

  • Base
    • View Profile
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : Courbe iso sur surface bilinéaire...
« Reply #7 on: 16 October 2011 à 12:31:33 »
@Dave : C'est déjà ce que je fais, ça marche super bien mais recalculer en fullres est trop coûteux.
J'essaie donc de réinventer un pixel mais mieux qu'un bête bilerp quoi. Et c'est la merde...
.  Pom  .

Offline u2Popsy

  • Base
    • View Profile
    • u2 Blog
  • Ancienneté: 1996
  • Groupe: PoPsY TeAm
  • Rôle: coder
  • Ville: Lyon
Re : Courbe iso sur surface bilinéaire...
« Reply #8 on: 16 October 2011 à 16:26:09 »
Pata  Hum pour tes calculs FullRes est-ce que tu as une passe qui permet de donner les zones qui n'ont pas besoin d'être calculées ? Genre tu détecte les Edges en Fulles puis clear le ZBuff en fct de tes detections de Edges avant de faire ton rendu qui prend du temps ( a moins d'avoir une geometry très chaotique avec des changements de Z tout le temps tu gagne pas mal de temps ).

Offline Patapom

  • Base
    • View Profile
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : Courbe iso sur surface bilinéaire...
« Reply #9 on: 16 October 2011 à 16:45:00 »
Bah oui c'est ce que je te dis : je rends en lowrez d'abord, puis ensuite une passe fullrez où je check la différence entre le Z calculé et le Z de la scène. Si la différence dépasse un seuil fixé alors je relance un calcul pour ce pixel... Mais c'est trop coûteux de faire ça, essentiellement quand t'as des scènes à la con avec de la végétation et des edges super jaggy...
.  Pom  .

Offline u2Popsy

  • Base
    • View Profile
    • u2 Blog
  • Ancienneté: 1996
  • Groupe: PoPsY TeAm
  • Rôle: coder
  • Ville: Lyon
Re : Courbe iso sur surface bilinéaire...
« Reply #10 on: 16 October 2011 à 17:31:52 »
Quote
puis ensuite une passe fullrez où je check la différence entre le Z calculé et le Z de la scène
Cette partie tu la fais dans le shader ou est-ce que tu laisse faire le Z Test du GPU car en terme de performance cela change beaucoup.
« Last Edit: 16 October 2011 à 17:42:28 by u2Popsy »

Offline Patapom

  • Base
    • View Profile
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : Courbe iso sur surface bilinéaire...
« Reply #11 on: 16 October 2011 à 17:37:10 »
Je la fais avec le shader... if ( abs(ZScene - ZDownsampled) > Threshold ) then recompute...
C'est vrai que j'aurais pu le faire avec la carte mais là j'ai pas le choix d'façons... Et puis c'est pas ça le bottleneck : si tu fais un recompute d'un truc super lourd, ça va quand même bouffer un max de temps, même si le ZTest est fait par la carte.

'fin j'te dis, là j'ai pas trop le choix. Unity est super casse-couilles tu peux absolument pas lui spécifier le ZBuffer d'entrée ou de sortie...
.  Pom  .

Offline u2Popsy

  • Base
    • View Profile
    • u2 Blog
  • Ancienneté: 1996
  • Groupe: PoPsY TeAm
  • Rôle: coder
  • Ville: Lyon
Re : Courbe iso sur surface bilinéaire...
« Reply #12 on: 16 October 2011 à 17:48:52 »
Pata : non ca bouffera en gros beacuoup moins de temps car le ZTest skip completement l'execution du shader + avec le hierarchy culling Z des blocks entiers de l'image sont skippés ( ce qui n'est pas le cas avec un test directement dans le shader ).
Même si tu as un calcul lourd tu ne le process que sur les N Pixels d'edges ( en fait c'est plutot en Npixel + les pixels adjacants dans le Quad que traite le GPU ). tandis qu'avec ta solution tout les pixel sont processés ( même si ton test dans le Shader les rejette ).
je te conseil ces articles pour savoir plus précisement comment cela foncitonne http://fgiesen.wordpress.com/2011/07/09/a-trip-through-the-graphics-pipeline-2011-index/

Pour ton problème il faut que tu arrive a évalue le if ( abs(ZScene - ZDownsampled) > Threshold ) dans une passe éxtérieur. ( généralement une passe de détection de edge en fonction du Z ou des normale ou de ce que tu veux )

enfin
Quote
Unity est super casse-couilles tu peux absolument pas lui spécifier le ZBuffer d'entrée ou de sortie...
Si tu peut clearer le Zbuffer et faire plusieurs rendu de quad qui va updater le ZBuffer ( semantic DEPTH0 si pixel shader 3.0 son permis ) alors je ne vois pas le souci..
« Last Edit: 16 October 2011 à 17:56:11 by u2Popsy »

Offline Patapom

  • Base
    • View Profile
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : Courbe iso sur surface bilinéaire...
« Reply #13 on: 16 October 2011 à 18:59:29 »
Non mais là j'ai pas trop le temps de faire ça, et j'te dis : Unity te permet pas de spécifier un ZBuffer. 'fin si mais c'est extrêmement relou. Là j'en suis plus au point où j'ai le temps d'expérimenter avec leur engine.

En + si tu veux mon process c'est :
Code: [Select]
Read Scene color
Read scene Z
Read downscaled Z
float4  SkyColor;
if ( DeltaZ > Threshold )
  SkyColor = Recompute();
else
  SkyColor = Read downscaled sky color

Read Background color
return Mix( SkyColor + Background Color + Scene Color )

Donc de toute manière je dois processer tous les pixels avec ce code, y a pas de ZTest qui tienne
.  Pom  .