Forums Développement Multimédia

Aller au contenu

Une discution autour de l'AGAL & des Shaders

CODE Actionscript

170 réponses à ce sujet

#136 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 11 September 2012 - 17:15 PM

Oui, vu comme ça, tu as raison, alors, vaut mieux garder le principe du bitmap texture..

Samère !!! je crois que je viens de comprendre pourquoi rien ne fonctionne depuis tout à l'heure et pourquoi de ce fait, charger des floats serait finalement + long qu'une texture..

Depuis tout à l'heure je charge comme ça:

var dataBuffer:VertexBuffer3D = context3D.createVertexBuffer(4096, 1);
dataBuffer.uploadFromByteArray(data,0,0,4096);
context3D.setVertexBufferAt(2, vertexbuffer, 0, Context3DVertexBufferFormat.FLOAT_1); //va2
 

Mais je viens de comprendre par ta réponse que Stage3D ne lit pas mon BA en floats mais en Bytes .. c'est ça??? Mais c'est naze ça!! purée!! je pouvais toujours faire tous les essais agal que je voulais .. ça n'aurait jamais fonctionné..

En même temps, cette connerie me donne une idée de test.. :P

c'est trop dommage que ne sache pas tracer le contenu des registres..

En fait la signature dit ceci:

Citation

createVertexBuffer (numVertices:int, data32PerVertex:int) : flash.display3D.VertexBuffer3D …
data32PerVertex: the number of 32-bit(4-byte) data values associated with each vertex.
The maximum number of 32-bit data elements per vertex is 64 (or 256 bytes). …
data32 .. ça m'a induit en erreur.. enfin, je crois.. si tu dis juste, alors j'ai perdu mon temps..

Mais alors, pourquoi il y a BYTE_4 dans les options? je pige plus rien!
Ne baisse jamais les bras, car c'est à ce moment là que le miracle risque de se produire..

Site web: http://www.pureas3.org
Twitter: https://twitter.com/PureAS3

Enjoy with Flash Player :-)

#137 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 11 September 2012 - 17:30 PM

Bon, ben je ne voudrais pas te contredire, mais ...

J'ai fais le test suivant, si on part du principe que le context load en byte et pas en float, tu es d'accord que 4096 float ca fait 4096 X 4 bytes.. et pourtant, si je fais


var dataBuffer:VertexBuffer3D = context3D.createVertexBuffer(4096, 4);;
dataBuffer.uploadFromByteArray(data,0,0,4096);
context3D.setVertexBufferAt(2, vertexbuffer, 0, Context3DVertexBufferFormat.FLOAT_4); //va2
 

Là, ça plante! "taille d'entrée incorrecte" .. :S
Ne baisse jamais les bras, car c'est à ce moment là que le miracle risque de se produire..

Site web: http://www.pureas3.org
Twitter: https://twitter.com/PureAS3

Enjoy with Flash Player :-)

#138 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 11 September 2012 - 17:44 PM

Citation

si on part du principe que le context load en byte et pas en float, tu es d'accord que 4096 float ca fait 4096 X 4 bytes..
Je ne pense pas que le context load en byte, d'apres les tests que j'ai fait il y a queques jours, il les charge en float (ce qui me parait logique puisque tout est float coté GPU). De fait, c'est normal qu'il te dise "taille d'entrée incorrect" puisqu'il attend 4096 x 4 valeurs et qu'il n'en contient que 4096.

Dans le cas ou on passe par une texture, c'est différent parce qu'on fait du hacking et on se retrouve avec des Bytes dans les composantes xyzw. Mais le coté "Bytes" de la force vient du fait qu'on passe par une texture, pas de l'utilisation du GPU qui lui fonctionne avec des Float.

(du moins, c'est comme ça que je comprend les choses)

#139 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 11 September 2012 - 17:49 PM

Bn oui, donc, je faisais bien .. comme je charge direct mes floats, ça va + vite que de fabriquer un bitMap + charger la texture.. Après, c'est d'arriver à les utiliser en AGAL .. et là, je ne suis aps encore arrivé.. :roll:

Mais du coup, j'ai pas compris pourquoi tu fais ceci:


var n:int = 0;
while(data.byteAvailable){
                 v[n++] = data.readFloat();
}
context.setVertexAt(2,v, 0,"float1")
 

Petite erreur de ta part? ou y a une vraie raison que j'ai pas capté?
Ne baisse jamais les bras, car c'est à ce moment là que le miracle risque de se produire..

Site web: http://www.pureas3.org
Twitter: https://twitter.com/PureAS3

Enjoy with Flash Player :-)

#140 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 11 September 2012 - 18:12 PM

Normal que tu ne comprennes pas car j'ai fait une erreur, ca devrait être

var n:int = 0;
var val:Number
while(data.byteAvailable){
   val = data.readFloat();
   v[n++] = data.readFloat();    
   v[n++] = data.readFloat();    
   v[n++] = data.readFloat();    
}
context.setVertexAt(2,v, 0,"float1")
 

Citation

comme je charge direct mes floats, ça va + vite que de fabriquer un bitMap + charger la texture.. Après, c'est d'arriver à les utiliser en AGAL .. et là, je ne suis aps encore arrivé.. :roll:

En l'état, ce n'est pas possible.

Pour que tu comprenne bien, on va prendre l'exemple d'un seul triangle qui contiendra une couleur à rendre par le GPU (l'idée étant d'avoir autant de triangle que l'on souhaite de résultat car un triangle gère une seule couleur)

(en interne, on peut associer une couleur par sommet du triangle mais peu importe dans ce que cas car on ne veut pas un rendu graphique sympa mais des résultat précis)

Admettons donc qu'on travaille avec une seule valeur plutot que 4096, pour que ce soit plus clair.

On a besoin d'un retour de couleur à l'écran, il nous faut donc un triangle.
Puisqu'on a besoin d'un triangle, on besoin de 3 points ; on obtiens on VertexData qui ressemble à ca

var vertices:Vector.<Number> = new Vector.<Number>();
vertices.push(p0x, p0y);
vertices.push(p1x, p2y);
vertices.push(p2x, p2y);
var vertexBuffer:VertexBuffer3d = context.createVertexBuffer(3,2)
vertexBuffer.updateFromVector(vertices,0,3)
 

si on veut maintenant appliquer une couleur à ce triangle on est obligé de créer un autre VertexBuffer comme cela


var value:Number = 0.3;
var input.<Number> = new Vector.<Number>();
input.push(value);
input.push(value);
input.push(value);
var inputBuffer:VertexBuffer3d = context.createVertexBuffer(3,1)
inputBuffer.updateFromVector(input,0,3)
 

On est obligé de passer 3 valeurs car le Shader est appliqué triangle-par-triangle et, à l'échelle de chaque triangle, point par point. Il est donc absolument nécessaire (genre on ne peut pas faire autrement) de passer 3 fois de suite la même valeur pour s'assurer que tout les points du triangles contiennent cette valeur.

Si on appliquais ton tableau de 4096 valeurs à 4096 triangles, d'une part on ne pourrait en peindre qu'un tiers (donc ca ne marcherait pas), d'autre part chaque triangle peint contiendrait un dégradé à trois couleurs (donc difficilement exploitable pour le output).

#141 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 11 September 2012 - 18:16 PM

N'hésite pas à me dire si je ne suis pas clair (c'est probable que je ne le sois pas :D )

