[c++ & opengl] Masking en volgorde van renderen

Pagina: 1
Acties:

  • ozkilator
  • Registratie: Februari 2004
  • Niet online
Ik zit met een probleem, ik probeer in opengl gebruik te maken van masks, nou werkt dat opzich aardig maar, zodra ik meerdere gemaskte objecten achter elkaar render dan moet ik alles wat voor in de scene te zien is als laatste render anders word het transparante gedeelte van mijn texture niet meer transparan.

dit hoort het te zijn
Afbeeldingslocatie: http://www.blinx.nl/opengl/good.jpg

En als ik in de verkeerde volgorde render (of de scene draai)
Afbeeldingslocatie: http://www.blinx.nl/opengl/bad.jpg

Nou zou ik dit kunnen oplossen door zelf een diepte test functie te schrijven zoals de DEPTH_TEST functie in opengl. Maar er moet iets beters zijn dan dat denk ik.
Ik gebruikte in eerste instantie de code van NEHE en heb later een eigen frameword geschreven, maar in allebei het zelfde resultaat. Hieronder staan een aantal opengl opties die ik heb geprobeerd aan/uit te zetten

code:
1
2
3
4
glDepthMask(true);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL); 
glEnable(GL_BLEND);


Ook heb ik het geprobeerd met verschillende alpha functies de onderstaande geeft het effect wat ook hierboven op de afbeeldingen te zien is.

code:
1
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);


Weet iemand hiervoor een oplossing waardoor ik dit probleem kwijt ben.

Yoda: Very dark the other side is.. hmm.. too dark... Obi-Wan: Yoda, shut up and eat your toast allready...


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

Er is maar één manier om alpha-blended polygonen goed te renderen: sorteren van achter naar voor.
Tenzij het je alleen gaat om een keuze om een pixel wel of niet te renderen (dus geen gradaties in transparantie), dan kun je het met een alpha test doen

