Jump to content

Recommended Posts

Posted

evo ja bas hteo da javim da sam uskocio u darling vagon, kad ono ceka me tema.

uspeo sam da iskompajliram i pokrenem default demo u FD.

malo je bilo zezanja pa ako nekom treba pomoc nek cima.

 

@gagy06

jel ti prijavljuje neku gresku?

 

kazu da treba .NET 4 i 2009+ GPU drajveri

takodje mora u htmlu da bude wmode=direct

zatim mora da se kompajlira za fp 11, preko flex sdk 4.5.1, sa switchem -swf-version=13 (a trebalo bi i playerglobal.swc includeovati)

 

i naravno moras imati instaliran (debug) fp11 u browseru (ja sam uspeo u chrome da ga stavim, ipak nije bilo tesko)

 

ima neka unofficial standalone fp varijanta, ali to nisam koristio, nego stavim u FD

Project >> Properties >> Output >> Test Project = Run Custom Command pa chrome file:///C:/nesto/stagod/bin/index.html

 

trace radi normalno, trebalo bi i debugger

 

inace bez -swf-version=13 je beo ekran i samo malo trepne i to je to. debugger javi da ne moze da nadje Context3D.

U FD se to namesta na Project >> Properties >> Compiler Options >> Additional Compiler Options

 

[edit]

ono sto mene trenutno najvise zanima je da li mogu da kombinujem Starling sa nekim drugim endzinom (recimo Away3D) -- zelim da napravim custom 3D pozadinu sa normal mapom i svetlima. ako neko naidje na tu informaciju neka javi pls.

Posted

Nema greske.

Sve sam postavio u FD kako treba, al kada publikujem dobijem poruku da renderuje softwerski.

Naravno kada istu aplikaciju probam na desku onda je OK, renderuje pomocu GPU. Znaci nema greske u aplikaciji nego je do kombinacije FP/graficka.

Inace sam primjetio da otkako sam instalirao ovaj FP11 RC da mi i stari molehill primjeri rade na jako niskom FPS-u, zapravo max 10 FPS-a, sta god da probam.

Probao sam updejtovati drajvere ali nista. Laptop ima intelovu integrisanu grafiku.

 

Ovo sa Away3d-nesto kontam tebi je najbitnije da sve ide u GPU. Away podrzava Stage3D tako da ne vidim zasto ne bi mogao iskombinovati.

Posted

^ oba endzina se kace na Stage3D, a posto su pisani bez obzira jedan prema drugom, to stvara koliziju. (nasumican banalan primer #1: render jednog endzina obrise ono sto je prvi nacrtao; nasumican banalan primer #2: pipeline nije efikasan, zbog previse redundantnih poziva iz oba endzina po frejmu).

 

problem nije na GPU ili na medju-apstraktnom nivou, vec upravo u kodu, odnosno u time i resource managementu oba endzina. pokusao sam da nadjem bilo kakve komentare na ovu temu, i ovakva pitanja postoje (away3d vs anything i starling vs anything compatibility), ali izgleda da je jos uvek rano za odgovore.

 

generalno svaki framework se pise tako da podrazumeva odredjenu situaciju u okruzenju, i pristupi su razni, od rigidnih, preko adaptivnih, plugin-based, extension-based, itd. plasim se da su u ovom slucaju i away3d i starling rigidni i egocentricni (prosto jer je tako najlakse za pocetni razvoj) i podrazumevaju da su sami sebi dovoljni i najbolji za citav projekat.

 

nazalost, ponekad se desava da je rigidan dizajn i najoptimalniji, to onda znaci da se ne radi o propustu u arhitekturi, vec o odluci.

 

problem je samo u tome sto starling ne radi 3d, a ne zelim da se mlatim sa away3d za UI i opsti gameplay koji je sustinski 2d. a usput, starling ima sjajan 2d particle sistem.

 

kada bih mogao da uhakujem starling da svari custom native 3d scenu, onda mi away3d ne treba, ali to je sve pod znakom pitanja, jer nemam predstavu kako to izgleda u praksi.

 

a kao sto rekoh, 3d mi treba samo zbog normal mape i svetala u pozadini (starling ne pominje svetla nigde, a cudno, nigde se ne pominju ni blending modovi.. izgleda da ce i to morati rucno). sto je malo bzvz, jer kako ja to vidim, najvece prednosti 3d modela su (osim HW acc) upravo mesh (pa cak i u 2d), teksture (materijali), i svetla(!).

 

[edit]

hm, ovaj snippet koda moze da znaci da ipak mogu da ih razdvojim

this.stage.stage3Ds[0]

[edit2]

da, blendMode ne postoji u starlingu, ali otkrio sam vrlo jednostavan nacin da ga sam malo tweakujem. treba samo malo promeniti klase Starling, Image, Quad, QuadGroup, RenderTexture, kao i RenderSupport u delu koji se tice metode RenderSupport.setDefaultBlendFactors

 

npr. ako je default blending

stage3D.context3D.setBlendFactors(Context3DBlendFactor.ONE, Context3DBlendFactor.ZERO);

additive blending se postize ovako

stage3D.context3D.setBlendFactors(Context3DBlendFactor.SOURCE_COLOR, Context3DBlendFactor.DESTINATION_COLOR);

[edit3]

pardon, ovako :)

