Forums Développement Multimédia

Aller au contenu

Une discution autour de l'AGAL & des Shaders

CODE Actionscript

170 réponses à ce sujet

#91 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 09 September 2012 - 21:43 PM

J'ai l'impression de faire comme toi, à ceci prés que mon code ne marche pas :D
Vois tu ou se trouve le problème ?


package
{
import adobe.utils.CustomActions;
import com.adobe.utils.AGALMiniAssembler;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.display3D.Context3D;
import flash.display3D.Context3DProgramType;
import flash.display3D.Context3DTextureFormat;
import flash.display3D.Context3DVertexBufferFormat;
import flash.display3D.IndexBuffer3D;
import flash.display3D.Program3D;
import flash.display3D.textures.Texture;
import flash.display3D.VertexBuffer3D;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.ProgressEvent;
import flash.events.SampleDataEvent;
import flash.media.Sound;
import flash.net.FileReference;
import flash.net.URLRequest;
import flash.utils.ByteArray;
/**
  * ...
  * @author tlecoz
  */

public class Main2 extends Sprite
{

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

  private var fragmentShader:String = "" +
  "tex ft0, v0, fs0 <2d,clamp,nearest,nomip> \n" +
  "mov oc, ft0 ";


  private var file:FileReference = new FileReference();
  private var sound:Sound;
  private var input:Sound;
  private var ba:ByteArray = new ByteArray();
  private var context:Context3D;

  private var vertexBuffer:VertexBuffer3D;
  private var indexBuffer:IndexBuffer3D;
  private var texture:Texture;
  private var bd:BitmapData = new BitmapData(64, 64, false, 0);

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


  public function Main2()
  {
 
   stage.stage3Ds[0].addEventListener(Event.CONTEXT3D_CREATE, onGetContext);
   stage.stage3Ds[0].requestContext3D();
   stage.addEventListener(MouseEvent.CLICK, onClick);
  }

  private function onGetContext(e:Event):void {
   context = stage.stage3Ds[0].context3D;
   context.configureBackBuffer(64, 64, 1);
 
   var vertices:Vector.<Number> = new Vector.<Number>();
   vertices.push( -1, -1, 0, 1);
   vertices.push( -1,  1, 0, 0);
   vertices.push(  1,  1, 1, 0);
   vertices.push(  1, -1, 1, 1);
 
   var indices:Vector.<uint> = new Vector.<uint>();
   indices.push(0, 1, 2, 2, 3, 0);
 
   vertexBuffer = context.createVertexBuffer(4, 4);
   vertexBuffer.uploadFromVector(vertices, 0, 4);
 
   indexBuffer = context.createIndexBuffer(6);
   indexBuffer.uploadFromVector(indices,0,6);
 
   texture = context.createTexture(64, 64,Context3DTextureFormat.BGRA, false);
 
   context.setVertexBufferAt(0, vertexBuffer, 0, Context3DVertexBufferFormat.FLOAT_2);
   context.setVertexBufferAt(1, vertexBuffer, 2, Context3DVertexBufferFormat.FLOAT_2);
   context.setTextureAt(0, texture);
 
   vertexAssembler.assemble(Context3DProgramType.VERTEX, vertexShader);
   fragmentAssembler.assemble(Context3DProgramType.FRAGMENT, fragmentShader);
 
   program = context.createProgram();
   program.upload(vertexAssembler.agalcode, fragmentAssembler.agalcode);
 
   context.setProgram(program);
  }

  private function onClick(e:MouseEvent):void {
 
   file.browse();
   file.addEventListener(Event.SELECT, onFileSelect);
 
  }
  private function onFileSelect(e:Event):void {
   file.load();
   file.addEventListener(Event.COMPLETE, onLoaded);
  }
  private function onLoaded(e:Event):void {
   input = new Sound();
   input.loadCompressedDataFromByteArray(file.data,file.data.length);
 
   sound = new Sound();
   sound.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData);
   sound.play();
  }
  private function onSampleData(e:SampleDataEvent):void {
   ba.position = 0;
   input.extract(ba, 4096, e.position);
 
   ba.position = 0;
   bd.setPixels(bd.rect, ba);
   texture.uploadFromBitmapData(bd);
 
   context.clear(0, 0, 0, 0);
   context.drawTriangles(indexBuffer);
   context.drawToBitmapData(bd);
   context.present();
 
   e.data.clear();
   e.data.writeBytes(bd.getPixels(bd.rect));
 
  }
}
}
 

Merci d'avance !


EDIT : Après avoir relu la conversation, j'ai ajouté ça, mais ça ne change pas grand chose

input.extract(ba, 4096, e.position);
ba.position = 0;
 
var newBa:ByteArray = new ByteArray();
while (ba.bytesAvailable) {
newBa.writeInt(uint( ba.readFloat() * 0xffffffff))
}
 
newBa.position = 0
bd.setPixels(bd.rect, newBa);
texture.uploadFromBitmapData(bd, 0);
 

Qu'est ce que j'oublies ?

#92 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 10 September 2012 - 06:47 AM

Coucou, la seconde partie, vire là et reviens à l'ancienne ;)

Ensuite, lors de l'extract, fais 2048 et pas 4096. car ce sont des samples stéréo, soit, en 64 bits entrelacés. ce qui nous donne au final 4096 float à traiter.

Aussi, pour le moment, il n'y a pas besoin de gérer la position, l'exctract garde l’ancienne position à chaque passe.

le byteArray buffer, je pense qu'il est + rapide d'en faire un nouveau à chaque fois. et comme il est dans dans un scope local, le GC vire le vieux à chaque fois. (mais c'est un detail ça et discutable)


var ba:ByteArray = new ByteArray; // ou comme t'as fait, c'est bon aussi ..
input.extract(ba, 2048);

ba.position = 0;
bd.setPixels(bd.rect, ba);
texture.uploadFromBitmapData(bd);
 

Pour le reste, je ne vois rien d'anormal dans ton code :)

Par contre, on va avoir un souci.. (j'y ai pensé avant de dormir..lol )..

pour le moment, on a fait au + simple .. c'est à dire qu'on prend un sample de 32 bits qu'on splitte en 4 bytes ..

on le rentre en texture.. on applique, puis, on relit la texture et on réassemble nos 32 bits dans un ba.

le souci, c'est que je ne vois pas dans les codes AGAL un truc qui permet de concaténer des valeurs.. hors, pour pouvoir faire des opérations, il faut que mes float de 32 bits soient entiers dans mes registres.. et non pas splitté en 4X 8 bits qui prit séparément ne veulent plus rien dire..

Donc, ça va pas finalement ce truc.. du coup, je remet en question tout le truc.. je me demande si on a pas un show stopper là.. enfin, p'tet pas.. ( je réfléchi en écrivant...)

il faut soit reconstruire nos float en AGAL, (doit être faisable avec des opération math de base)

Soit, les rentrer sans les décomposer avant .. mais alors, il va bien falloir les décomposer pour construire la texture finale dans le texSampler.. (ca c'possible en opération binnaires ou même bêtement en Mul et Add) je ne vois pas de possibilité bitwise en AGAL .. pourtant, j'en ai besoin.. le ROLL et ROR seraient idéaux.. [resolu en théorie]

comment on peut faire un ROLL de 8 en AGAL? donc, partir par exemple d'un octet qui fait 111 et avoir au final 11100000000 Tu vois le truc? [résolu]

[reponse] il faut multiplier par des exposant binaire .. 3 (11) * 2 exp 4 = 48 (110000) on a bien fait un roll ( bitshift) de 4 ! Merci la calculette Windows .

cool, je reprend un peu confiance .. :P

En même temps, c'est loin mes cours de binaire.. :)

Toutefois, on peut encore accélérer le traitement en ramenant les 32 bit (signés) en 16 bits.. ou si vraiment, pas de possibilité, ramener le son en 8 bit .. les CD-Audio sont bien gravé en 8 bits .. et pourtant, le son est bon! Car le fait que ce soit en 8 ne fait qu'une chose, diminuer la définition des samples, donc, du son, mais avec 256 niveaux possibles, on est déjà bien en audioas
[ Ou Pas! ..]

A propos des registres GPU, ils sont en float, mais ils sont signés? ou pas? logiquement, le standard float est signé ..

Bref, c'est pas fini ce truc.. mais l'idée est là.. je continue à creuser.. :)
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 :-)

#93 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 10 September 2012 - 08:19 AM

Donc, next step > trouevr la meilleure soluce et rapide pour stocker dans un des registre mes samples en float et pas en 4X8.

De +, un float Audio est signé, (le MSB est un bit de signe) .. une fois décomposé en byte, le byte R (de rgb) à son MSB qui n'est pas une valeur.. Donc, il faut probablement passer en unsigned (mais je n'en suis pas sur.. je ne sais pas comment sont gèrés les Floats dans les registres.. faudra tester) .. au pire, value + 0x7FFFFFFF = 32 bit unsigned .
[Mauvais Plan! le mieux étant sans doute de sauvegrader ce bit de signe en agal plutôt.. et le réinjecter à la fin..]