#142 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 11 September 2012 - 18:45 PM

Je comprend bien ce que tu me dis :) Mais je n'ai pas l'intention de faire autant de triangle que de data .. je souhaite garder mes 4 vertex de base et construire mes data en texture.. sauf que j'aimerais le faire entièrement en AGAL.. C'est peut-être là que je n'ai pas suivi..

Finalement, est-ce possible ou absolument impossible de construire une texture de 4096 pixels en AGAL à l'aide de 4096 Floats chargé dans un registre (convertis en interne en RGB avec AGAL) ?

Parce que si tu me dis " non, impossible " je perd mon temps.. et dans ce cas, je repars sur l'idée d'hier avec le bitmapData..
Ne baisse jamais les bras, car c'est à ce moment là que le miracle risque de se produire..

Site web: http://www.pureas3.org
Twitter: https://twitter.com/PureAS3

Enjoy with Flash Player :-)

#143 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 11 September 2012 - 19:09 PM

Tom, je viens peut être de comprendre un truc important!

Est-ce qu'il est possible que..

on code bien contre des colonnes (x, y, etc..) mais il me semble que le program n’exécute pas l'instruction autant de fois qu'il y a d'entrée dans le registre (ligne) mais uniquement le nombre de fois qu'il existe de vertex ..

Par exemple, moi, j'ai 4 vertex positionnés, du coup, mes ligne Agal ne sont exécutées que 4X, c'est à dire sur 4 lignes.. c'est plausible?

Par contre, si je crée une texture (comme hier) que j'utilise donc un texSampler .. là, mes lignes AGAL vont bien passer en revue tous mes pixels ou pas??

Tu sais quoi, ça me bourre le crâne ce stage3D .. :S Si encore, il y avait une doc qui explique tout clairement..

En même temps, j'ai pas pris le temps de lire le livre Stage3d, je devrais peut être.. :)
Ne baisse jamais les bras, car c'est à ce moment là que le miracle risque de se produire..

Site web: http://www.pureas3.org
Twitter: https://twitter.com/PureAS3

Enjoy with Flash Player :-)

#144 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 11 September 2012 - 19:25 PM

Bon alors, ca n'a plus de rapport, désolé mais je viens de le coder alors je le poste :)
Voila la méthode dont je parle plus haut appliqué à 4096 valeurs qui change à chaque frame


package
{
import com.adobe.utils.AGALMiniAssembler;
import flash.display.Sprite;
import flash.display3D.Context3D;
import flash.display3D.Context3DBlendFactor;
import flash.display3D.Context3DProgramType;
import flash.display3D.Context3DVertexBufferFormat;
import flash.display3D.IndexBuffer3D;
import flash.display3D.Program3D;
import flash.display3D.VertexBuffer3D;
import flash.events.Event;
/**
  * ...
  * @author tlecoz
  */

public class Test extends Sprite
{
 
  private var vertexShader:String = "" +
  "mov op, va0 \n" +
  "mov v0, va1";
 
  private var fragmentShader:String = "" +
  "mov oc, v0.xxxx";
 
  private var ctx:Context3D
  private var vertexBuffer:VertexBuffer3D;
  private var floatBuffer:VertexBuffer3D;
  private var indexBuffer:IndexBuffer3D
 
  private var vertexAssembler:AGALMiniAssembler = new AGALMiniAssembler();
  private var fragmentAssembler:AGALMiniAssembler = new AGALMiniAssembler();
 
  public function Test()
  {
   stage.scaleMode = "noScale";
   stage.align = "topLeft";
   stage.stage3Ds[0].addEventListener(Event.CONTEXT3D_CREATE, onGetContext);
   stage.stage3Ds[0].requestContext3D();
  }
  private function onGetContext(e:Event):void {
 
   ctx = stage.stage3Ds[0].context3D;
   ctx.configureBackBuffer(64, 64, 0);
 
   var w:int = 64;
   var h:int = 64;
   var w2:int = w / 2;
   var h2:int = h / 2;
   var i:int, j:int;
   var vertices:Vector.<Number> = new Vector.<Number>();
   var floats:Vector.<Number> = new Vector.<Number>();
   var indexs:Vector.<uint> = new Vector.<uint>();
 
 
   var float:Number,id:int = 0;
   for (i = 0; i < w; i++) {
    for (j = 0; j < h; j++) {
       
         vertices.push( -1 + i/w2, -1 + j/h2);
         vertices.push( -1 + (i + 2)/w2, -1 + j/h2);
         vertices.push( -1 + i/w2, -1 + (j + 2)/h2);
       
         float = Math.random();
         floats.push(float);
         floats.push(float);
         floats.push(float);
       
         indexs.push(id++, id++, id++);
    }
   }
 
   vertexBuffer = ctx.createVertexBuffer(id, 2);
   vertexBuffer.uploadFromVector(vertices, 0, id);
 
   floatBuffer = ctx.createVertexBuffer(id, 1);
   floatBuffer.uploadFromVector(floats, 0, id);
 
   indexBuffer = ctx.createIndexBuffer(id);
   indexBuffer.uploadFromVector(indexs, 0, id);
 
   vertexAssembler.assemble(Context3DProgramType.VERTEX, vertexShader);
   fragmentAssembler.assemble(Context3DProgramType.FRAGMENT, fragmentShader);
 
   var prog:Program3D = ctx.createProgram();
   prog.upload(vertexAssembler.agalcode, fragmentAssembler.agalcode);
   ctx.setProgram(prog);
 
   ctx.setVertexBufferAt(0, vertexBuffer, 0, Context3DVertexBufferFormat.FLOAT_2);
   ctx.setVertexBufferAt(1, floatBuffer, 0, Context3DVertexBufferFormat.FLOAT_1);
 
 
   addEventListener(Event.ENTER_FRAME, update);  
  }
  private function update(e:Event):void {
 
   var i:int, len:int = 4096;
   var newFloats:Vector.<Number> = new Vector.<Number>();
   var float:Number;
   for (i = 0; i < len; i++) {
    float = Math.random();
    newFloats.push(float,float,float);
   }
   floatBuffer.uploadFromVector(newFloats, 0, len * 3);
 
 
   ctx.clear(0,0,0,1);
   ctx.drawTriangles(indexBuffer,0);
   ctx.present();
  }
 
}
}
 


Citation

Par exemple, moi, j'ai 4 vertex positionnés, du coup, mes ligne Agal ne sont exécutées que 4X, c'est à dire sur 4 lignes.. c'est plausible?