stage3D.context3D.setBlendFactors(Context3DBlendFactor.ONE, Context3DBlendFactor.ONE);

malo je konfuzno :)[/edit3]

 

pogledajte malo ovu metodu, nije tesko, ali je neophodno osnovno razumevanje blendinga.

 

[edit3]

samo treba imati u vidu sledecu formulu

result = (source * sourceFactor) + (destination * destinationFactor)

 

nesto sto necete pronaci u helpu je da su result, source, i destination zapravo vektori (kao u pixel benderu).

odnosno, ove vrednosti su u stvari [r,g,b,a] (ili ako bi pisali kao u pixel benderu: source.rgba).

 

to znaci:

result.rgba = (source.rgba * sourceFactor) + (destination.rgba * destinationFactor)

 

default blending dobijamo kada source gazi destination, odnosno

result.rgba = (source.rgba * 1) + (destination.rgba * 0) pa

 

stage3D.context3D.setBlendFactors(Context3DBlendFactor.ONE, Context3DBlendFactor.ZERO);

additive blending dobijamo kada saberemo oba piksela pa je

result.rgba = (source.rgba * 1) + (destination.rgba * 1)

 

stage3D.context3D.setBlendFactors(Context3DBlendFactor.ONE, Context3DBlendFactor.ONE);

invert dobijemo kad obrnuti destination piksel pomnozimo source-om (ako je 0 nista se ne menja, ako je 1, invertuje se skroz) i time pregazimo destination

result.rgba = (source.rgba * (1 - destination.rgba)) + (destination.rgba * 0)

 

stage3D.context3D.setBlendFactors(Context3DBlendFactor.ONE_MINUS_DESTINATION_COLOR, Context3DBlendFactor.ZERO);

--

 

medjutim, sada je u celu pricu moguce ubaciti i alfu, pa je omoguceno napredno maskiranje. tek cu da se zezam s tim.

 

[edit4]

zaboravio sam da napomenem da ne ide nikad rgba, nego je razdvojeno na SOURCE_COLOR (rgb) i SOURCE_ALPHA (a), odnosno ONE_MINUS_DESTINATION_COLOR (rgb) i ONE_MINUS_DESTINATION_ALPHA (a) itd.

 

alfa je, logicno, za maskiranje, boje su za blending.

e sad, posto se alfa faktorise na samim komponentama (to je ono sto Starling zove premultiplied alpha), to utice na neke stvari povoljno, ali i nepovoljno, zavisno od scenarija.

 

da bi se boje normalizovale (un-multiply alpha) to se radi ovako (naravno pseudokod)

if(color.a > 0.0) color.rgb *= 1.0 / color.a;

 

nesto vise o tome ovde

Posted

A vidim lijepo si "uronio" u starling.

Nego javi jel funkcionise ova kombinacija 2D-3D. Evo danas su izbacili neki 3D framework na labsu, nisam puno citao al mozda se nudi navedeno rjesenje. I da, danas zvanicno FP 11 i AIR 3.

Posted

evo recimo kako da ubacite da Quad.setVertexColor podrzava alfu

 

u klasi Quad

public function setVertexColor(vertexID:int, color:uint):void
{
  mVertexData.setColor(vertexID, color & 0xffffff, (color >>> 24) / 0xff);
  if (mVertexBuffer) createVertexBuffer();
}

poziv:

q = new Quad(200, 200);
q.setVertexColor(0, 0xffaa0000); // ARGB umesto RGB
q.setVertexColor(1, 0x4f005caa);
q.setVertexColor(2, 0x00ffffff);
q.setVertexColor(3, 0xffaa7600);
this.addChild(q);

slicno i za color setter (mada nije neophodno, jer postoji alpha)