Si t'as des idées, n'hésite pas! dans l'hypothèse où je cherche à rentrer mes 4096 Float en registre sans passer par une texture, c'est possible? de telle sorte à les entrer directement en tant que float et non pas exprimés en RGBA ?

Si ce n'est pas possible, tant pis, je vais tenter de les reconstruire en agal dans un variant ou quoi.

EDIT:
je viens de faire un test et je sais pourquoi on ne sait pas charger les floats direct en "loadFromByteArray", c'est simplement parce que les Float sont signés et contiennent des valeurs négatives ! si je construit un ba avec que des valeurs float positives, ça fonctionne.

Et une tite info en passant.. quand le 4eme byte était utilisé, (il correspond à l'alpha de mes pixels) ca déconnait parfois en sortie.. la réponse est dans la doc en fait..

Citation

Flash BitmapData objects store colors already multiplied by the alpha component. For example, if the "pure" rgb color components of a pixel are (0x0A, 0x12, 0xBB) and the alpha component is 0x7F (.5), then the pixel is stored in the BitmapData object with the rgba values: (0x05, 0x09, 0x5D, 0x7F). You can set the blend factors so that the colors rendered to the buffer are multiplied by alpha or perform the operation in the fragment shader. The rendering context does not validate that the colors are stored in premultiplied format.

Donc, en gros, si il faut utiliser le 4eme octets, alors, il faudra prévoir ce truc en rectifiant en post prod..

donc, pour retrouver 0Ah, faut faire R * (1/Alpha) .. soit, 05h * (1/7Fh) = 0Ah .. ;)

Ce qui explique sans doute pouquoi j'ai encore parfois de légères diff en sortie.. l'alpha étant désactivé actuellement, le GPU cherche à reconstruire RGBA en RGB .. heureusement, le A correspond aux bits les moins significants (LSB), donc, le mieux est de tomber ce byte à la noix en agal une fois pour toute.. (a essayer) ça ne fera qu'enelever quelques points de précision négligeables.
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 :-)

#94 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 10 September 2012 - 10:28 AM

Hello !

Je t'avous que je suis un peu complètement largué avec ces histoire de "float signé", "MSB" , "32 bit unsigned" :D

Citation

il faut multiplier par des exposant binaire .. 3 (11) * 2 exp 4 = 48 (110000) on a bien fait un roll ( bitshift) de 4 ! Merci la calculette Windows .
Euh ok :D

Citation

dans l'hypothèse où je cherche à rentrer mes 4096 Float en registre sans passer par une texture, c'est possible? de telle sorte à les entrer directement en tant que float et non pas exprimés en RGBA ?

Ca a l'air possible avec un VertexBuffer ; le problème est que le VertexBuffer ne devrait pas avoir une longueur de 4096 mais de 4096x3 (car on a besoin de 4096 triangle pour avoir 4096 pixel de couleurs différente, mais chaque triangle contient 3 points)

P.S. : si tu connais un tuto sympa qui pourrait m'éclairer sur ces histoire de float signé (ou pas) , c'est le bienvenu ! :)

EDIT :

Citation

je viens de faire un test et je sais pourquoi on ne sait pas charger les floats direct en "loadFromByteArray", c'est simplement parce que les Float sont signés et contiennent des valeurs négatives !
Tu l'auras compris, je ne suis pas un expert en ByteArray :)
Est il possible d'ajouter '1' à tous les float contenu dans un BA pour les forcer à être positif (sans lister toutes les valeurs) ?

#95 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 10 September 2012 - 10:59 AM

Salut, bien dormi? :)

pour les bytes (word, dword, etc) signé, ça veut juste dire qu'il il y a un bit qui n'est pas destiné à stocker une valeur, mais juste le signe + ou -

un byte fait 8 bits . soit, il est unsigned, et dans ce cas, la valeur peut aller de 0 à 255 (toujours positif) soit, il est signé (bit de signe) et la valeur est stockée dans les 7 bits restants.. donc, de 0 à 127. mais avec le bit de signe, la plage va de -127 à +127 .. ce qui revient finalement au meme, car dans tous les cas, on ne peut y stocker que 256 valeurs possibles..

C'est le même principe pour les word (16 bits (2 bytes)).. les dword 32 bit, les qword 64 bits, etc..

logiquement, un Float, c'est un dword signé ( un 32 bits signé) mais bon.. je ne suis pas certains que c'est toujours comme ça !?

Par contre, en AS3 audio, toute les valeurs sont en 32 signées! elle peuvent aller de -1 à +1 , le 0 = pas de son..

Pourquoi, ils ont fait ça? et bien, parce que le son est toujours alternatif, il ondule toujours d'une valeur négative vers une positive.. chaque passage à 0 détermine une alternance.. et 2 alternances détermine une période.. (ce qui donne sa fréquence..)

Bon, j'arrête de t'embrouiller .. :mrgreen:

Mais, bon, t'as compris le "signed" et "unsigned" ..

Sinon, ajouter 1 à un float? non, ça n'enleve pas le signe (enfin, si dans le cas de l'audio AS3, tu as raison, car il va de -1 à 1) Sinon en général .. pour enlever le signe, il faut ajouter la moitier de sa valeur maximum (faire un offset de 127) .. par exemple, un byte signé (-127 à 127) si tu fais + 127, tu aura la valeur non signée (jamais négative). Sinon, j'ai essayé ça! c'est naze!! et je perd 4 ms pour rien.. on peut faire mieux..

Citation