C'est l'indexBuffer qui détermine ce qui doit être dessiné.
Si ton index contient 6 valeurs, donc 2 triangles, le GPU te dessinera 2 triangles, pas plus.


Citation

Par contre, si je crée une texture (comme hier) que j'utilise donc un texSampler .. là, mes lignes AGAL vont bien passer en revue tous mes pixels ou pas??

Oui, ça va fonctionner !
si un pixel à été colorié quelque part , il l'a été par le fragmentShader ; en l'occurrence la texture remplie tout le backbuffer donc tout les pixels seront traités :)

Citation

Finalement, est-ce possible ou absolument impossible de construire une texture de 4096 pixels en AGAL à l'aide de 4096 Floats chargé dans un registre (convertis en interne en RGB avec AGAL) ?

Ce n'est pas possible car la seule manière d'afficher quelque chose à l'écran est de dessiner un triangle :
Puisqu'on ne veut pas utiliser de texture, on doit créer nous même les pixels donc des triangles (puisqu'on ne peut dessiner que cette forme). Une structure en triangle sous entend des paquets de 3 points et vu qu'on ne peut pas cibler une valeur précise dans un vertexBuffer, la seule solution est de passer chaque valeur 3 fois par triangle (ou 1 fois par point, en fonction du point de vue).


Citation

Tu sais quoi, ça me bourre le crâne ce stage3D .. :S Si encore, il y avait une doc qui explique tout clairement..

Désolé c'est sans doute moi qui ne suis pas suffisamment clair...

#145 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 11 September 2012 - 19:31 PM

Citation

Si encore, il y avait une doc qui explique tout clairement..
C'était le but caché de cette conversation, mais c'est loupé :D

#146 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 11 September 2012 - 19:54 PM

Il y a quelque temps j'ai pondu ce tuto pour expliquer le fonctionnement de DrawTriangle dans le cadre d'une anim FP10
http://forums.mediab...e_drawtriangles

On utilise évidement pas Stage3D, pas de Shader, mais la gestion du VertexData,de l'indexBuffer et des texture reste le même dans le principe (à ceci près qu'avec FP10, le vertexBuffer devait contenir exclusivement des triplets XYZ)
Lire ce tuto devrait te permettre de mieux te familiariser avec la structure d'une anim 3D from scratch : la gestion des indexs, la gestion des UV , etc...

EDIT : je viens de voir que certaines démo ne fonctionnent pas , je n'ai aucune idée du pourquoi, tout fonctionnait très bien il y a quelque mois...

#147 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 11 September 2012 - 20:06 PM

Non, tracasse, c'est juste que le soir en général, quand ca va pas, j'ai le tête lourde et j'en ai marre.. :)

Bon, ok, c'est étrange, mais admettons que je sois obligé de charger une texture dans un sampler pour que mon code Agal puisse admettre qu'il y a bien plein de pixels et pas que que 2 triangle à colorier. Si je charge une texture noire " tout à 0" et en agal, j'utilise mes 4096 floats (ou tes 4096 random :) ), là, ca devient possible de colorier chaque pixel indépendamment?

Sinon, c'est sympa ton noise! :-) Si derrière, tu appliques la capture bitMap au sampleData, tu obtiendras un bruit Blanc (ou un rose, je ne sais plus..) .. ça existe vraiment en Audio et ça sert d'ailleurs à plein de choses, comme par exemple, pouvoir régler un equalizer ..

Mais avec tous tes triangles, je suppose que l'image dans le backBuff ne contient pas des pixels 1x1 parfaitement carrés!? si??
Ne baisse jamais les bras, car c'est à ce moment là que le miracle risque de se produire..

Site web: http://www.pureas3.org
Twitter: https://twitter.com/PureAS3

Enjoy with Flash Player :-)

#148 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 11 September 2012 - 20:08 PM

Ok, merci pour le lien! ;)

Oui, parfois les anciennes demo.. moi aussi, le stageVideo allait super quand il est sorti .. mais à présent, ma demo ne fonctionne plus non plus et je ne sais pas pourquoi..
Ne baisse jamais les bras, car c'est à ce moment là que le miracle risque de se produire..

Site web: http://www.pureas3.org
Twitter: https://twitter.com/PureAS3

Enjoy with Flash Player :-)

#149 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 11 September 2012 - 20:26 PM

Ben il est bien ton tuto! :) les demos fonctionnent chez moi..(la plupart) T'en a pondu du code pour tout ça.. :roi:

Bon, ben sinon, bonne nuit.. je quitte pour ce soir..
Ne baisse jamais les bras, car c'est à ce moment là que le miracle risque de se produire..

Site web: http://www.pureas3.org
Twitter: https://twitter.com/PureAS3

Enjoy with Flash Player :-)

#150 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 11 September 2012 - 20:31 PM

Citation

Si je charge une texture noire " tout à 0" et en agal, j'utilise mes 4096 floats (ou tes 4096 random :) ), là, ca devient possible de colorier chaque pixel indépendamment?
J'ai bien envie de tester pour être absolument sur et certain que oui, mais apriori oui

Citation

Mais avec tous tes triangles, je suppose que l'image dans le backBuff ne contient pas des pixels 1x1 parfaitement carrés!? si??
Théoriquement, ça devrait puisqu'on créé des triangles de 2px de coté espacé l'un des autres de 1px à l'horizontal et à la vertical ; chaque partie visible d'un triangle devrait avoir la forme d'un carré de 1px de coté.


Mais il faut tester, je n'ai jamais essayé de faire ce genre de trucs ultra précis via un shader , c'est l'occasion :)

#151 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 11 September 2012 - 20:56 PM

Je te confirme que ça fonctionne ! :)

