dev.gamez.lv Forum Index dev.gamez.lv
Latvian Game Developers Community
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups 

Problēma ar masks
Goto page 1, 2  Next
 
dev.gamez.lv Forum Index -> OpenGL
View previous topic :: View next topic  
Author Message
Vecis



Joined: 01 Jan 2007
Posts: 144

PostPosted: Sun Feb 07, 2010 7:06 pm    Post subject: Problēma ar masks

Pamēģināju izmantot masks opengl, bet radās problēmas:

Itkā daļa ir kā vajag, daļa nav.
Tā daļa kas ir ar mask, tā tiek zīmēta pēdējā.
Kā tikt vaļā no šīs problēmas, kas tiek darīts nepareizi?

Code:

glMatrixMode( GL_MODELVIEW )
glLoadIdentity()
glPushMatrix()

glDisable( GL_BLEND )
glEnable( GL_CULL_FACE  )
for i in models:
  if i.modelhasmask==False:
    glBindTexture(GL_TEXTURE_2D, i.textures[0])
    glDrawElementsus( GL_TRIANGLES, y )

glEnable( GL_BLEND )
glDisable( GL_CULL_FACE  )
for i in models:
  if i.modelhasmask==True:
    glBlendFunc(GL_DST_COLOR, GL_ZERO)
    glBindTexture(GL_TEXTURE_2D, i.textures[1])
    glDrawElementsus( GL_TRIANGLES, y )

    glBlendFunc(GL_ONE, GL_ONE)
    glBindTexture(GL_TEXTURE_2D, i.textures[0])
    glDrawElementsus( GL_TRIANGLES, y )
glPopMatrix()
Back to top
View user's profile Send e-mail
snake5
Indago dalībnieks
Indago dalībnieks


Joined: 27 Jun 2007
Posts: 2590

PostPosted: Sun Feb 07, 2010 7:42 pm    Post subject:

Vajag ieslēgt alpha testing pirmkārt. (Tā viņš saucas uz D3D, vajadzētu līdzīgi/tāpat būt uz OGL)
Otrkārt, dīvaini tev tur blendfaktori.
Lai taisītu parastu blending'u, būtu jālieto GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA.
Un tad, kad to nelieto, tas nav jāmaina, jo strādā kā GL_ONE, GL_ZERO, kad alpha ir 1.

EDIT: glAlphaFunc( GL_GREATER, kautkas_starp_0_un_1 ); bija alpha testiem jālieto.
un glEnable( GL_ALPHA_TEST );

http://www2.deec.uc.pt/~peixoto/eda/opengl/glAlphaFunc.html
_________________
"There are two choices here: "looks good" and "realism"." -- Paul Nettle
Back to top
View user's profile Visit poster's website
Vecis



Joined: 01 Jan 2007
Posts: 144

PostPosted: Mon Feb 08, 2010 6:18 pm    Post subject:

Nu nezinu, skatījos gan citu kodā, gan 1 pamācībā un bijā rādīts tā kā es daru te.
Īsti nezinu kā tad tam būtu kodā jaizskatās, ir kādi piemēri?
Back to top
View user's profile Send e-mail
snake5
Indago dalībnieks
Indago dalībnieks


Joined: 27 Jun 2007
Posts: 2590

PostPosted: Mon Feb 08, 2010 7:24 pm    Post subject:

Pamācībām vienmēr ticēt nevajag. Tās ir tikai pamācības.
Ar to informāciju, ko es iedevu, būtu jāpietiek, lai salabotu visu.
Sarakstīšu svarīgāko pa punktiem:
-aizvākt no katra katra nevajadzīgos glBlendFunc izsaukumus, ielikt vienu ar GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA
-ieslēgt GL_ALPHA_TEST sākumā
-un turpat uzstādīt glAlphaFunc uz GL_GREATER un kaut ko starp 0 un 1 (otrais parametrs norāda, aiz kuras alpha vērtības var tekstūru griezt nost (nezīmēt pikseļus) pavisam. T.i. ja kreisajā tekstūras pusē būtu alpha 0 un labajā - 1, un pa vidu starpā esošās vērtības (gradient alpha tekstūrai), tad šis parametrs norādītu, cik daudz no kreisās puses griezt nost. Ja 0.5, tad zīmējot nogriezta būtu puse tekstūras.

P.S. Kur tu tik līkus tutoriāļus atradi?
Es šādus atradu (keywordi: opengl transparency)
http://www.naturewizard.com/tutorial0111.html
http://www.opengl.org/resources/faq/technical/transparency.htm
_________________
"There are two choices here: "looks good" and "realism"." -- Paul Nettle


Last edited by snake5 on Mon Feb 08, 2010 7:31 pm; edited 2 times in total
Back to top
View user's profile Visit poster's website
Vecis



Joined: 01 Jan 2007
Posts: 144

PostPosted: Tue Feb 09, 2010 5:23 pm    Post subject:

Domāju ka sapratu, pamēģināšu Smile
edit: Nu kkas nav riktīgi

Code:

glEnable(GL_ALPHA_TEST)
glAlphaFunc(GL_GREATER, 0.5)
#---

glMatrixMode( GL_MODELVIEW )
glLoadIdentity()
glPushMatrix()

glDisable( GL_BLEND )
glEnable( GL_CULL_FACE  )
for i in models:
  if i.modelhasmask==False:
    glBindTexture(GL_TEXTURE_2D, i.textures[0])
    glDrawElementsus( GL_TRIANGLES, y )


glEnable( GL_BLEND )
glDisable( GL_CULL_FACE  )
for i in models:
  if i.modelhasmask==True:
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
    glBindTexture(GL_TEXTURE_2D, i.textures[1]) #uzstādu alpha tekstūru
    glDrawElementsus( GL_TRIANGLES, y )

    glBlendFunc(GL_ONE, GL_ONE)
    glBindTexture(GL_TEXTURE_2D, i.textures[0]) #uzstādu parasto tekstūru
    glDrawElementsus( GL_TRIANGLES, y )
glPopMatrix()


Ja pie glAlphaFunc ņemu jebko mazāku par 1, viss izskatās vienkārši tā itkā nekādas maskas vispār nebūtu, bet ja ņemu 1, tad nekas nav redzams.

Pamācība kurā skatījos ir te
http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=20
Lai arī tas kods nav ne Python ne OpenGL ES kko jau sapratu..
Back to top
View user's profile Send e-mail
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Tue Feb 09, 2010 5:53 pm    Post subject:

Quote:
bet ja ņemu 1, tad nekas nav redzams.

Tas ir pareizi. Jo neviens pikselis nav lielāks par 1 kā tu norādīji kāir jābūt (GL_GREATER, 1). OpenGL FFP limitē pikseļu vērtības no 0 līdz 1, ieskaitot.

Kāpēc tev tā alfa tekstūra ir atsevišķi no tekstūras? Nevari ielikt vienā un tai pašā?
Jo tā kā tev tas kods ir tagad, tas nestrādās. Tad ir jālieto multiteksturēšana, ja gribi ar divām dažādām tekstūrām uzzīmēt vienu, ņemot alfa kanālu no otrās.

Tas NeHe kods strādās tikai tad, ja zīmēsi pareizā kārtībā - neko pa virsu nedrīkst zīmēt jau esoši uzzīmētam maskotajam poligonam. Tāpēc droši vien pirmajā bildē tev tās dažas lapas izskatās dīvani - tās ir zīmētas pa virsu jau uzzīmētai lapai. Tad tev jālieto poligonu kārtošana atkarībā no to attāluma līdz kamerai. Un čakars sāksies tad, ja tie krustojas, vai citādi samudžinas. Silti ieskau likt vienā tekstūrā un zīmēt ar vienu piegājienu (lietojot GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA modi). Vai arī nu čakarējies un zīmē divos piegājienos ar savu oriģinālo kodu (kas ir pareizs), tik tad kārto pareizi poligonus. Trešais variants - lieto multiteksturēšanu, lai zīmētu no divām tekstūrām vienā piegājienā. Bet nu tam īsti neredzu jēgu, ja var abas tekstūras apvienot vienā.

Vēl drusku padomāju - un sapratu ka tavam variantam no NeHe koda būs lielas problēmas ar depth buferi. Tas tev jāatslēdz, kad otreiz zīmē, citādi artefakti var sanākt. Tā nav laba metode 3d variantam. Der tikai 2d spraitiem. Met to prom.
Back to top
View user's profile Send e-mail
Vecis



Joined: 01 Jan 2007
Posts: 144

PostPosted: Tue Feb 09, 2010 6:09 pm    Post subject:

Tikko izmēģināju savu veco kodu + izslēdzu/ieslēdzu depth buferi tad kad vajag un ne, bet rezultāts nav tāds kā gribētos

Tad jau laikam vajadzēs visu vienā tekstūrā, tā cik saprotu arī ātrāk būs.
Un tad ja izmanto GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA kārtot pēc attāluma (zīmēt tālāko vispirms) vairs nav nepieciešams?


Last edited by Vecis on Tue Feb 09, 2010 6:43 pm; edited 1 time in total
Back to top
View user's profile Send e-mail
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Tue Feb 09, 2010 6:24 pm    Post subject:

Ja lieto alfa testu un maska būs tikai 0 vai 1, tad nevajag. Tad var vākt ārā arī to visu glBlend.. padarīšanu.
Ja maska var būt kaut kas pa vidam starp 0 vai 1, tad vajag.
Back to top
View user's profile Send e-mail
Vecis



Joined: 01 Jan 2007
Posts: 144

PostPosted: Wed Feb 10, 2010 6:35 pm    Post subject:

Neizskatās ka Python pareizi ielādētu caurspīdīgas tekstūras. Confused
Ja ņemu GL_RGBA tad saka unsupported image format.
Varbūt ir kāds veids kā vienkārši nezīmēt tekstūras melno daļu?
Back to top
View user's profile Send e-mail
snake5
Indago dalībnieks
Indago dalībnieks


Joined: 27 Jun 2007
Posts: 2590

PostPosted: Wed Feb 10, 2010 7:19 pm    Post subject:

kā ar GL_BGRA formātu?
_________________
"There are two choices here: "looks good" and "realism"." -- Paul Nettle
Back to top
View user's profile Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Wed Feb 10, 2010 8:36 pm    Post subject:

Vecis wrote:
Neizskatās ka Python pareizi ielādētu caurspīdīgas tekstūras. :?

Un kā tu to ielādē? Python tāpat kā C, vai gandrīz kā jebkurā citā programmēšanas valodā, var atvērt failu un lasīt to baitu pa baitam no jebkāda bilžu formāta.

Quote:
Ja ņemu GL_RGBA tad saka unsupported image format.

GL_RGBA ir ļoti normāls gan internal, gan pixel formāts. Par OpenGL ES gan neko nezinu, jālasa dokumentācija.
Back to top
View user's profile Send e-mail
Vecis



Joined: 01 Jan 2007
Posts: 144

PostPosted: Wed Feb 10, 2010 9:16 pm    Post subject:

Baitu pa baitam nemaku, bet parasti ieladeju ar iebuveto graphics moduli:
(uz PC tads laikam nav, tas ir uz Python for S60 (Symbian))
bilde=graphics.Image.open(path)
Back to top
View user's profile Send e-mail
snake5
Indago dalībnieks
Indago dalībnieks


Joined: 27 Jun 2007
Posts: 2590

PostPosted: Wed Feb 10, 2010 9:37 pm    Post subject:

Kādu attēlu tu centies ielādēt un kā?
_________________
"There are two choices here: "looks good" and "realism"." -- Paul Nettle
Back to top
View user's profile Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Wed Feb 10, 2010 10:05 pm    Post subject:

Atceries, ka jpeg'am nav alfa kanāla. Tev jāizmanto vai nu bmp, vai nu png formāts. Vai arī, protams, jāimplementē sava lasīšana no cita formāta (raw/tga).

Vai arī, protams, variants, kad tu ielādē divas bildes - tekstūru + masku atsevišķos image klases objektos, un tad pikseli pa pikselim apvieno tās vienā 32-bitu RGBA bildē, kur tad arī uploado uz opengl'u.
Back to top
View user's profile Send e-mail
Vecis



Joined: 01 Jan 2007
Posts: 144

PostPosted: Wed Feb 10, 2010 10:52 pm    Post subject:

Izmantoju png. Doma jau skaidra, bet nezinu ka to panakt un iegut pixeli no image objekta ar funciju getpixel ir loti leni. Izskatas ka bus jaielade ka teici baitu pa baitam, vienigi ko tad konkreti meklet, kur skatities lai ko tadu uzrakstitu?
Back to top
View user's profile Send e-mail
Display posts from previous:   
dev.gamez.lv Forum Index -> OpenGL All times are GMT + 2 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group