Ca a l'air possible avec un VertexBuffer ; le problème est que le VertexBuffer ne devrait pas avoir une longueur de 4096 mais de 4096x3 (car on a besoin de 4096 triangle pour avoir 4096 pixel de couleurs différente, mais chaque triangle contient 3 points)
J'y pensais justement.. utiliser un vertexBuffer qui ne sera pas afficher, mais qui servira à contsruire un texSampler.. les 3 points (ou meme 6 max) peuvent stocker des Float, non? dans le cas, je peux utiliser tout.. Vertex1 x,y,z,r,g,b (peut etre meme a) pour mes 6 premier float .. a essayer... faut voir si ça chargera vite..

Autre soluce, on laisse comme c'est! car c'est hyper rapide pour le moment, et j'essaye de reconstruire mes datas en AGAL .. avantage: rapide. inconvénient: perte d'opcode (limite à 200) ..

Bohh .. je pense que je vais passer pas mal de temps là dessus.. c'est chaud boulette comme ont dit :)

EDIT:

MSB et LSB = Most Signicant Bit et Low Signicant Bit.. le MSB est à gauche et contient la valeur la plus haute du byte..

Imagine ça en base 10 (décimal) si tu écris 10000000 (10 millions) et bien, le chiffre extrême gauche est le MSB et le chiffre de droite est le LSB .. le MSB vaut 10 millions et le LSB ne vaut que 1 .. enfin, tu comprend la signification? un MSB est hypper important, un LSB, meme si erroné, ou perdu, n'introduit qu'une très faible erreur.. :)
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 :-)

#96 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 10 September 2012 - 11:11 AM

Citation

je peux utiliser tout.. Vertex1 x,y,z,r,g,b (peut etre meme a) pour mes 6 premier float .. a essayer... faut voir si ça chargera vite..

Je pense (mais je peux me tromper, ce ne serait pas la première fois ^^) qu'il vaut mieux décomposer les données en 2 vertexBuffer car tu as d'un coté les xyz qui seront initialisé au début et ne changeront jamais , et de l'autre les données issus du son qui changeront tout le temps.

EDIT : Merci beaucoup pour tes explications :Hola:

#97 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 10 September 2012 - 11:21 AM

Ok, ça roule.. rien de tel que des tests.. :)

T'as réussi à faire aller ton code en simple echo finalement?
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 :-)

#98 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 10 September 2012 - 11:24 AM

En fait, il me semble théoriquement possible d'avoir un VertexBuffer dédié au son ne contenant que 4096 valeurs.
Il faut penser en pixel et non pas en triangle :)

Si tu stocke dans un VertexBuffer les coordonnées normalisée des pixels de ta texture, il devrait être possible de cibler ce pixel et uniquement ce pixel dans le fragmentShader en verifiant que 'uv.x' == 'pixel.x' && 'uv.y' == 'pixel.y' sinon -> instruction 'kill'

#99 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 10 September 2012 - 11:25 AM

Citation

T'as réussi à faire aller ton code en simple echo finalement?
non...

Ca génère un "son silencieux" (pas de bruit, du rien ^^)

#100 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 10 September 2012 - 11:30 AM

Citation

En fait, il me semble théoriquement possible d'avoir un VertexBuffer dédié au son ne contenant que 4096 valeurs.
Il faut penser en pixel et non pas en triangle :)


Si tu stocke dans un VertexBuffer les coordonnées normalisée des pixels de ta texture, il devrait être possible de cibler ce pixel et uniquement ce pixel dans le fragmentShader en verifiant que 'uv.x' == 'pixel.x' && 'uv.y' == 'pixel.y' sinon -> instruction 'kill'
rien capté, je vais relire.. :)

Tu as un email? et tu es sous flashDevelop? je t'envois mes sources si tu veux..

Edit:

Evidement, un vertexBuffer ne s'alimente que depuis un format vector? Si je dois convertir mon ba, ok! mais je vais encore perdre du temps .. mais bon.. pk pas.. je vais essayer pour voir..
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 :-)

#101 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 10 September 2012 - 11:34 AM

Désolé pour le multipost, mais je n'édit pas pour être sur que tu lise ce message :)

Citation

Si tu stocke dans un VertexBuffer les coordonnées normalisée des pixels de ta texture, il devrait être possible de cibler ce pixel et uniquement ce pixel dans le fragmentShader en verifiant que 'uv.x' == 'pixel.x' && 'uv.y' == 'pixel.y' sinon -> instruction 'kill'

Dis toi que quand tu fais

tex ft0, v0, fs0 <2d, linear>
 

'ft0' contient alors la position normalisé du pixel qui va être peint. 'ft0' ne contient pas la valeur UV définie dans les triangles, mais une valeurs UV interpolée à partir des 'données du triangles' afin de couvrir tout les pixel contenu dans ce triangle.

'tex' renvoit un texel, ce n'est pas exactement un pixel mais ça a l'air de se comporter pareil.
(j'ai fait une petite appli de dessin via le GPU il y a qq temps ou je ne peignais que les texels compris dans un certain radius (avec une intensité proportionnel à la distance du point par rapport au centre) ; le résultat obtenu correspondait exactement avec ce que j'aurais obtenu si je l'avais fait via un bitmapData :) )

#102 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 10 September 2012 - 11:40 AM

Ok, je vois .. +/- ..
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 :-)

#103 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 10 September 2012 - 11:41 AM

Citation

un vertexBuffer ne s'alimente que depuis un format vector?

Ben non, tu peux l'updater via un ByteArray, mais tu avais l'air de dire que ça ne fonctionnait que si toutes les valeurs étaient positives (ou alors j'ai rien compris ?)

Citation

Tu as un email? et tu es sous flashDevelop? je t'envois mes sources si tu veux..
Je veux bien :D
Je t'envois mon mail par MP :Hola:

#104 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 10 September 2012 - 12:01 PM

C'est fait! ;-) tiens moi au jus si ça marche chez toi :)

PS: j'ai compilé en ASC2.0 .. sinon, il faut virer les [inline] et idem dans les options de compil..

pour reste, j'pense que ça doit rouler..

Sous 11.4, ma latency affiche +/- 1ms .. on peut pas faire mieux je crois.. lol
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 :-)

#105 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 10 September 2012 - 12:02 PM

Citation

En fait, il me semble théoriquement possible d'avoir un VertexBuffer dédié au son ne contenant que 4096 valeurs.
Il faut penser en pixel et non pas en triangle :)
Ouais non, c'est pas possible...............................................................................
Même en recomposant les triangles coté GPU, il est nécessaire de passer 3 fois de suite les valeurs car le shader gère les datas par triplet ; la seule solution pour passer des valeurs uniques, c'est les constantes et il n'y a ni assez de constantes ni assez de lignes d'agal pour le mettre en place...

On peut uploader les données depuis un BA, mais apriori c'est pareil, le BA doit contenir des triplets de valeurs pour que ca marche

Voila un exemple d'utilisation de ByteArray associé à un VertexBuffer
http://stackoverflow...-range-of-one-f

#106 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 10 September 2012 - 12:04 PM

Citation

Ben non, tu peux l'updater via un ByteArray, mais tu avais l'air de dire que ça ne fonctionnait que si toutes les valeurs étaient positives (ou alors j'ai rien compris ?)

Heuuu oui! pour loader une texture sous forme de byteArray, c'est en effet prévu par AS3, mais là, il attend une suite de bytes RGBA .. c'est le souci. (positifs)

Ici, je demande pour charger non plus une tex, mais un vertexBuffer.. (en float signé alors..) là, je ne sais pas si byteArray possible.. je vais aller voir la doc..
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 :-)