Voila mon test (pas essayé d'optimiser le passage ou j'assigne une couleur à mes vertex, c'est juste pour tester vite fait)

package
{
import com.adobe.utils.AGALMiniAssembler;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.display3D.Context3D;
import flash.display3D.Context3DBlendFactor;
import flash.display3D.Context3DProgramType;
import flash.display3D.Context3DVertexBufferFormat;
import flash.display3D.IndexBuffer3D;
import flash.display3D.Program3D;
import flash.display3D.VertexBuffer3D;
import flash.events.Event;
/**
  * ...
  * @author tlecoz
  */

public class Test extends Sprite
{

  private var vertexShader:String = "" +
  "mov op, va0 \n" +
  "mov v0, va1";

  private var fragmentShader:String = "" +
  "mov oc, v0";

  private var ctx:Context3D
  private var vertexBuffer:VertexBuffer3D;
  private var floatBuffer:VertexBuffer3D;
  private var indexBuffer:IndexBuffer3D

  private var vertexAssembler:AGALMiniAssembler = new AGALMiniAssembler();
  private var fragmentAssembler:AGALMiniAssembler = new AGALMiniAssembler();

  public function Test()
  {
   stage.scaleMode = "noScale";
   stage.align = "topLeft";
   stage.stage3Ds[0].addEventListener(Event.CONTEXT3D_CREATE, onGetContext);
   stage.stage3Ds[0].requestContext3D();
  }
  private function onGetContext(e:Event):void {
 
   ctx = stage.stage3Ds[0].context3D;
   ctx.configureBackBuffer(64, 64, 0);
 
   var w:int = 64;
   var h:int = 64;
   var w2:int = w / 2;
   var h2:int = h / 2;
   var i:int, j:int;
   var vertices:Vector.<Number> = new Vector.<Number>();
   var floats:Vector.<Number> = new Vector.<Number>();
   var indexs:Vector.<uint> = new Vector.<uint>();
 
   var col:int = 0;
   var val:uint
   var ch:String = "";
   var r:Number, g:Number, b:Number;
   var float:Number = 0, id:int = 0;
 
   var zeros:Array = ["0", "00", "000", "0000", "00000"];
   var inputTest:Array = [];
 
   for (i = 0; i < w; i++) {
        for (j = 0; j < h; j++) {
       
         vertices.push( -1 + i/w2, -1 + j/h2);
         vertices.push( -1 + (i + 2)/w2, -1 + j/h2);
         vertices.push( -1 + i/w2, -1 + (j + 2)/h2);
         //j'assigne une couleur différente
                                                                                //par triangle, en commencant à 0
                                                                                //jusqu'a 4096
                                                                                //
         ch = "" + col;
         ch = zeros[6 - ch.length - 1] + ch;
         ch = "0x" + ch;
         val = Number(ch);
         inputTest[val] = 1;
         //trace(val);
       
         r = (val >> 16) / 255;
         g = (val >> 8 & 0xFF) / 255;
         b = (val & 0xFF) / 255
         col++;
       
       
         //float = Math.random();
         floats.push(r,g, b );
         floats.push(r,g, b );
         floats.push(r,g, b );
       
       
       
         indexs.push(id++, id++, id++);
        }
   }
 
   vertexBuffer = ctx.createVertexBuffer(id, 2);
   vertexBuffer.uploadFromVector(vertices, 0, id);
 
   floatBuffer = ctx.createVertexBuffer(id, 3);
   floatBuffer.uploadFromVector(floats, 0, id);
 
   indexBuffer = ctx.createIndexBuffer(id);
   indexBuffer.uploadFromVector(indexs, 0, id);
 
   vertexAssembler.assemble(Context3DProgramType.VERTEX, vertexShader);
   fragmentAssembler.assemble(Context3DProgramType.FRAGMENT, fragmentShader);
 
   var prog:Program3D = ctx.createProgram();
   prog.upload(vertexAssembler.agalcode, fragmentAssembler.agalcode);
   ctx.setProgram(prog);
 
   ctx.setVertexBufferAt(0, vertexBuffer, 0, Context3DVertexBufferFormat.FLOAT_2);
   ctx.setVertexBufferAt(1, floatBuffer, 0, Context3DVertexBufferFormat.FLOAT_3);
 
 
   var bd:BitmapData = new BitmapData(64, 64, false, 0);
 
   ctx.clear(0,0,0,1);
   ctx.drawTriangles(indexBuffer, 0);
   ctx.drawToBitmapData(bd);
   ctx.present();
 
   var n:int = 0;
   var used:Array = [];
   var c:int = 0;
   for (i = 0; i < w; i++) {
        for (j = 0; j < h; j++) {
         c = bd.getPixel(i, j);
         if (undefined == used[c] && inputTest[c] == 1) {
//pour être sur que 2 couleurs ne se superposent pas
//et qu'on ne choppe pas 2 fois la même
//ou une mauvaise couleur
          used[c] = 1;
          n++
         }
        }
   }
   trace("nbSingleColor = " + n);//--> 4096
  }

}
}
 


#152 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 12 September 2012 - 00:01 AM

Je ne comprend pas pourquoi, mais je n'arrive pas à faire la même chose en partant d'une texture...
J'essaye de plaquer la texture sur chacun de mes 4096 pixel mais il doit exister un micro décalage car le bitmapData de sortie ne correspond pas exactement au bitmapData d'entrée (et le son est inaudible).

Puisque j'ai une "grille de triangle" correspondant à mes pixels, j'ai essayé d'utiliser les même coordonnées UV pour les 3 points de mes triangles afin de selectionner avec certitude une couleur unique pour chaque triangle ; le principe fonctionne car tout mes pixels sont bien mis à jour (et visuellement ça a l'air pareil) mais mes UV doivent cibler le mauvais pixel. J'ai essayé de tatonner pour trouver le pixel voisin qui va bien, mais non....je ne le trouve pas.....

Ca m'agace.......................

#153 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 12 September 2012 - 06:34 AM

Je n'ai toujours pas trouvé comment appliquer ma texture, mais la bonne nouvelle c'est qu'uploader les 4096 x 3 valeurs dans le GPU peut se faire entre 0 et 1 ms (sur le poste de l'agence, chez moi je devrais être à 0).

Il suffit , au moment de l'init, de préparer le Vector.<Number>

var datas:Vector.<Number> = new Vector.<Number>(4096,true);
var i:int:
for(i=0;i<4096;i++) datas[i] = 0;
 

qu'on met à jour comme ça

var i:int = 0
while(ba.byteAvailable) datas[i++] = datas[i++] = datas[i++] = ba.readFloat();
 

La mauvaise nouvelle est que sur mobile, c'est sans doute beaucoup plus lent (mais je ré-essaierai demain tout à l'heure avec la texture, je ne m'explique pas que je n'y arrive pas donc en perseverant ça devrait bien finir par marcher ^^ )

EDIT : plus qu'a convertir le float en 4-bytes coté GPU pour réconstruire l'image pour récupérer le BA du son sans faire de boucle (j'ai commencé à le faire à la main, mais j'ai abandonné au bout de 50 lignes, j'ai donc porté le code en AS2AGAL mais évidement l'un des calculs bug (^^), bref je finirais ça tout à l'heure, ce ne doit pas être grand chose)

#154 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 12 September 2012 - 08:04 AM

Salut, oui, l'accès byte brut sur les ba est bcp + rapide [ ] .. mais bon, ce matin, je fais des essais en chargeant une texture neutre (tout à 0 pour faire rapide) je l'applique avec un tex .. dans TF0 et derrière, j'essaye mettre à jour mon TF0.x avec les valeurs contenue dans V1 .. mais ça marche pas...

On dirait qu'il est impossible de travailler sur une texture unique en parcourant pixel par pixel .. il me fait une espère de dégradé à la con de gauche à droite de mon carré..

Evidement, mes 4096 data de couleur, je les charge au depart dans un vertexBuffer (va2) afin de pouvoir le faire vite avec un ba. mais je suppose que si je charge dans un F Constant, ça changera rien.. à ton avis?

Donc, je pense qu'il est impossible de construire une texture en agal .. on est sans doute obliger de la charger dans un sampler.. (c'est comme ça que je comprend le truc)

