Utilizator:
Parola:
Am uitat parola... | Cont nou!


Articole Resurse Echipe Competiții Proiecte Forum DevBlogs Locuri de muncă GDROMag Issue#1 GDROCon 2007

 
Forum » Programare » Grafică » GLSL Alpha Blending




Pagina 1 din 1 [ 1 ]

Mesaj Info autor
    Postat la 15 Jul 2009 18:54:24    Subiect: GLSL Alpha Blending
adimirea info:

adimirea:

Salut,

Vreau sa fac alpha blending intr-un fragment shader GLSL. Pentru asta mi-ar trebui sa pot sa citesc culoarea deja existenta in framebuffer-ul pe care-l construiesc. Adica, dupa ce imi construiesc culoarea finala pt pixelul curent,
sa zicem vec4 finalColor, eu as vrea sa combin culoarea asta cu ceea ce se afla deja in framebuffer, adica in loc de


gl_FragColor = finalColor;


sa pot face ceva gen:

float alpha = finalcolor.w;
gl_FragColor = gl_FragColor * alpha + finalcolor * (1-alpha);

Inca un lucru... Mentionez ca nu vreau sa folosesc functionalitatea fixa si anume "glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); " si sa setez doar valoarea alpha din shader.



Ultima editare efectuată de adimirea pe 15 Jul 2009 18:55:11; 1 editări în total


Status:
Înregistrat pe:
15 Jul 2009 18:24:27
Vârsta: 27 ani
Mesaje: 5
Locatie: Bucuresti
Programator

 
    Postat la 15 Jul 2009 21:40:45    Subiect: Re: GLSL Alpha Blending
Deliverance info:

Deliverance:

adimirea a scris:

Salut,

Vreau sa fac alpha blending intr-un fragment shader GLSL. Pentru asta mi-ar trebui sa pot sa citesc culoarea deja existenta in framebuffer-ul pe care-l construiesc. Adica, dupa ce imi construiesc culoarea finala pt pixelul curent,
sa zicem vec4 finalColor, eu as vrea sa combin culoarea asta cu ceea ce se afla deja in framebuffer, adica in loc de


gl_FragColor = finalColor;


sa pot face ceva gen:

float alpha = finalcolor.w;
gl_FragColor = gl_FragColor * alpha + finalcolor * (1-alpha);

Inca un lucru... Mentionez ca nu vreau sa folosesc functionalitatea fixa si anume "glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); " si sa setez doar valoarea alpha din shader.



N-am mai facut asta dar banuiesc ca poti folosi un FBO pe care sa-l atasezi ca textura si sa-l trimiti in pixel shader ca uniform. In pixel shader transformi din clip space in ndc space, pozitia fragmentului (s=x/w, t=y/w, z/w) si folosesti s si t pentru lookup in textura. Sunt curios daca exista vreo alta solutie Very Happy


Status:
Înregistrat pe:
13 Oct 2006 10:05:37
Vârsta: 25 ani
Mesaje: 253
Locatie: Iasi , Romania
Programator

 
    Postat la 16 Jul 2009 08:47:16    Subiect: < fara subiect >
Rimio info:

Rimio:

Blendingul vine dupa pixel shader in pipeline. Mai pe scurt, folosesti glBlendFunc. Si mai pe scurt, nu folosi alte balarii ca FBO (care, by the way, nu merge pt ca citesti si scrii in acelasi buffer).

If at first you don't succeed, you fail.



Status:
Înregistrat pe:
24 Mar 2007 21:50:44
Vârsta: 23 ani
Mesaje: 800
Locatie: Pitesti, Arges
Programator

 
    Postat la 16 Jul 2009 11:47:58    Subiect: Re:
Deliverance info:

Deliverance:

Rimio a scris:

Blendingul vine dupa pixel shader in pipeline. Mai pe scurt, folosesti glBlendFunc. Si mai pe scurt, nu folosi alte balarii ca FBO (care, by the way, nu merge pt ca citesti si scrii in acelasi buffer).


Ideea este sa folosesti 2 FBO sau MRT pentru a nu scrie si citi in acelasi buffer...

EDIT:

Ma gandesc ca abordarea asta e utila pentru fake refraction

Ultima editare efectuată de Deliverance pe 16 Jul 2009 11:50:49; 1 editări în total


Status:
Înregistrat pe:
13 Oct 2006 10:05:37
Vârsta: 25 ani
Mesaje: 253
Locatie: Iasi , Romania
Programator

 
    Postat la 16 Jul 2009 15:11:16    Subiect: < fara subiect >
ZyZyX info:

ZyZyX:

Merge perfect cum a zis Deliverance, de fapt altfel nu se poate din GLSL din cate stiu : http://www.megaupload.com/?d=1GF3EPKJ


Status:
Înregistrat pe:
08 Jun 2007 18:07:36
Vârsta: 28 ani
Mesaje: 24
Locatie: Bucuresti
Programator

 
    Postat la 16 Jul 2009 15:16:37    Subiect: < fara subiect >
Rimio info:

Rimio:

Ok, oi fi eu mai greu de cap ... Tot nu inteleg de ce s-ar complica cineva sa implementeze blendingul in pixel shader.

If at first you don't succeed, you fail.



Status:
Înregistrat pe:
24 Mar 2007 21:50:44
Vârsta: 23 ani
Mesaje: 800
Locatie: Pitesti, Arges
Programator

 
    Postat la 16 Jul 2009 15:29:13    Subiect: < fara subiect >
ZyZyX info:

ZyZyX:

Nici eu nu am idee de ce s-ar complica atat pentru asa ceva, dar.... se poate implementa!


Status:
Înregistrat pe:
08 Jun 2007 18:07:36
Vârsta: 28 ani
Mesaje: 24
Locatie: Bucuresti
Programator

 
    Postat la 20 Jul 2009 13:31:47    Subiect: < fara subiect >
adimirea info:

adimirea:


Multumesc de raspunsuri. Pana la urma m-am hotarat sa folosesc glBlendFunc; motivul pentru care vroiam sa fac blend in shader este ca ma gandeam ca poate vor fi performante mai mari, dar din cate vad nu se poate decat cu multipass-uri si multiple rendering targets si 2 fbo-uri... si deja devine mult prea costisitor.

Insa, eu sper sa se includa candva in viitor in GLSL positbilitatea de a face blend, fara complicatii; Probleme in a avea asa ceva in shader, sunt cam 2:

1) Nu poti citi si scrie asupra aceluiasi framebuffer
2) Blend-ul vine dupa shading in pipeline

Mersi din nou de raspunsuri, mai citisem acelasi lucru si prin alte parti dar acum sunt [ mai ] sigur.


Status:
Înregistrat pe:
15 Jul 2009 18:24:27
Vârsta: 27 ani
Mesaje: 5
Locatie: Bucuresti
Programator

 
    Postat la 20 Jul 2009 14:48:10    Subiect: < fara subiect >
Dark info:

Dark:

Pentru blending exista tranzistori dedicati. N-are cum sa mearga mai repede ceva software decit ceva hardware.

Teoretic s-ar putea implementa un mod de a citi framebuffer-ul curent in shader, dar ar aparea tot felul de complicatii. In nici un caz n-ai vedea un spor de performanta. Ar fi o mare bataie de cap pentru un plus de flexibilitate destul de mic.

Se va putea face asta cind va aparea Larrabee, ca acolo framebuffer-ul e doar RAM si poti sa ajungi la el cum doresti (si oricum n-are hardware special pentru ROP). Nu-s sigur ca se va putea vreodata din GLSL, dar viitorul API-urilor si limbajelor 3D e oricum destul de incert, deci e greu de speculat.

"Am crezut ca esti ceva mai avansat" - Nekitu, 2008 A.D.
Autobaza


Status:
Înregistrat pe:
12 May 2007 20:12:30
Vârsta: ? ani
Mesaje: 740
Locatie:
Programator

 
    Postat la 20 Jul 2009 17:35:56    Subiect: < fara subiect >
Sir Game-a-lot info:

Sir Game-a-lot:

Nu ma pricep la opengl, dar am avut un proiect recent despre un mod de a face custom alphablending in DirectX. Eu randez scena intr-o textura A8R8G8B8 si pe ea aplic apoi niste pixel shadere care fac custom alpha blending
(randez un full screen quad). S-ar putea ca unele placi sa suporte citirea in acelasi shader, dar nu e reglementat/safe. Uita-te dupa Multiple Element Texture, dar cel putin pe Geforce gen 8 si 9 nu is suportate.

Nine women working in perfect harmony can't have a baby in 1 month.


Status:
Înregistrat pe:
25 Aug 2007 18:20:41
Vârsta: 33 ani
Mesaje: 116
Locatie: Cluj-Napoca
Programator
Zamolxis Interactive
 

Pagina 1 din 1 [ 1 ]


Server time: 09:27:04 19.05.2012



[ Termeni si conditii | Contact | F.A.Q. | Funny Pictures ]

© 2006 - 2012 Copyright 7thFACTOR Entertainment - All rights reserved