#107 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 10 September 2012 - 12:07 PM

Merci pour le lien.. faut que j'étudie mieux les possibilités de registres.. mais si je load un vertices de 2048 x,y pour G et D (son) pourquoi ça irait pas?

Ensuite, me faut recup " mov TempRegisterChaiPasEncoreLequel , Va3.x " non? puis va3.y à mettre ailleurs, etc.. non? enfin, je ne sais pas.. je vais fouiller.. ou meme " mov VtempBlabla.xy , va3.xy " .. c'pas bon ça? ou dans un ft ? ou quoi j'avoue, je ne suis pas assez loin pour savoir.. :)

je dois encore apprendre..
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 :-)

#108 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 10 September 2012 - 12:16 PM

Cool le lien! on peut loader via ba.. :)

Sinon, ce qu'il a fait pour l'exemple va être très lent.. faut faire autrement.. mais bon, c'est juste pour l'exemple je suppose.. un ba est bcp + rapide si on le traite comme un Array ba[x] = float au lieu de ba.writeFloat() . dans une boucle.
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 :-)

#109 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 10 September 2012 - 12:20 PM

Citation

un ba est bcp + rapide si on le traite comme un Array ba[x] = float au lieu de ba.writeFloat()

!!!

Je ne savais même pas qu'on pouvait utiliser les crochets avec les BA !
Merci :)





Citation

si je load un vertices de 2048 x,y pour G et D (son) pourquoi ça irait pas?
parce que si tu as un VertexData contenant 2048 paires, cela sous entend que tu n'as pas que 6 valeurs dans ton indexBuffer (c'est l'indexBuffer qui détermine les triangles à peindre et les valeurs à piocher dans les vertexData).

On ne passe plus par une texture mais on veut tout de même avoir un rendu à l'écran, il faut donc définir des triangles pour dessiner dedans.

4096 valeurs = 4096 triangles = 4096 x 3 points --> trop par rapport au BA source

#110 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 10 September 2012 - 14:44 PM

Citation

parce que si tu as un VertexData contenant 2048 paires, cela sous entend que tu n'as pas que 6 valeurs dans ton indexBuffer (c'est l'indexBuffer qui détermine les triangles à peindre et les valeurs à piocher dans les vertexData).

On ne passe plus par une texture mais on veut tout de même avoir un rendu à l'écran, il faut donc définir des triangles pour dessiner dedans.


4096 valeurs = 4096 triangles = 4096 x 3 points --> trop par rapport au BA source

Oui, je vois ce que tu veux m'epliquer...mais c'pas ça que je voulais faire.. j'avais envie de garder les 4 vertex de base (mon carré) charger un autre vertice avec mes données qui ne servira pas du tout à 'affichage .. (pas de mov op .. ) mais par contre aller chercher dedans mes données x,y ...

Mais je m'apercois en lisant des trucs qu'il ny a pas moyen d'accéder à un vertex en particulier.. c'est naze ça!! donc, si en agal je veux aller chercher une valeur du vertex 1259 précisément, je ne sais pas!?? mince alors..

Mais alors du coup, pour la texture, c'est pareil... Si je veux ne pas envoyer tout de suite ma texture de 4096 textels à la sortie (comme je vais actuellement) mais que je veux parcourir les valeurs RGBA de chaque textels afin de faire des math dessus, stocker mes résultats dans un registre temporaire FT ou quoi, et quand j'ai fais tout, faire un mov de mon registre résultat vers OC, on sait pas non plus! ??

C'quoi ce plan.. y a un truc qui coince là, non? Pourtant, il me semble que je dois bien pouvoir manipuler ma texture entièrement (pixel par pixel).. mais p'tet que j'ai rien compris.. Là, je suis un peu le bec dans l'eau.. :cry:
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 :-)

#111 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 10 September 2012 - 15:03 PM

Donc, en gros, on peut accéder aux colonnes via x,y,z,w mais impossible d'accéder à une ligne particulière !? c'est bien ça?

Image IPB

Et c'pareil pour tous les autres registres.. !?
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 :-)

#112 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 10 September 2012 - 15:39 PM

Citation

Mais alors du coup, pour la texture, c'est pareil... Si je veux ne pas envoyer tout de suite ma texture de 4096 textels à la sortie (comme je vais actuellement) mais que je veux parcourir les valeurs RGBA de chaque textels afin de faire des math dessus, stocker mes résultats dans un registre temporaire FT ou quoi, et quand j'ai fais tout, faire un mov de mon registre résultat vers OC, on sait pas non plus! ??

Le cas dont tu parles, ce serait pour mixer 2 (ou n) sons ensemble ; si oui, je pense que tu peux le faire en mixant 2 texture (via la méthode d'hier).

Si non, tu peux envisager de proceder en plusieurs passes (en stockant les résultat de chaque passe dans une texture qui sera disponible pour la passe suivante (il faut utiliser context.setRenderToTexture pour dessiner le résultat du program dans une texture plutot qu'a l'écran ; cette texture est stocké en mémoire tant que tu ne fais pas ' context.setTextureAt(indexDeLaTexture,null) ')

Pas de rapport direct, mais je le dis quand même pour t'aider dans ta reflexion ; tu ne peux pas cibler un VertexAttribute à un index bien précis mais il est par contre possible de cibler une constante à un index précis.
Par exemple, si j'ai 3 constantes vc0, vc1 et vc2 , et que l'une des valeurs de mon VertexData est égale à 0 (ou 1 ou 2), je peux écrire vc[va0.x].x pour cibler la premiere valeur de vc0.

Je ne vois pas immédiatement à quoi ça pourrait servir dans ce cas, mais autant savoir que c'est possible :)

#113 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 10 September 2012 - 16:09 PM

Oui! Merci pour tes conseils..

Après, oui, je me dis que finalement, oui, je peux appliquer des maths, mais ça va être les mêmes qui vont s'appliquer sur tous les pixels.. Donc, finalement, ce DSP, ça va être un DSP en carton :S Genre, oui, il pourra mixer .. p'tet faire une pseudo reverb en stockant la texture et en la réapplicant en blend mode dans les passes suivantes.. etc..

Peut être, je pourrais aussi faire les extrapolations de samples.. ça ça pourrait encore être utile .. faire du reverse? on sait inverser (flip H et V) de toute la texture je suppose.. genre en inversant les UV ou quoi..

Et encore, tout ça reste valable que si je peux arriver à protéger mon bit de signe .. comme la composante R contient le bit de signe, le moindre changement peut foutre tout en l'air..

Bref, je vais encore y réfléchir et voir si je peux faire un truc ou l'autre.. mais je ne vais pas y rester 107 ans.. :) je dois avancer sur d'aurtes trucs aussi..

J'essaye d'autres trucs pour voir.. mais jusque là, ça donne rien de bon..


var dataBuffer:VertexBuffer3D = context3D.createVertexBuffer(4096, 1);;
dataBuffer.uploadFromByteArray(data,0,0,4096);
context3D.setVertexBufferAt(2, vertexbuffer, 0, Context3DVertexBufferFormat.BYTES_4); //va2
 
puis mov oc.rgb,v1.zyx .. je vais essayer un peu de jouer avec les Constants aussi.. mais là, je suis dépité..

Bon, ben si il se passe un truc, je viendrai le dire.. :)
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 :-)

#114 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 10 September 2012 - 18:44 PM