Dans ton idée de créer 4096 (x3) vertex, ok, tu va pouvoir colorier chaque triangle séparément.. en y associant un vecteur de couleurs.. si chaque couleur est dupliquée aux 3 vertex de chaque triangle, ca devrait rouler.. mais comment vas-tu profiter des extrapolation linear etc.. Dans ton principe, on a pas 1 texture, mais au final, on a 4096 textures de quelques pixels.. l'approche est complètement différente..

Tu superposes en partie tes triangles afin que seul 1 px soit rendu par triangle.. l'idée est bonne.

Et ne faire que 4096 vertexs + 2 pour terminer le dernier triangle, les placer à 1 px d'ecart (pour faire des triangles de 1px) la carte graph accepterait ça? et dessinerait un pixel entier? ou n'afficherait rien du tout? Ou faire 4096 carré de 1px (sans superposer quoi..)

C'est grave qu'il faille faire tout ça.. mais bon..

Mais bon, visiblement, l'approche 4096 groupe de vertexs permet de loader les couleur en float natif et pas en RGB .. c'est sans doute un avantage..

EDIT:

Ton truc pour accélérer la mise en charge du Vector, c'pareil pour les BA.

Tu init ton ba par " ba.length = 4096 * 4; " du coup, tu as déjà un ba rempli de 0 ;) ma texture neutre est faite comme ça.. je charge mon ba de 0 en texSampler sans faire de for ni rien.

une fois rempli de 0, tu peux aussi y accéder via [ ] (byte brut après byte brut) pour le remplir.


var texBa:ByteArray = new ByteArray;
texBa.length = 4096 * 4;
texture = context3D.createTexture(64, 64, "bgra", true);
texture.uploadFromByteArray(texBa, 0);
context3D.setTextureAt(0, texture);
 

et pour faire un tex toute grise


for (var i:int = 0; i < texBa.length; i++) texBa[i] = 0x7f;
 

Ca pulse :-)

Dans ton vector datas, t'as pas besoin de le remplir de 0, il l'est déjà.
Ne baisse jamais les bras, car c'est à ce moment là que le miracle risque de se produire..

Site web: http://www.pureas3.org
Twitter: https://twitter.com/PureAS3

Enjoy with Flash Player :-)

#155 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 12 September 2012 - 08:27 AM

je ne sais pas comment tu vas convertir float 2 RGBA, mais il est clair qu'il faudra une routine AGAL qui le fasse et p'tet même une qui fait l'inverse, ce serait bien :)
Ne baisse jamais les bras, car c'est à ce moment là que le miracle risque de se produire..

Site web: http://www.pureas3.org
Twitter: https://twitter.com/PureAS3

Enjoy with Flash Player :-)

#156 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 21 September 2012 - 16:48 PM

Voilà, j'ai pu faire d'autres tests et avancer dans la compréhension des registres, de l'AGAL etc..

L'approche Texture seule, j'avais fais ceci:
http://www.pureas3.o...lab/DSP-on-GPU/

Les limitations sont :

- texture obligatoire de 2 exposant N (limite bcp les extrapolations)
- pas d'exécution AGAL au pixel près, mais bien 4 passes (une par vertex), soit prise en compte de 4 lignes d'un registre Variant ou Fragment

Un approche Vertexs seuls, voici un début: (avec juste un réglage de volume en AGAL)
http://www.pureas3.o...rtex/index.html

Avantages:
- Passe sur chaque pixel (4096 valeurs prises en compte car 4096 vertex maîtres (accompagné de leur 2 autres pour former le fragment).
- pas de limite pour l'extrapolation
- texturage à partir de 4096 valeurs Float chargées en registre Vertexs attributes
- séparation en 2 programs AGAL de chacun 200 op max.

Inconvénients:
- obligation d'avoir 3 * chaque vertexs
- obligation de tripler tous les floats


Les codes principaux:

Création des vertex pour former des fragments de 1px (je pousse 3X pour la lecture du code, j'aurais pu tout mettre en 1 push)


[inline]
final private function makeVertices():Vector.<Number>
{
var vertices:Vector.<Number> = new Vector.<Number>;
    var x:Number, y:Number;
for (var i:int = 0; i < 4096; i++)
{
            x = ((i % 64) - 32) * 0.03125;
            y = (int(i / 64) - 32) * -0.03125;
        vertices.push(x, y);
        vertices.push(x + 0.03125, y);
        vertices.push(x + 0.03125, y - 0.03125 );
}
return vertices;
}
 

Creation des indexs


[inline]
final private function makeIndices():Vector.<uint>
{
var indices:Vector.<uint> = new Vector.<uint>;
var i:uint = 0;
while (i < 4096 * 3)
{
  indices.push(i++, i++, i++);
}
return indices;
}
 

Triplage des valeurs ( le plus vite possible, donc, super inline..)


var dataVector:Vector.<Number> = new Vector.<Number>(4096 * 12);
var i:uint = 0;
while (i < 4096 * 3)dataVector[i++] = dataVector[i++] = dataVector[i++] = baFloat.readFloat();
 

AGAL vertex qui applique le volume sur base de valeurs en VConstants.


var agalVertex:Vector.<String> = new <String>
[
    "mov op, va0",
    "mul v0, va1,vc0.x",
    //"mov v0, va1"
];
 

AGAL Pixel qui m'encode mes Floats sur 9 bits pour la sortie sur base de valeurs en FConstants.


var agalPixel:Vector.<String> = new <String>
[

    "mov ft0.w, fc0.x",
    "slt ft0.z, v0.x, fc0.w",
    "abs ft0.xy, v0.x",
    "mov oc, ft0"

];
 

Bon, voilà, pour le moment..

Je vais encore faire quelques recherches autour de ce projet, mais je pense que c'est inutile d'aller trop loin et de perdre son temps.. A priori, les FFT ne devraient pas être possibles à cause qu'on ne sait pas générer un pixel sur base du précédent..

Mais on peut mixer jusqu’à 7 pistes ( 8 registres VA dispos ) et sans doute quelques effets. Après, il faut si c'est vraiment utile par rapport à un SoundMixer.. Mais bon, ça aura eu le mérite d'être fun et surtout de me faire comprendre une partie de Stage3D et surtout de la manipulation des registres..

Ca mériterait un petit tuto sur mon site.. :)
Ne baisse jamais les bras, car c'est à ce moment là que le miracle risque de se produire..

Site web: http://www.pureas3.org
Twitter: https://twitter.com/PureAS3

Enjoy with Flash Player :-)

#157 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 21 September 2012 - 21:16 PM

Bonsoir,

Voir le messagealama.be, le 21 September 2012 - 16:48 PM, dit :

Mais on peut mixer jusqu’à 7 pistes ( 8 registres VA dispos ) et sans doute quelques effets. Après, il faut si c'est vraiment utile par rapport à un SoundMixer.. Mais bon, ça aura eu le mérite d'être fun et surtout de me faire comprendre une partie de Stage3D et surtout de la manipulation des registres..
Oui il faudrait faire des tests de performance pour voir si ça a un intérêt.

