WebGL - Doc en vrac


1 mai 2011
La doc officielle de WebGL 1.0
Les TypedArrays
OpenGL ES
OpenGL ES Shading Language
Une page de démonstration de shaders pour WebGL !!! Très bien faite !
Quand on appelle getContext on transmet un hash/object pouvant contenir :
  • alpha : bool, default true, indique si on désire un canal alpha.
  • depth : bool, default true, indique que l'on désire un z-buffer (>=16 bits).
  • stencil : bool, default false, indique que l'on désire un stencil buffer (>=8 bits).
  • antialias : bool, default true, indique que l'on désire de l'antialiasing. La méthode choisie n'est pas sous notre contrôle (multisample/supersample).
  • premultipliedAlpha : bool, default true, indique que les couleurs des pixels rendus sont prémultipliées ou pas par le canal alpha. Bien évidemment, ce paramètre est ignoré si alpha est lui-même à false.
  • preserveDrawingBuffer : bool, default false, indique qu'après la présentation du tampon de dessin les pixels sont réglés à la valeur par défaut (true) ou laissées telles quelles (false). Apparemment, mettre cet attribut à false impacte la performance d'une application, alors que j'aurai dit l'inverse...
Ainsi, pour donner un exemple, on pourra exécuter ce qui suit :
$("#canvas3D")[0].getContext("webgl", {antialias:true, depth:true, stencil:true})
Il y a tout un paquet de types dérivés de l'interface WebGLObject.
ObjetCréationUtilisationDestruction
WebGLBufferglGenBuffersglBindBufferglDeleteBuffers
WebGLFrameBufferglGenFramebuffersglBindFramebufferglDeleteFramebuffers
WebGLProgramglCreateProgramglUseProgramglDeleteProgram
WebGLRenderbufferglGenRenderbuffersglBindRenderbufferglDeleteRenderbuffers
WebGLShaderglCreateShaderglAttachShaderglDeleteShader
WebGLTextureglGenTexturesglBindTextureglDeleteTextures
WebGLUniformLocation
Pour le retour de getActiveAttrib et getActiveUniform on a un objet de type WebGLActiveInfo qui contient size, type et name. Flash/Flex : http://www.cornflex.org/?p=1 Version WebGLU : http://blog.one-geek.com/2010/11/building-videosphere-going-further-with.html#more WebGLU : http://staffwww.itn.liu.se/~perla/Siggraph2010/posters/0139.pdf

JS : var ou pas var ?


1 mai 2011

Rapidement dit : var sert à implanter une variable dans le contexte courant.

Moins rapidement, si on utilise une variable sans var, l'interpréteur JS va remonter les contextes jusqu'à trouver une variable du même nom et l'utiliser. On voit d'ici les problèmes qui peuvent se poser si on déclare une variable en global et qu'on utilise une variable du même nom, sans var, au sein d'une fonction...

Ainsi, il peut paraître prudent de mettre un var avant toute déclaration de variables, mais on peut vouloir utiliser une variable d'un autre contexte.

J'ajoute ici que toute affectation en JS se fait par référence...

WebGL 2


1 mai 2011

JS : Slider d'images défilantes


1 mars 2011

Le Javascript c'est très bien mais les disparités entre navigateurs font que ce langage ne peut exprimer toute son élégance sans une série d'abstractions (comprenez fonctions et objets cachés). L'utilisation de jQuery simplifie ces manipulations browseriennes et on aboutit à du code très élégant comme il n'aurait jamais dû cesser de l'être.
La preuve ?
Je voulais faire un slider d'images, un visualiseur de diapositives en français, qui permet de passer à l'image suivante à l'aide d'un clic de souris. Le code repose sur du HTML très simple et référençable par un moteur de recherche : un DIV positionné en relative ou absolute contenant des IMG dont on doit spécifier les tailles et, si la variable ContainerId contient l'Id du DIV sus-mentionné, ça donne les 13 lignes qui suivent ainsi que la démo juste au-dessous.

var Left = MaxWidth = MaxHeight = 0
$("#container img").each(function(idx, item)        {
    $(this).css({"position":"absolute", "top":"0px", "left":Left+"px"})
    Left += $(this).width()
    MaxWidth = Math.max($(this).width(), MaxWidth)
    MaxHeight = Math.max($(this).height(), MaxHeight)
    $(this).click(function()    {
        var NextImg = $(this).next("img")
        var ShiftPosition = !NextImg.length ? 0 : NextImg.css("left")
        $("#container-inner-container").animate({"left":"-"+ShiftPosition}, 500, "swing")
    })
}).wrapAll("<div id='container-inner-container'></div>")
$("#container-inner-container").css({position:"absolute", top:"0px", left:"0px", witdh:Left+"px", height:MaxHeight+"px"})
$("#container").css({overflow:"hidden", position:"relative", width:MaxWidth, height:MaxHeight})

Quant à son fonctionnement, c'était le premier slider que je faisais en jQuery, donc tout est assez basique : je donne une position absolue à toutes les images qui sont filles du container passé en paramètre et je les place toutes les une à la suite des autres avec une petite fonction qui réagit au clic souris pour chacune d'entre elle et qui exécute un scroll à la suivante, simplement en animant la propriété CSS left.

JS : Slider d'images en fondu


1 mars 2011

Comme précédemment, on veut afficher des images les unes à la suite des autres avec un clic souris, mais cette fois la transition se fait avec un fondu enchaîné et un code très réduit (merci jQuery).

Dans le code qui suit, la variable Container contient l'élément jQuery correspondant au DIV encapsulant les images :

var ImgIndex = MaxImgIndex = 0
Container.find("img").each(function()   {
    $(this).css({"position":"absolute"}).fadeTo(1, 0.001).css("display", "none")
    MaxImgIndex++
    $(this).click(function()    {
        Container.find("img:nth-child("+ImgIndex+")").fadeTo(1000, 0.01, function() {
                $(this).css("display", "none")
        })
        ImgIndex = (ImgIndex == MaxImgIndex ? 1 : ImgIndex+1)
        Container.find("img:nth-child("+ImgIndex+")").css("display", "inline").fadeTo(1000, 1)
    })
})
//On affiche la première image...
Container.find("img:nth-child(1)").trigger("click")
1 2 3..... 9 10 11 12 13.... 18 19 20