Je suis en train de lire ton code...

Toute cette partie devrait se trouver dans ta fonction 'initMolehill' , ça devrait tourner beaucoup plus vite avec ça en moins :D


context3D.setTextureAt(0, texture); // push in fs0 (fragment sampler)
                 
lAssembler.assemble(Context3DProgramType.FRAGMENT, "tex ft0, v0, fs0 <2d,clamp,nearest,nomip>\nmov oc,ft0");// place texture in output color
var pixelAgal:ByteArray = agalAssembler.agalcode;
                 
program = context3D.createProgram();
program.upload(vertexAgal, pixelAgal);
context3D.setProgram(program);
 

Puisque tu ne change jamais de Program3D, pas besoin d'en créer un nouveau à chaque frame, et pas besoin non plus de l'associer au context à chaque frame , une fois suffit :)

(idem pour la texture)

Les indexs associés aux vertexAttributes/textures dans le GPU ne sont pas effacé quand tu fais context.clear() ; context.clear() efface seulement ce qui a été dessiné "dans l'objet Graphics" du Stage3D.

Le seul moyen d'effacer des éléments du GPU est de lui dire explicitement

context.setVertexBufferAt(0,null);
context.setTextureAt(0,null);
 
(le program n'a pas à être remis à 0 car on doit faire apparaitre qq chose à l'écran)

De fait, pas besoin de faire l'association entre chaque frame :)

#115 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 10 September 2012 - 18:52 PM

Ok! pour les contexts, tu as raison.. je devais encore essayer de déplacer en init.. (le truc est loin d'etre optimisé et propre, je suis en plein tests à coup de code et de comments.. :)

Par contre, pour l'agal de tex , je comptais le changer à chaque frame.. enfin, dans le sens où si j'avais pu réaliser quelque chose avec ce projet, ca devait changer en fonction de variables.. par exemple, augmentation de reverb, ou curseur de mixage.. etc.. c'est pourquoi la partie tex est restée en frame pour le moment.. :)

par contre, tu penses que je devrais effacer le set texture à chaque passage?

En fait, pour l'agal, je pensais le déplacer ailleurs.. dans dSP ou même une classe propre, et utiliser une fonction appender (pour pas me faire chier avec les "\n" etc.. juste ecrire les lignes les unes en dessous des autres..

Mais tout ça, c'est pour structurer propre.. car si j'arrive aps à faire le minimum, je n'irai pas + loin avec ça.. :)

J'ai un peu l'impression que c'est l’éléphant qui accouche d'une souris ce projet.. Mais bon, l'idée est bonne et c'est sympa d'apprendre.. :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 :-)

#116 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 10 September 2012 - 19:12 PM

Citation

Par contre, pour l'agal de tex , je comptais le changer à chaque frame.. enfin, dans le sens où si j'avais pu réaliser quelque chose avec ce projet, ca devait changer en fonction de variables.. par exemple, augmentation de reverb, ou curseur de mixage.. etc.. c'est pourquoi la partie tex est restée en frame pour le moment.. :)
Je ne suis pas un expert en création de son (éh oui, en ça non plus... :) ), mais je pense qu'il serait plus simple d'utiliser les constantes pour faire ça et un shader par filtre de transformation (appliqué passe par passe). Les constantes portent vraiment mal leurs non dans le contexte du GPU car elle servent à contenir les variables...

Une constante se présente sous la forme d'un Vector.<Number> à 4 entrées ;
Admettons que tu ais 8 sliders pour définir les paramètres de ton son , tu aurais alors besoin de 2 constantes qui stockeront chacune 4 valeur (1 par slide). Dés que tu fais bouger un slider, tu peux updater ta constante

values[1] = 12;
context.setProgramConstantFromVector("vertex",0,values)
 


Cette opération prend un temps minime car les données à updater sont infimes.
Et cela te permet de dynamiser ton Shader sans le recompiler à chaque fois. :D

Dans le cas du traitement sonore, je pense (peut être à tort) que le fait d'appliquer les effets "passe-par-passe" ne pose pas de problème, et ce sera surtout beaucoup moins coûteux que la compilation à chaque frame (mais bon comme tu dis, c'est pas optimisé, je suppose qu'au final tu aurais décidé de ne recompiler le Shader qu'après qu'un slider ai bougé)

Citation

par contre, tu penses que je devrais effacer le set texture à chaque passage?
Oui !
Toutes les instructions liée au context prennent un peu de ressource (c'est dérisoire dans le cas d'un seul objet, mais bon je vois que tu es un accro de l'optimisation :) ) et puisque dans ton cas, l'objet Texture n'est jamais éffacé de l'index (dans la mémoire du GPU) pas besoin de l'assigner à chaque fois.

#117 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 10 September 2012 - 19:22 PM

Citation

Cette opération prend un temps minime car les données à updater sont infimes.

Je ne serais pas aussi catégorique ^^
Ca mérite des tests car je pense au contraire que ça prend beaucoup plus de temps qu'on ne le pense, notamment à cause de la conversion Number => Float.

Citation

Toutes les instructions liée au context prennent un peu de ressource (c'est dérisoire dans le cas d'un seul objet, mais bon je vois que tu es un accro de l'optimisation :) ) et puisque dans ton cas, l'objet Texture n'est jamais éffacé de l'index (dans la mémoire du GPU) pas besoin de l'assigner à chaque fois.

Par contre ça trouve vite ça limite par ce que dés que tu auras besoin de plus d'une texture, tu devras unset celles qui ne sont plus utilisées par la suite. Au final, c'est une problématique très très compliquée, le mieux étant d'arriver à grouper les draw call par shader puis par set de textures.

#118 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 10 September 2012 - 19:29 PM

Citation

Ca mérite des tests car je pense au contraire que ça prend beaucoup plus de temps qu'on ne le pense, notamment à cause de la conversion Number => Float.
Je reconnais que je n'ai pas testé (le temps que ça prenait), ça me paraissait logique que ça ne prenne pas trop de temps...

Je pense que le temps de création d'une constante reste malgré tout infime par rapport au temps de compilation d'un Shader suivi d'un setProgram :)

#119 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 10 September 2012 - 19:37 PM

Citation

Je ne suis pas un expert en création de son (éh oui, en ça non plus... :) ), mais je pense qu'il serait plus simple d'utiliser les constantes pour faire ça et un shader par filtre de transformation (appliqué passe par passe). Les constantes portent vraiment mal leurs non dans le contexte du GPU car elle servent à contenir les variables...

Admettons, dans ce cas, je peux passer tout le code relatif au tex en "init" (sauf l'upload du bitmap) mais alors, je chargerai un registre constants à chaque frame..Ouai. . Mais tu as raison, y a moins à charger à chaque frame :)

Mais tu as raison, tout ce qui ne varie pas doit être passé en init.

Mon souci actuel (pour lequel je réfléchi et qui me déprime) c'est comment je peux modifier mes valeurs dans le gpu sans foute en l'air l'audio.. et là, ben va falloir ruser.. il faut que je sauvegarde le signe de mes valeur .. quitte à le faire en AS3, avant de charger en texture.. mais dans ce cas, je dois aussi modifier les data en enlevant ce bit de signature)

Enfin, là, je vais arrêter 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 :-)

#120 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 10 September 2012 - 19:40 PM

Citation

Je ne serais pas aussi catégorique ^^
Ca mérite des tests car je pense au contraire que ça prend beaucoup plus de temps qu'on ne le pense, notamment à cause de la conversion Number => Float.

Nous on est déjà en float coté AS3 .. Mais mon souci est plus complexe.. en gros, je cherche à rentrer des float (signés) et à les manipuler dans le GPU, puis les sortir.. (pour résumer) :)
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 :-)