Sinon, je ne m'y connais pas en manipulation du son, donc j'ai du mal à imaginer quels calculs peuvent être exécutés pas le GPU.

Je me disais qu'avec des textures, on peut peut-être accéder à plusieurs sample décalés dans le temps en utilisant une texture de 4096 x 1 pixel, et en décalant ces textures vers la droite ou la gauche. Je ne sais pas ce que ça vaut comme idée...

En tout cas merci d'avoir expliqué tes conclusions, et bravo pour l'exploration :)

#158 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 23 September 2012 - 10:12 AM

Salut Lilive, sympa de t’intéresser à ce truc :)

Il est vrai que ce qui est traité par la carte graph est très rapide, mais il faut voir ce qu'on peut arriver à faire sans devoir recharger les données..

Le gros souci d'une texture est qu'elle doit absolument être exprimée en ARGB (ou BGRA). Les valeurs RGBA doivent toujours être non signées, et c'est incompatible avec des données audio qui sont normalisée (-1 à +1) en float.

Par contre, les registres travaillent justement en float normalisés, donc, je peux entrer mes data audio en passant par un Vertex Attribute, je peux les manipuler selon les possibilités offertes par AGAL.

Mais pour les sortir, je dois bricoler un codage perso (inventé) afin de sortir des valeurs signées sous forme RGBA, et en AS3, décoder ce truc pour reconstituer mon flux de floats signés .. bon, ça, ça va, j'y arrive. (c'est super dommage que AGAL ne permette pas de splitter un float en 4bytes brutes, sinon, je serai suavé et pas besoin d'encoder ni décoder)

L'idée c'est de faire tout dans le GPU sans recharger de données depuis AS3. Le truc bien, c'est qu'on a droit qu'a 200 opcodes par programme (donc, 400 en tout) pour une passe.. (draw) .. mais on peut faire 32,768 draw consécutifs pour une seule scène (1 render ). donc, en réalité, on peut dire qu'on a droit en tout à 200 * 2 * 32768 = 13 millions d'opCode possibles pour constituer un rendu final. :)
Sauf que dans mon cas, j'utilise le render pour le fun, mais il est inutile.. en effet la récupération de données peut se faire sans rendre et sans même afficher le backBuffer . Ce qui au final (je pense) rend illimité le nombre d'opcode possible, ça se jouera uniquement sur le temps d'éxécution (la limite).

Les math sur de l'audio n'est jamais vraiment très compliqué, mais c'est bcp de logique et de manipulation. Souvent, on a besoin de faire un calcul sur 2 données (sample audio) consécutifs.. et là, je ne vois pas trop comment faire.. en effet, décaler toute les valeurs de 1px permettrait sans doute d'y arriver.. Mais comment le faire sans faire ce décalage en AS3 et sans recharger les valeurs Décalées ?

Comment pourrais-je décaler toute les valeurs dans un registre d'une case? (d'une ligne plutôt) comme si je faisais un push de 0 à l'index 0 d'un registre Variant par exemple..

Alors, les Matrix en aS3, ca va! je sais m'en servir.. Mais les Matrix en AGAL, ça fait quoi au juste?? (m44, m33) Je vois bien ce que Adobe dit à ce propos, mais j'ai du mal à visualiser ce que ça fait..

Je pense que la compréhension des Matrix peut m'ouvrir des portes.. voir même m'ouvrir le ciel.. :) car on dirait que justement, les matrixs peuvent accéder à un index de registre..

Exemple pour m33

Citation

destination.x = (source1.x * source2[0].x) + (source1.y * source2[0].y) + (source1.z * source2[0].z)
destination.y = (source1.x * source2[1].x) + (source1.y * source2[1].y) + (source1.z * source2[1].z)
destination.z = (source1.x * source2[2].x) + (source1.y * source2[2].y) + (source1.z * source2[2].z)
(produces only a 3 component result, destination must be masked to .xyz or less)

on voit un accès de façon index [o] [1] etc..

je suis presque sur que je dois comprendre cet aspect.. je le sens. :)

Aussi, je pense revenir sur l'approche texture un peu pour des tests, car depuis la recherche sur l'approche vertexs, j'ai encore compris certaines choses et fait des découvertes.. je me demande si un mélange des deux approches ne me permettrait pas de faire mieux, plus rapide et + souple..

Bref, j'ai encore à découvrir.. :)

les matrix, il peuvent s'appliquer aussi bien à un program vertexs que fragment de suppose?
Ne baisse jamais les bras, car c'est à ce moment là que le miracle risque de se produire..

Site web: http://www.pureas3.org
Twitter: https://twitter.com/PureAS3

Enjoy with Flash Player :-)

#159 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 23 September 2012 - 13:56 PM

Citation

Comment pourrais-je décaler toute les valeurs dans un registre d'une case?

C'est possible a faire en passant par une texture. Il suffit garder en mémoire (dans une constante) les UV d'un pixel (0,0) et des les ajouter aux UV traité par "tex"

Citation