public function set color(value:uint):void
{
  mVertexData.setUniformColor(value & 0xffffff, (value >>> 24) / 0xff);
  if (mVertexBuffer) createVertexBuffer();
}

VEROVATNO se neke stvari komplikuju (i kvare) zbog premultiplied alfe npr, ali i to cu resiti vremenom.

 

a da biste namestili blending:

 

dodajte u klasi Quad (npr. za sad Quad ali idealno treba u DisplayObject verovatno)

protected var mBlendMode:String;
public function get blendMode():String { return mBlendMode; }
public function set blendMode(v:String):void { mBlendMode = v; }

pa u Quad.render metodi promenite ovu liniju

support.setDefaultBlendFactors(true, this.blendMode);

a onda se u RenderSupport klasi promeni

public function setDefaultBlendFactors(premultipliedAlpha:Boolean, blendMode:String = ""):void
{
  ....
  // ovo na kraju funkcije
  if(blendMode == "add") { // ili recimo BlendMode.ADD
    Starling.context.setBlendFactors(Context3DBlendFactor.ONE, Context3DBlendFactor.ONE);
  } else if(blendMode == "invert") {
    Starling.context.setBlendFactors(Context3DBlendFactor.ONE_MINUS_DESTINATION_COLOR, Context3DBlendFactor.ONE_MINUS_SOURCE_COLOR); // *** vidi dole
  } else if(blendMode == " ... ") {
    // ostali modovi?
  }
}

*** ovaj invert se namerno razlikuje od onog iz prethodnog posta da bi lepo radio sa transparentnim kolornim vertex shaderima. ovo je recimo slucaj kada premultiplied alpha savrseno dopunjava zadatak.

 

poziv:

q = new Quad(200, 200);
q.setVertexColor(0, 0xffaa0000);
q.setVertexColor(1, 0x4f005caa);
q.setVertexColor(2, 0x00ffffff);
q.setVertexColor(3, 0xffaa7600);
q.blendMode = BlendMode.ADD; // zbog testa vam je potrebna neka grafika iza ovog Quada: fotka ili nesto sto menja boju
this.addChild(q);

that's it.

uopste mi nije jasno zasto ove stvari nisu vec bile unutra :/

 

btw, idealno je napraviti novu klasu starling.display.BlendMode, ne valja da se sudari sa flash.display

ako napravim ovo kao ekstenziju, bacim ovde.

 

kod u ovom postu je brutal hack, ne ocekujte da se nesto nece pokvariti negde.

 

uzasno ruzan primer je ovde

Posted

premultiplied alpha - objasnjenje:

 

imamo npr. dva objekta: onaj dole je ff4000 opaque, onaj gore je 004080 ali 50% transparentan.

kada se 50% transparentnost, odnosno 0.5 alpha umnozi u rgb gornjeg objekta, njegov rgb ispada 002040.

 

prilikom blendinga se sabiraju ff4000 i 002040 i dobija se ff6040, sto je rezultat poluprovidnosti gornjeg objekta.

ovo se radi da se ne bi blending racunao mnozenjem alfe na licu mesta, jer to pravi nepotreban overhead.

 

medjutim, ako samplujemo gornji objekat dobicemo da je njegova boja 002040 sto nije istina.

unmultiply ce nas vratiti nazad na 004080, jer je (prema color.rgb *= 1.0 / color.a) color.rgb *= 2

 

unmultiply je nekad pozeljan, nekad ne, zavisno od okolnosti, ali premultiplied alpha je generalno zahvalna za fast alpha blending.

 

ovde sam ja za potrebe demonstracije rgb vrednosti napisao heksadecimalno, ali su to u realnosti tri razlicita floata (tako da mnozenje i deljenje nisu problem zbog zaokruzivanja i sl).

 

uopste mi nije jasno zasto ove stvari nisu vec bile unutra :/

razlog je verovatno optimizacija, ili nesto trece, ali svakako budite oprezni sa eksploatacijom blendinga i zaobilazenjem premultiplied alfe.

 

I da, danas zvanicno FP 11 i AIR 3.

Koliko videh, samo na macu.

Mnogo su se nesto slizali Apple i Adobe preko noci.

Tolika frka oko iPhone "razdora" a nigde ni glasa o tome da je flash vec uveliko na iOSu i da se ekskluzivno pusta na macu.

Ne znam vise jel su to fleshomrsci hajpovali, ili mekofili. Ili se to samo veliki vracevi bave nekim politikama.

 

:hm:

  • 3 months later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...
powered by