#121 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 10 September 2012 - 19:55 PM

Citation

Je pense que le temps de création d'une constante reste malgré tout infime par rapport au temps de compilation d'un Shader suivi d'un setProgram

Oui mais :
- la compilation n'arrive quasiment jamais
- le setProgram n'arrive qu'une fois par passe (quand c'est bien fait)

Citation

Nous on est déjà en float coté AS3

Justement non. Number <=> double donc 64bits. Donc il faut faire une conversion de chaque Number en float 32bits. Et il faut le faire pour chaque cellule du Vector. Donc utiliser un ByteArray rempli de floats devrait être beaucoup plus rapide car ça s'upload directement.

#122 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 11 September 2012 - 06:40 AM

Citation

Donc utiliser un ByteArray rempli de floats devrait être beaucoup plus rapide car ça s'upload directement.

Bonjour JM, ben justement c'est ce qu'on fait.. charger un byteArray de float 32. (on ne part pas avec des numbers) on part avec des float 32 signés dont les valeurs possibles vont -1 à +1 . c'est encore possible de les charger en constants ou vertexAtt .. Mais pas directement en texture .. (à cause des valeurs négatives) (l'idée est que la routine de création texture splitte le flux binaire en paquet de 8 bit RGBA ) et me les affiche.. on peut dire alors que chaque pixel (rgba) est bien une représenation de mon float initial .. :)

En fait, ça, j'y suis arrivé.. en transformant mon ba en bitmapdata et en chargeant en texture .. et en reconstruisant mes float à la sortie.. puis go > sound card ..

Voir ici ce processus (dure 1 à 2 ms à cahque passe)
http://www.pureas3.o...lab/DSP-on-GPU/

mais bon, ce n'est pas la meilleure soluce.. alors, on explore le chargement direct via un constant ou va.. mais il faut alors spliter les 32bit en agal pour en faire des rgba. j'ai essayé le chargement via BYTE_4 au lieu de FLOAT_1 mais ça ne marche pas.. :S ou alors, j'ai loupé un détail.. mais bon.. A présent (phase2), est d'arriver à les loader diretcement en tant que Float 32 et faire le splitage en agal au dernier stage et à les placer dans OC avant le draw ..

Citation

le setProgram n'arrive qu'une fois par passe (quand c'est bien fait)

C'est le cas.
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 :-)

#123 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 11 September 2012 - 07:20 AM

Tom, j'ai une question .. pour mon backbuff de 64X64, si je fais une texture non plus de 64X64, mais bien de width = 32 et height = 64, mais que je laisse mes coords UV a 0 - 1 .. la carte graph devrai étirer ma tex et créer les pixels intermédiaire non? (interpolation) ?

Mon but ici, est d'interpoler, mais uniquement de gauche à droite et surtout pas de bas en haut..

EDIT: INCROYABLE !! :mrgreen:

J'ai fais un low pitch de 50% (son ralenti par 2) juste en étirant ma tex (interpolation auto par la carte graph)

Cool, pas une ligne de code!! même pas un seul "mov" AGAL, kedal, nada, peanuts, rien, zero !!

Normalement pour faire ça en AS3, ca demande déjà un certain niveau de code...

Au moins, mon truc à la con aura le mérite de se rendre utile et de faire du time stretching en 2 ms .. lol

Bon, on fera p'tet pas des FFT avec, mais on peut d'ja faire des trucs qui demanderait bcp de code autrement.. finalement, c'est utile quand même.. :)

Essaye ca! : http://www.pureas3.o...lab/DSP-on-GPU/

Bon, là, j'ai vite testé en étirant mon backbuff.. mais c'pas comme ça qu'il faut faire, il faut fixer la taille de sortie 4096 et plutot jouer sur l'entrée.. donc, je vais refaire ça comme il faut.. et ajouter un slider.. déjà rien que pour cet effet, la demo vaut le coup..

Mais pour aller + loin et coder en agal sur mes samples, il faut trouver le moyen de les entrer en float signé et arriver en agal à splitter pour la sortie.. Aller Tom, au taf.. :) (ou à défaut, au moins reconstruire les floats 32 dans un variant en piquant les valeurs RGBA de la texture..)
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 :-)

#124 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 11 September 2012 - 11:30 AM

Yes !

Citation

Mais pour aller + loin et coder en agal sur mes samples, il faut trouver le moyen de les entrer en float signé et arriver en agal à splitter pour la sortie.

http://blog.joa-eber...and-vice-versa/

Je ne comprend pas ce code ^^
mais n'est il pas possible de l'appliquer coté GPU ?

#125 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 11 September 2012 - 13:22 PM

Une autre version, plus facile à porter en AGAL :)
http://stackoverflow...alue-to-a-float

#126 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 11 September 2012 - 14:10 PM

Joa utilise bcp les opérateurs binaires "AND, OR" et les bitWise.. c'est un peu ce que j'ai fais tout à l'heure en aS3.. Mais finalement, ça ne m'arrange pas vraiment.. ça alourdi tout.

Sinon, oui, l'autre à l'air + simple à comprendre.. et encore que... les mantisse etc.. lol

pour comprendre, il faut ça:
http://fr.wikipedia.org/wiki/IEEE_754

La, j'essaye de voir en agal.. mais en agal, on a pas les AND, OR, etc binaire.. donc, il faut se démerder avec des math simples.

Le but est de voir si il est possible de prendre un float du GPU et de le splitter en 4 bytes vers des RGBA d'un registre fragment .. évidement, je crains que à cause du bit de signe, on aie un souci .. il faut voir.. dans agal, je vois l'instru "SLT" qui pourrait servir a tester si le float est négatif et stocker un truc en fonction de ça.. comme visiblement, quand on code un truc, on code contre des des colonnes, et le même code est appliqué à toutes les entrées d'un registre (ligne) c'est bien ça?

Bref, de toute, j'essaye déjà de capter comment je peux manipuler mes registres.. et c'pas gagner.. et si j'ai besoin d'une valeur (comme multiplier par 0.5) je dois au préalable charger 0.5 dans une case d'un constantRegister .. c'est facile tiens ça.. lol mais bon..

Une op comme:

v2.x = v1.x * (2 exp 8); c'est faisable en agal je suppose.. car je me demande si c'pas la clef pour réussir à splitter un 32 en 4X 8 .. :)

il va aussi falloir trouver comment stocker et ressortir le signe.. mais on a vu que l'alpha n'était pas exploité, il nous retse donc un byte à exploiter.. et même au pire, on exploite le Bleu.. car si l'audio est stockée en Rouge et Vert, ça suffit largement, ça nous fait 16 bits..

PS: en AS3, un Number, c'est : double précision (64 bits : 1 bit de signe, 11 bits d'exposant (-1022 à 1023), 52 bits de mantisse, avec bit 1 implicite),

Tandis qu'un float (audio) et je suppose en GPU aussi, c'est : simple précision (32 bits : 1 bit de signe, 8 bits d'exposant (-126 à 127), 23 bits de mantisse, avec bit 1 implicite),

le mantisse est la valeur proprement dite, et l'exp est le décalage par rapport à la virgule .. (notation scientifique quoi..)
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 :-)