Alors, les Matrix en aS3, ca va! je sais m'en servir.. Mais les Matrix en AGAL, ça fait quoi au juste??
m33 sert à appliquer une matrix2D sur tes points ; m44 sert à appliquer une matrix3D.
Ces matrix (2D ou 3D) sont transmise à l'AGAL en tant que constantes ; ce ne sont pas de simple constantes dans le sens ou il s'agit que constantes qui contiennent des constantes. Une matrix3D contient 4 constantes (je suppose qu'une Matrix2D en contient 3) , cela sous entend que si tu passe une Matrix3D en vc0 , la prochaine constantes devra être défini en vc4 (car vc0, vc1, vc2 et vc3 sont occupé par la matrix ).

#160 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 23 September 2012 - 14:49 PM

Voir le messagetlecoz, le 23 September 2012 - 13:56 PM, dit :

C'est possible a faire en passant par une texture. Il suffit garder en mémoire (dans une constante) les UV d'un pixel (0,0) et des les ajouter aux UV traité par "tex"
Je sais pas si je comprends bien cela, ni si ça correspond à mon idée.
Voici mon idée:

Une texture de 4096 x 1 pixels (je ne sais pas si on a le droit :smile: ) dans fs0
Dans un registre constant du fragment (fc0.x) la valeur qui correspond à un décalage de 1 pixel en UV, donc surement 1/4096
Dans v0 du fragment, la coordonnées UV du pixel traité.

tex ft1, v0, fs0 <2d>
récupère la couleur du pixel traité dans ft1

add v0.x, v0.x, fc0.x
tex ft2, v0, fs0 <2d>
récupère la couleur du pixel à droite du pixel traité dans ft2, c'est-à-dire l'échantillon sonore suivant

à partir de là on peut faire des opérations entre ft1 et ft2, donc entre des échantillons décalés dans le temps

Mais bon, très très hypothétique de ma part tout ça :mrgreen:, notamment car je ne sais pas comment du peux encoder tes échantillons dans du RGBA pour pouvoir ensuite faire des opérations mathématiques dessus.
(Et je signale au passage que je ne vais plus pouvoir suivre cette discussion dans un petit moment :()


Voir le messagetlecoz, le 23 September 2012 - 13:56 PM, dit :

Une matrix3D contient 4 constantes (je suppose qu'une Matrix2D en contient 3) , cela sous entend que si tu passe une Matrix3D en vc0 , la prochaine constantes devra être défini en vc4 (car vc0, vc1, vc2 et vc3 sont occupé par la matrix ).
Voilà, c'est ce qu'ils veulent dire en écrivant
destination.x = (source1.x * source2[0].x) + (source1.y * source2[0].y) + (source1.z * source2[0].z)
destination.y = (source1.x * source2[1].x) + (source1.y * source2[1].y) + (source1.z * source2[1].z)
destination.z = (source1.x * source2[2].x) + (source1.y * source2[2].y) + (source1.z * source2[2].z)

en reprenant l'exemple de tlecoz, pour une matrice 2D chargée dans vc0, vc1 et vc2, alors
source2[0] veut dire vc0
source2[1] veut dire vc1
source2[2] veut dire vc2

#161 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 23 September 2012 - 18:23 PM

Merci à vous deux pour vos réponses.. j'essaye d'y répondre.. :)

Citation

C'est possible a faire en passant par une texture. Il suffit garder en mémoire (dans une constante) les UV d'un pixel (0,0) et des les ajouter aux UV traité par "tex"

Oui, je vois, en décalant mes UV d'un pixel (soit 1/ + et - 32) ça devrait être possible, sauf que pour d'autres raisons, j'essaye d'abort sans texture.. mais je compte revenir sur le système par texture pour d'autres essais..

Citation

m33 sert à appliquer une matrix2D sur tes points ; m44 sert à appliquer une matrix3D.
Ok pour cet aspect, mais je compte ouvrir un nouveau post exclusif aux matrixs, car je me pose des questions..

Pour Lilive:

Citation

Une texture de 4096 x 1 pixels (je ne sais pas si on a le droit :smile: ) dans fs0

Non, ça ne marche pas! j'ai essayé tout au début car je voulais faire des extrapolations supérieur à 64 valeurs, donc, pas 64 lignes de 64 pixels, mais bien une ligne de 4096 pixels.. le système m'a envoyé promener.. :)

Citation

Dans un registre constant du fragment (fc0.x) la valeur qui correspond à un décalage de 1 pixel en UV, donc surement 1/4096

dans le cas d'une tex de 64X64, cette valeur est 0.03125 ( soit 1/32 ème du backBuffer qui va de -1 à +1 en 64 pas. (pixels)

Citation

add v0.x, v0.x, fc0.x

Donc, d'après toi, ce code va aller me chercher la valeur de v0x mais décalée d'une ligne? et pas bêtement faire v0.x = v0.x + ma valeur constant ?? je suis très septique, mais je vais essayer .. :)

Citation

Mais bon, très très hypothétique de ma part tout ça :mrgreen:, notamment car je ne sais pas comment du peux encoder tes échantillons dans du RGBA pour pouvoir ensuite faire des opérations mathématiques dessus

Justement, tu as compris le point clef du système! :) C'est que justement, ce que tu dis est un souci quand je pars en texture.. il faut convertir mes Floats audio en AS3 en RGBA avant de les charger sur le GPU.. C'est pour ça que l'approche vertex est mieux, car je charge mes 4096 valeurs floats telles qu'elles sur le GPU, je vais mes math en vertex program (si possible) puis je transfere mes résultats (toujours en floats normalisés) vers le program Fragment via un Variant. Le Fragments programme prend le relay et surtout il encode mes floats normalisés en RGBA afin de pouvoir les afficher.. ;)

Citation

source2[0] veut dire vc0
source2[1] veut dire vc1

source2[2] veut dire vc2

Ca, ça me tue !! Je comprend mieux pourquoi mes essais avec M33 se sont soldés par un échec et une incompréhension totale..

je pensais que les [0] était un index de ma source .. par exemple, ft0[1] accédait à la ligne +1 de mon registre FT .. :S

Merci pour vos coms.. je vais un peu réfléchir sur les Matrix, et si je pige rien, j'ouvrirai un nouveau post rien que pour les matrixs.. :)
Ne baisse jamais les bras, car c'est à ce moment là que le miracle risque de se produire..

Site web: http://www.pureas3.org
Twitter: https://twitter.com/PureAS3

Enjoy with Flash Player :-)

#162 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 23 September 2012 - 21:03 PM

Citation

j'essaye d'abort sans texture.. mais je compte revenir sur le système par texture pour d'autres essais..
T'inquiète je n'oublie pas le code qui permet de faire Number -> Float4 -> Number mais suite aux commentaires de Jean-Marc et des tiens concernant AS2AGAL et sa futur inutilité (quand l'AS4 sera de la partie) ; j'ai repris le code de 0 pour le rendre beaucoup plus facilement réutilisable dans le cas d'une éventuelle "refonte des mots clés" et aussi pour accélérer le traitement (j'avais une dizaine de passes pour passer de l'AS à l'AGAL, j'essaye maintenant de tout faire en une seule passe et de tout généraliser au maximum (plutot que de tout traiter cas particulier par cas particulier comme c'etais le cas dans l'ancienne version) , ce sera bientôt prêt ! :)

(je ferais peut être appel à tes services, si tu es motivé et que tu as le temps, pour m'aider à porter quelques calculs quand la base sera finalisée (non pas que ce soit hyper complexe et que j'ai besoin d'aide, mais ça ferait gagner du temps à tout le monde, toi y compris ^^) )

#163 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 23 September 2012 - 21:44 PM

Voir le messagealama.be, le 23 September 2012 - 18:23 PM, dit :

Donc, d'après toi, ce code va aller me chercher la valeur de v0x mais décalée d'une ligne? et pas bêtement faire v0.x = v0.x + ma valeur constant ?? je suis très septique, mais je vais essayer .. :)
Je peux complètement me tromper car ça fait quelques mois que je n'ai plus touché à l'AGAL, donc j'ai pu oublier.

Voici ce que j'aurais dit:

Une texture de 64x64
Qui en sortie donne un carré de même dimension, grâce à 2 triangles
Le programme du fragment shader est donc appelé 64x64 fois
A chaque fois (en reprenant mon exemple de registres) on a dans v0 les coordonnées UV pour le pixels de coordonnées (x,y)
0 <= x < 64
0 <= y < 64
Et
0 <= v0.x < 1
0 <= v0.y < 1
Donc pour atteindre le pixel immédiatement à gauche de la texture (x+1, y) il faudrait faire
v0.x += 1/64
Ce qui se traduirait par
add v0.x, v0.x, fc0.x
tex ft2, v0, fs0 <2d>
dans ft2 on aurait la couleur du pixel (x+1, y), pouvu qu'on ait mis 1/64 dans fc0.x

Mais je le redis, ça fait longtemps que j'ai plus fait ça, je m'étais mis à fond dans l'AGAL sur un temps très court, donc je dis peut-être une grosse bétise!

#164 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 24 September 2012 - 08:32 AM

Ok Tom ;)