[ Voor 62% gewijzigd door .oisyn op 27-02-2004 19:31 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • ozkilator
  • Registratie: Februari 2004
  • Niet online
dus toch een eigen diepte test functie schrijven? Hmmm weet hier misschien een goede tutorial voor te vinden?

Yoda: Very dark the other side is.. hmm.. too dark... Obi-Wan: Yoda, shut up and eat your toast allready...


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik heb m'n vorige post geedit, ik was wat onvolledig :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • ozkilator
  • Registratie: Februari 2004
  • Niet online
Dus dan zou je maar 1 kleur hebben die volledig transparant is? Dan zou ik een plaatje moeten nemen met een zwarte achtergrond en alleen zwart transparant moeten maken met die blendfunctie GL_ZERO?
En als ik meerdere transparantie nivos wil hebben word het dus diepte testen :X

Yoda: Very dark the other side is.. hmm.. too dark... Obi-Wan: Yoda, shut up and eat your toast allready...


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nee, je hebt 1 alpha-waarde die volledig transparant is, en de rest is volledig opaque. Het heet een alpha test, je test dus de alpha-waarde van een te zetten pixel tegen een andere waarde. Je neemt gewoon een 0 als reference en je alphafunc neem je GL_NOTEQUAL (oftewel: alle pixels met alpha-waarden anders dan 0 worden getekend). De depth test hou je gewoon zoals ie is, transparante pixels worden immers niet getekend dus de z-waarden op die plekken worden ook niet aangepast. Op die manier krijg je dus echte "gaten" in je polygonen waar je later nog iets achter kunt tekenen

.edit: overigens vraag ik me serieus af hoe je van plan was "zelf een dieptetest te schrijven" :X

[ Voor 83% gewijzigd door .oisyn op 27-02-2004 20:17 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • ozkilator
  • Registratie: Februari 2004
  • Niet online
Zelf een diepte test schrijf nee..... dat gaat me te ver.

GL_NOTEQUAL werkt! thanx, jammer dat het maar kleur transparantie aankan. Ik had trouwens op het opengl forum de zelfde vraag gesteld daar kwamen ze met:

code:
1
2
glAlphaFunc(GL_GREATER,0.5f);
glEnable(GL_ALPHA_TEST);


Wat bijna het zelfde werkt als GL_NOTEQUAL maar het werkt ook. Er schijnen volgens hun wel "order-independent transparency" functies te zijn maar die zijn erg zwaar voor je processor hellaas....

Maar iig bedankt voor je hulp _/-\o_

Yoda: Very dark the other side is.. hmm.. too dark... Obi-Wan: Yoda, shut up and eat your toast allready...


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

ozkilator schreef op 27 februari 2004 @ 22:48:
Zelf een diepte test schrijf nee..... dat gaat me te ver.
het kan ook niet als je het ook nog wil laten werken op hardware, vandaar mijn verontwaardiging ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

Die gl_greater en 0.5f is wel wat voor te zeggen aangezien dat beter werkt bij interpolaties tussen alpha-waarden (je krijgt een mooier verloop tussen stukjes van 0 en 1)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Hij moet depth tests UIT zetten, van achteren naar voren renderen, en blenden met de functie zoals aangegeven in de startposting (dus blending enablen en die functie zetten). Die functie zorgt ervoor dat de kleurwaarde gebruikt wordt voor de alpha, precies wat je wilt, hoe witter hoe meer transparant.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • ozkilator
  • Registratie: Februari 2004
  • Niet online
Hmm met dat glgreater moet ik dan nog ff gaan stoeien :)

wat betreft de depthtest uitzetten, dat lijkt me geen strak idee voor waarvoor ik het gebruik. Voor particle engines werkt dat trouwens perfect!

Yoda: Very dark the other side is.. hmm.. too dark... Obi-Wan: Yoda, shut up and eat your toast allready...


  • EfBe
  • Registratie: Januari 2000
  • Niet online
ozkilator schreef op 28 februari 2004 @ 11:28:
wat betreft de depthtest uitzetten, dat lijkt me geen strak idee voor waarvoor ik het gebruik. Voor particle engines werkt dat trouwens perfect!
Nou, blenden wordt wat lastig als je overlappende polies hebt (die elkaar overlappen dus). Je zult altijd 1 eerst moeten tekenen, wat blend errors op kan leveren.

Je kunt depth testing toch even uitzetten wanneer je die boompjes tekent, en daarna weer aanzetten? :)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

EfBe schreef op 28 februari 2004 @ 10:46:
Hij moet depth tests UIT zetten, van achteren naar voren renderen, en blenden met de functie zoals aangegeven in de startposting (dus blending enablen en die functie zetten). Die functie zorgt ervoor dat de kleurwaarde gebruikt wordt voor de alpha, precies wat je wilt, hoe witter hoe meer transparant.
Ten eerste heeft het weinig nut om het uit te zetten als je toch al van achter naar voor rendert, het doet er dan weinig toe of ie aan staat of niet. Ten tweede is het incorrect om een poly dat achter een andere transparante poly ligt eroverheen te blenden, zeker als ze volledig opaque blijken te zijn. Depth sorting kan nooit correct zonder dat je de polys echt gaat clippen (tenzij dat natuurlijk al van tevoren is gedaan omdat ze bv. in een bsp tree zaten), dus die test kun je beter aan laten staan. Kwa performance is die test niets waard, dus daarvoor hoef je het ook niet te doen.

De blendfunctie die hij gebruikt in de startpost is bovendien op alpha-waarde, niet op kleurwaarde. Zou ook wat zijn, dan kun je niet eens opaque zwarte pixels renderen.

Daarom zeg ik, als het hem puur gaat om volledig transparant (alpha=0) of volledig opaque (alpha=1), dan kan hij beter gewoon alpha testen (en de alphablending evt. uitzetten). Dan kan ie gewoon van voor naar achter renderen (willekeurige volgorde kan natuurlijk ook, maar dat is minder efficienter) en krijgt ie mooie gaten in z'n polygonen op de plek van de transparante texels

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1