#127 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 11 September 2012 - 14:29 PM

Je copie ici un bout de conversation parallèle que j'ai avec Alama via MP puisque cela concerne directement le fonctionnement de l'AGAL en général, et peut servir à d'autre à comprendre comment ça marche

le message en entier :

Citation

Oui, j'ai viré tous mes trucs AS3 (trop lourd) et je me lance à essayer dans agal.. mais je rame ..

J'ai chargé mes 4096 float (qui vont de -1 à 1) dans va2 en FLOAT_1 (donc, je suppose que seul la colonne x de va2 est remplie..

dans mon program vertex, je copie va2 dans v1 (variant 1 je suppose) qui à sont tour n'a que X rempli! ??

mov v1, va2

ensuite, dans mon program fragment, j'essaye de voir ce que je peux faire..

la tout suite, j'essaye simplement de copier mes float dans RGB pour en faire une texture.. sans essayer de splitter en 4 bytes, meme si ce qui sort est naze, je veux juste voir comment ça se passe..

Donc, j'essaye tout et n'imp pour voir comment je peux travailler avec ça..


"mov ft1.xyz, v1.x",
"tex ft0, v0, ft1 <2d,clamp,nearest,nomip>",
"mov oc, ft0"

je pige pas trop ce fait "tex" ça générer une texture je pense..

bref, je suis nulle part .. depuis mo fragment, j'peux accéder à v1 je suppose? et je stocke mes calculs dans quoi? un ft? non?


point par point :

Citation

J'ai chargé mes 4096 float (qui vont de -1 à 1) dans va2 en FLOAT_1 (donc, je suppose que seul la colonne x de va2 est remplie..
Oui !

Citation

dans mon program vertex, je copie va2 dans v1 (variant 1 je suppose) qui à sont tour n'a que X rempli! ??
va2 contient uniquement un Float1 (accessible via va2.x) ; si tu transfère va2 vers v0 , v0 == va2 donc v0 contient un Float1 accesible via v0.x

Tu peux cependant remplir les valeurs 'y','z' et 'w' de v0 à partir de va2 si tu le souhaite (ce qui te permettra, de fait, d'obtenir un Float2, Float3 ou Float4 au niveau de v0)
il suffit de faire comme ca :

mov v0.xyzw, va2.xxxx
 



Petite parenthèse pendant que j'y suis, admettons que va2 contienne un Float2, on aurait pu écrire

mov v0.xyzw, va2.xyxy
 
ou

mov v0.xyzw, va2.xxyy
 
etc...



Citation

la tout suite, j'essaye simplement de copier mes float dans RGB pour en faire une texture.. sans essayer de splitter en 4 bytes, meme si ce qui sort est naze, je veux juste voir comment ça se passe..

Si tu as tes Float1 en va2 , que tu les passe au fragment en v0 , tu devrais pouvoir faire un calcul de ce type pour être sur d'obtenir une valeur positive


var ratio:Float1 = 0.5 + v0.x / 2
 

ensuite, pour l'appliquer en rendu écran (sous forme d'un niveau de gris) , il suffit de faire ça

mov oc.xyz, ratio.xxx
 

Citation

je pige pas trop ce fait "tex" ça générer une texture je pense..

Ca génère un texel issue d'une interpolation basée sur les UV de tes triangle.
Je sais que la définition que je vais donner n'est pas tout à fait juste, mais c'est comme ça que je me représente les choses...

La texture d'un triangle est défini par les UV, mais un triangle couvre la plupart du temps plusieurs pixels. Au niveau du fragmentShader, on liste (implicitement) tout les pixels contenu dans le triangle ; et lorsque tu utilise 'tex' , cela correspond à faire un getPixel32 du pixel actuellement traité par le Shader.

'tex' renvoit donc un Float4 représentant un pixel de la texture (un texel en fait, mais je ne vois pas bien la différence avec le pixel dans notre cas, et la definition de wikipedia ne m'éclaire pas trop, au contraire...)

#128 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 11 September 2012 - 15:04 PM

Tiens Tom, pour te montrer un exemple..

si je fais ceci en AS3:



var ba:ByteArray = new ByteArray;
ba.writeFloat( -0.96512);
trace(uint(ba[0]).toString(2), uint(ba[1]).toString(2), uint(ba[2]).toString(2), uint(ba[3]).toString(2));
ba[0] &= 0x7f;
trace(uint(ba[0]).toString(2), uint(ba[1]).toString(2), uint(ba[2]).toString(2), uint(ba[3]).toString(2));
ba.position = 0;
trace(ba.readFloat());


 

j'ecris -0.96 blabla..

Comme Joa, j'utilise une op binaire, je prend mon premier byte brut, son 1er bit est le signe..

donc, la sortie est d'abort avec le bit de signe:

10111111 1110111 10010 11011

Si j'applique sur ce byte un AND 01111111 (soit 7f en hexa) je force le first bit à 0 , donc, je vire le signe..

111111 1110111 10010 11011

et on peut voir que mon float est a présent positif..

Mais bon.. c'est juste pour l'exemple.. car après, pour réellement le convertir en 16bit ou autre, c'est galère à cause que le mantisse n'est pas un multiple de 8 .. :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 :-)

#129 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 11 September 2012 - 15:15 PM

Citation

Mais bon.. c'est juste pour l'exemple.. car après, pour réellement le convertir en 16bit ou autre, c'est galère à cause que le mantisse n'est pas un multiple de 8 .. :S

Et c'est grave si on arrondi au plus proche multiple de 8 ?


Citation

pour comprendre, il faut ça:
http://fr.wikipedia.org/wiki/IEEE_754
Merci pour le lien, je crois que je vais devoir le lire plusieurs fois ^^

#130 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 11 September 2012 - 15:16 PM

Citation

il suffit de faire comme ca :



mov v0.xyzw, va2.xxxx

ok! super, déjà..

Citation

var ratio:Float1 = 0.5 + v0.x / 2

pour ça, " 0.5" et "2" doivent existé en registre? je dois charger ces valeurs en constants?
(je suppose que je ne peux pas écrire des valeurs diretcement en agal?)

Citation

mov oc.xyz, ratio.xxx

Donc, en copiant directement un registre en OC, c'est bon? même aps besoin d'utilsier TEX ? ha.. je comprend pas tout mais bon.. car si je n'ai à la base que la moitié des valeur (2048 float par exemple) et que je veux que la carte graphique extrapole en inventant les pixels manquants ? je dois les calculer moi même en agal? ou un coup de "tex" fait l'affaire?

Je finirai par comprendre.. ça va aller! :)
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 :-)

#131 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 11 September 2012 - 15:23 PM

Citation

Et c'est grave si on arrondi au plus proche multiple de 8 ?

Oui! car le bit de poid fort (le 23 eme) contient presque toute la valeur à lui seul..

en binaire, c'est simple, chaque bit vaut 2 exp 7, 2 exp 6, 2 exp 5, etc.. jusqu'au bit 0 qui lui vaut 2 exp 0 donc, si le bit 8 (le MSB) d'un octet est à "1", il vaut à lui seul 127, soit la moitié de tout un octet maximum qui est de 255.

pour faire 255, tout l'octet est à 1 (1111 1111) ca fait 1 * 2exp7 = 127 + 1 * 2 exp 6 , etc.. un octet = 127+64+32+16+8+4+2+1 :)