Salut Lilive ;


Citation

Le programme du fragment shader est donc appelé 64x64 fois


Justement, non, je pensais ça aussi à la base, mais mes essais m'ont montré que le program fragment n'est exécuté que 4X (1 par vertex) et probablement dans l'odre des vertexs indexs. (et le GPU extrapole toutes les valeurs pour tous les autres pixels sur base des valeurs des vertexs).

C'est pour ça que je suis finalement parti sur 4096 vertexs (*3) et sans texture..

Par contre, je m'aperçois que ton code décale les UV de 1 pixel (1/64).. en fait, dans ce cas, ça devrait fonctionner, car si ce décalage est effectué uniquement aux 4 sommets, ça le fera partout (extrapolation GPU).. C'est ce que Tlecoz proposait. Le gros souci, c'est que dans ce cas je dois manipuler des valeur RGBA (dans ft2) et ça, ça ne va pas.. je ne peux pas par exemple additionner 2 pixels rgba entre eux.. à cause du fait que 2 samples audio (soit 2 pixels) peuvent être de signe différents ( un négatif suivit d'un positif) et ça, en rgba, ça n'existe pas..

Donc, je suis obligé de travailler en float tout le temps! dans le GPU.. c'est pour ça que j'avais abandonné l'approche texture. par contre, une fois que mes math sont faites et que mon son est prêt (en float) en agal, je peux le coder en RGBA et le sortir.. mais une fois en RGBA, je ne peux plus apporter aucune modif.. c'est juste pour pouvoir les sortir.

Le gros souci avec les UV, c'est que visiblement, on ne peut sortir un résultat qu'à partir d'un Sampler (fs) et que les fs, ben ça ne se charge que depuis AS3 et du coup, en RGBA obligatoire .. c'est un gros blocage ça.. Donc, ton idée est très bonne! :) Mais malheureusement pas applicable dans mon cas.. Si encore, on avait pu remplir un sampler en agal, j'aurais pu trouver une astuce..

Est-ce qu'un matrix (ou plusieurs) pourrait me décaler un VT d'une ligne?

Je démarre par exemple avec VA0.x = 0,1,2,3,4,.. et peut importe comment, il me faudrait un VT ou un V avec dedans 0,0,1,2,3,.. en x, y, ou autre, pas important ça.

Comme un autre truc hyper important, mes floats audio sont stereo entrelacés : GDGDGDGDGD.. en agal, je dois arriver à séparer ça.. et faire un VT avec DDDDD en x par exemple et VT.y = GGGGG pour ensuite refaire mon stream GDGDGD avant de le sortir..

Ca au pire, je peux le faire en AS3 avant chargement, mais ce serait dommage..

Je vais un peu raisonner sur les Matrix.. :P
Ne baisse jamais les bras, car c'est à ce moment là que le miracle risque de se produire..

Site web: http://www.pureas3.org
Twitter: https://twitter.com/PureAS3

Enjoy with Flash Player :-)

#165 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 17 October 2012 - 10:24 AM

Pour ceux que ça intéresse je viens de faire 3 tutoriaux concernant les shaders:

http://hub.aerys.in/...ur_First_Shader
http://hub.aerys.in/...t_interpolation
http://hub.aerys.in/...ompilation_Logs

Je pense que le dernier - notamment la partie graph - peut intéresser les plus curieux :)

#166 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 17 October 2012 - 19:12 PM

Hello !

Merci pour ces tutos, les deux premiers sont super, je viens de les lire :)
(j'ai survolé le 3ème, mais je n'ai pas le temps de regarder en détail pour le moment).

Juste une petite question élémentaire concernant le deuxième

override protected function getVertexPosition() : SFloat
  {
    var xy : SValue = float2(getVertexAttribute(VertexComponent.XY));

    // store the value of the VertexComponent.RGB vertex attribute in _color
    _color = getVertexAttribute(VertexComponent.RGB);

    return float4(xy, 0., 1.);
  }
 

A quoi correspond le 0 et le 1 au niveau du return ?

Merci d'avance !

#167 loudoweb

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 213 messages

Posté 24 October 2012 - 13:05 PM

Je dirai que c'est le Z et W !
puisque que le vertexPosition doit renvoyer des coordonnées xyz (et optionnellement w il me semble).
---------------------------------
loudo
______________________
@loudoweb
http://www.loudoweb.fr
_____________________

#168 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 24 October 2012 - 14:34 PM

C'est aussi ce que je dirais, apriori

Ce qui me fait douter c'est l'utilisation de 'xy' en premier paramètre ;
Il n'est pas nécessaire de définir 'w' en agal au niveau du vertexShader ; de fait il ne devrait pas être nécessaire de créer une constante exprès pour ça.

Cela me semble logique dans un sens et pas logique dans l'autre, d'ou ma question :)

#169 loudoweb

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 213 messages

Posté 25 October 2012 - 09:07 AM

Un float4, c'est 4 composants, ça peut être xyzw ou rgba.
Sauf erreur de ma part, Minko te donne la possibilité d'associer des composants dans les paramètres.

float4(xy, 0., 1.);
//c'est la même chose que (en disant que les variables x et y sont des float à un composant) :
float4(x, y, 0., 1.);
 
Car float4 prend aussi bien en paramètre des Number que des SFloat.

J'ai tenté de retrouver l'article qui expliquait ça mais je n'ai pas réussi, d'où mon incertitude :P
---------------------------------
loudo
______________________
@loudoweb
http://www.loudoweb.fr
_____________________

#170 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 29 October 2012 - 19:01 PM

Citation

Il n'est pas nécessaire de définir 'w' en agal au niveau du vertexShader ; de fait il ne devrait pas être nécessaire de créer une constante exprès pour ça.
Au contraire, la valeur w est primordiale puisque c'est elle qui (si je me souviens bien) permet de clipper correctement la géométrie. Dans le tutoriel en question on est en screenspace donc on est tout le temps censé renvoyer 1.

Citation

Ce qui me fait douter c'est l'utilisation de 'xy' en premier paramètre ;
Comme en GLSL, float4 est une méthode qui construit une valeur de taille 4 à partir d'un ensemble de valeurs dont la taille totale est inférieure ou égale à 4.

Donc :

float4(xy, 0, 1);

et:

float4(x.x, xy.y, 0, 1);

sont complètements équivalents. D'ailleurs il me semble que le compilateur ne fait pas la différence.

J'ai rajouté il y'a peu un autre tutoriel concernant les shaders:

Create a shader rendering per-pixel normals

Très utile pour comprendre les normales et l'interpolation vertex/fragment shader :)

Modifié par Jean-Marc Le Roux, 29 October 2012 - 19:02 PM.


#171 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 29 October 2012 - 19:47 PM

Merci



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)