il faut retenir que 1 * ( 2 eposant position du bit ) = sa valeur décimale ;)

en même temps .. on peut sans doute faire + simple..

Sachant que chaque float peut aller de -1 à +1 .. si on se contente de le multiplier par 255 et qu'on vire la virgule, on aura quand la valeur arrondie dans un seul octet ..

on peut faire pareil avec deux octets (16 bits) en agal je parle ici.. ce serait sans doute + simple que de ce faire chier avec des math binaire.. :) on stocke les 16 bit en RG et le signe en B ..

T'en penses quoi de cette piste?
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 :-)

#132 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 11 September 2012 - 15:36 PM

Citation

(je suppose que je ne peux pas écrire des valeurs diretcement en agal?)
Non, tu dois obligatoirement créer une constante qui contiendra ces valeurs

[petiteParentheseQuiNaRienAvoir]
il n'est pas possible de faire des calculs entre 2 constantes depuis le GPU.
Tu ne peux pas faire ça

mul vc0.x, vc0.x, vc0.y
 
si tu besoin de le faire, il faut passer une variable temporaire

'mov vt0, vc0
mul vt0.x, vt0.x, vc0.y

(mais normalement, on a pas besoin de faire de calculs entre 2 constantes (mais ca arrive parfois pendant les test, et tu sauras pourquoi tu as un message d'erreur si un jour ça t'arrive)
[/petiteParentheseQuiNaRienAvoir]

Citation

même aps besoin d'utilsier TEX ? ha.. je comprend pas tout mais bon..

Dis toi que l'objet Texture est une sorte de BitmapData coté GPU ; faire appel à tex, c'est faire un getPixel32 (du moins c'est presque ça).
On utilise tex quand on veut récuperer la couleur d'un pixel sur texture ; là c'est pas ce qu'on veut faire (si j'ai bien compris) donc pas besoin d'utiliser tex. (de même tu n'utilise pas forcément setPixel32 en duo avec getPixel32, ça peut arriver mais ce n'est pas une obligation).

Ce qui défini la zone à texturer, ce n'est pas la Texture ni les UV (qui sont intrinsèquement liés à la texture) mais la position des points du triangle ! Et d'ailleurs c'est logique :) Sinon on ne pourrait pas dessiner des triangle de couleurs, on serait obligé de passer par des textures à chaque fois...

#133 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 11 September 2012 - 15:50 PM

Citation

T'en penses quoi de cette piste?

Que c'est "la solution de facilité" mais pas la plus optimisée :)

(la plus optimisé, selon moi, est de transferer le SampleData dans un BitmapData (comme tu faisais jusqu'a présent) , de décoder les 4-bytes en float coté GPU (permettant de faire le reste des opérations pour transformer le son) , redécomposer le float en 4-byte , s'en servir pour peindre le résultat dans la texture, dessiner le context dans un bitmapData et le reconvertir en bytes via ba.writeBytes(bd.getPixels(rect));

Ceci dans l'unique but d'éviter les boucles avant et après le passage dans le GPU ; sur PC on s'en fout, mais sur mobile la différence devrait être visible.



Bon après si ça marche, c'est déjà bien hein ! :)


EDIT : Par ailleurs, faire comme tu veux (en injectant les 4096 valeurs au début dans un vertexBuffer), tu ne pourras plus gérer la pitch en transformant les dimension de la texture (tout simplement parce qu'on ne passe plus par une texture)

#134 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 11 September 2012 - 16:29 PM

Citation

(la plus optimisé, selon moi, est de transferer le SampleData dans un BitmapData (comme tu faisais jusqu'a présent) , de décoder les 4-bytes en float coté GPU (permettant de faire le reste des opérations pour transformer le son) , redécomposer le float en 4-byte , s'en servir pour peindre le résultat dans la texture, dessiner le context dans un bitmapData et le reconvertir en bytes via ba.writeBytes(bd.getPixels(rect));

Oui, c'est ce que je faisais (dans la demo) mais si je peux me passer de décomposer les floats en Btmap pour devoir quand meme les refaire dans le GPU, c'est mieux! non?

je me dis, que plus ça se passe on GPU, mieux c'est.. :)

Citation

EDIT : Par ailleurs, faire comme tu veux (en injectant les 4096 valeurs au début dans un vertexBuffer), tu ne pourras plus gérer la pitch en transformant les dimension de la texture (tout simplement parce qu'on ne passe plus par une texture)

Ben justement, cette etape ci, c'est d'essayer de construire ma texture an agal (tout on gpu) et plus en AS3 .. c'est pour aussi pouvoir bosser sur les floats dans le GPU avant de les décomposer en texture.. mais justement, je posais la question + haut, comment dans ce cas là je peux obtenir mes extrapolations? manuellement?

Comme je comprend, en agal, on code contre des colonnes .. donc, si je veux appliquer un coef multiplicateur à mes 4096 floats stockés en v1.x, je dois au préalable charger un vector de 4096 X mon coef dans un constant (en float_1 par exemple) ? Je ne me trompe pas? et faire par exemple:

mul variant.y, variant.x , constant.x j'ai compris le principe? :)
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 :-)

#135 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 11 September 2012 - 16:54 PM

Citation

Oui, c'est ce que je faisais (dans la demo) mais si je peux me passer de décomposer les floats en Btmap pour devoir quand meme les refaire dans le GPU, c'est mieux! non?
Je ne pense pas, il faudrait tester mais je pars du principe (qu'il faudrait donc vérifier) que

bmpData.setPixels(data)
texture.upload(bmpData)
 
est moins lourd que

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

Citation

je me dis, que plus ça se passe on GPU, mieux c'est.. :)
Il doit y avoir un malentendu quelque part parce que moi aussi je me dis ça :)

Citation

Ben justement, cette etape ci, c'est d'essayer de construire ma texture an agal (tout on gpu) et plus en AS3 .. c'est pour aussi pouvoir bosser sur les floats dans le GPU avant de les décomposer en texture.. mais justement, je posais la question + haut, comment dans ce cas là je peux obtenir mes extrapolations? manuellement?

On ne peut pas construire sa texture en AGAL, du moins pas dans le sens ou (je pense que) tu l'entends.
Comme je l'ai dit bien plus haut dans la conversation, tu peux dessiner des triangles de 2px de coté , tous décalé d'un px par rapport à l'autre de telle manière qu'on ne voit qu'un pixel plein par triangle (sauf les triangle du bas de notre structure dont on verra la pointe, mais peu importe). Tu peux ensuite faire un renderToTexture pour dessiner le résultat dans une texture (préalablement créé dans le GPU sans rien uploader dedans) , clear le context et dessiner ta nouvelle texture dans un plane (comme tu fais actuellement).

Le gros problème (désolé de n'y (re)penser que maintenant) avec ton approche des 4096 valeurs, c'est qu'il faut en fait 4096x3 valeurs car chaque valeur doit être contenu 3 fois de suite afin que chaque point de chaque triangle partage bien les même valeurs.

Dis autrement,
Puisqu'on a pas de texture, on a pas de pixels par défaut : tout passe par des triangles jouant le role de pixels.
Contrairement à un pixel, un triangle est composé de 3 points donc on ne peut pas "dessiner" 4096 pixels avec seulement 4096 valeurs.

De fait, ne pas passer par un bitmapData devient lourd :)



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

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