Toon posts:

[Opengl] Tiles and Masking

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik wil graag masking gebruiken in tiles, maar ik krijg het niet aan de praat. In de source code hieronder heb ik de blending stuff in de lijst geplaatst maar dat werkt niet.

Nu wil ik graag weten of masking op deze manier wel mogelijk is en als het mogelijk is hoe moet ik het dan doen.


Hier worden de tiles aangemaakt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
  Tiles:=glGenLists(Grootte);

  glEnable(GL_BLEND);
  glDisable(GL_DEPTH_TEST);
  for Teller:=0 to Grootte do
  begin
    cx:=(Teller mod 16)/ 16.0;
    cy:=(Teller div 16)/ 8.0;
    glNewList(Tiles+Teller,GL_COMPILE);
    glBlendFunc(GL_DST_COLOR,GL_ZERO);
    glBindTexture(GL_TEXTURE_2D, Textures[0]);
    glBegin(GL_QUADS);
    glTexCoord2f(cx +0.0012, 1.0-cy-0.125); glVertex2f(-0.5,-0.5);
    glTexCoord2f(cx+0.0625 , 1.0-cy-0.125); glVertex2f( 0.5,-0.5);
    glTexCoord2f(cx+0.0625 , 0.9898-cy);    glVertex2f( 0.5, 0.5);
    glTexCoord2f(cx +0.0012, 0.9898-cy);    glVertex2f(-0.5, 0.5);
    glEnd();
    glBlendFunc(GL_ONE, GL_ONE);
    glBindTexture(GL_TEXTURE_2D, Textures[1]);
    glBegin(GL_QUADS);
    glTexCoord2f(cx +0.0012, 1.0-cy-0.125); glVertex2f(-0.5,-0.5);
    glTexCoord2f(cx+0.0625 , 1.0-cy-0.125); glVertex2f( 0.5,-0.5);
    glTexCoord2f(cx+0.0625 , 0.9898-cy);    glVertex2f( 0.5, 0.5);
    glTexCoord2f(cx +0.0012, 0.9898-cy);    glVertex2f(-0.5, 0.5);
    glEnd();
    glEndList();
  end;
  glDisable(GL_BLEND);
  glEnable(GL_DEPTH_TEST);

Hier worden de tiles afgedrukt:
code:
1
2
3
4
5
6
7
8
procedure TopenglTiles.Tile(x,y:real; Tile:byte; Grootte:integer);
begin
  glPushMatrix();
  glLoadIdentity();
  glTranslatef(x,y,-19.0);
  glCallList(Tile+1);
  glPopMatrix();
end;

Verwijderd

De glEnable(GL_BLEND); opnemen in je list :) Die roep je nu nergens aan. Alleen de statements tussen glNewList() en glEndList() worden opgenomen in de DisplayList.

Verwijderd

Topicstarter
Dat heb ik al geprobeerd, maar werkt ook niet.

Verwijderd

WAT wil je eigenlijk doen?

Je list ziet er zo uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
glBlendFunc(GL_DST_COLOR,GL_ZERO);
    glBindTexture(GL_TEXTURE_2D, Textures[0]);
    glBegin(GL_QUADS);
    glTexCoord2f(cx +0.0012, 1.0-cy-0.125); glVertex2f(-0.5,-0.5);
    glTexCoord2f(cx+0.0625 , 1.0-cy-0.125); glVertex2f( 0.5,-0.5);
    glTexCoord2f(cx+0.0625 , 0.9898-cy);    glVertex2f( 0.5, 0.5);
    glTexCoord2f(cx +0.0012, 0.9898-cy);    glVertex2f(-0.5, 0.5);
    glEnd();
    glBlendFunc(GL_ONE, GL_ONE);
    glBindTexture(GL_TEXTURE_2D, Textures[1]);
    glBegin(GL_QUADS);
    glTexCoord2f(cx +0.0012, 1.0-cy-0.125); glVertex2f(-0.5,-0.5);
    glTexCoord2f(cx+0.0625 , 1.0-cy-0.125); glVertex2f( 0.5,-0.5);
    glTexCoord2f(cx+0.0625 , 0.9898-cy);    glVertex2f( 0.5, 0.5);
    glTexCoord2f(cx +0.0012, 0.9898-cy);    glVertex2f(-0.5, 0.5);
    glEnd();

Die code executeer je elke keer dat je glCallList aanroept. Daarin zit GEEN glDisable(GL_DEPTH_TEST); en GEEN glEnable(GL_BLEND);
Ik weet zo uit mn hoofd niet wat glBlendFunc(GL_DST_COLOR, GL_ZERO); moet doen, maar als je bepaalde pixels wilt uitmasken zou ik een alphabyte opnemen per pixel en een alphatest doen. Je moet dan even je bitmap reader uitbreiden zodat je bv de alphabyte afhankelijk maakt van de kleursterkte (dus hoe zwarter hoe meer doorzichtiger), waardoor je dmv alphatesting per pixel kunt bepalen of een pixel wel of niet kan. Zodoende kun je ook anti-aliassed masking doen, en blend het geheel goed samen. Hieronder een stukje code die de alphachannels vult met een byte die afhankelijk is van je de kleur plus een stukje rendercode die dmv alphatesting de polys blend. Het is wel C, dus je moet het even omzetten naar Pascal.

alphachannel creation: (Stukje uit een BMP reader)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
    // is stored as BGRA
    byR = pBitDataFromFile[(i * iTrueWidth*3) + (j * 3)+2];     // R
    byG = pBitDataFromFile[(i * iTrueWidth *3) + (j * 3)+1];    // G
    byB = pBitDataFromFile[(i * iTrueWidth *3) + (j * 3)];      // B
    pBitData[(i * iWidth * 4) + (j * 4)] = byR;     // R
    pBitData[(i * iWidth * 4) + (j * 4)+1] = byG;   // G
    pBitData[(i * iWidth * 4) + (j * 4)+2] = byB;   // B
    if(bCreateAlphaFromColor)
    {
        byAlpha = (byte)((0.35f * byR) + (0.45f * byG) + (0.20f * byB));
    }
    else
    {
        byAlpha = 0xff;
    }
    pBitData[(i * iWidth * 4) + (j * 4)+3] = byAlpha;
}

Rendering van de polys en masking dmv alphatesting:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

    // Because the texture has an alphachannel, we can exclude all black pixels and almost
    // black pixels by using the alpha test feature of OpenGL.
    glEnable(GL_ALPHA_TEST);
    glAlphaFunc(GL_GREATER,0.5f);

      // ...
    // bind texture. No envmapping.
    glDisable(GL_BLEND);
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D,m_iTexture);
    glColor4f(1.0f,1.0f,1.0f,1.0f);
    glDrawArrays(GL_QUADS, 0, m_lAmountOfStars * 4);

Hopelijk helpt je dit in de richting waarnaar je op zoek bent. Indien niet, misschien moet je wat duidelijker zijn in wat je wilt :)

Verwijderd

Topicstarter
Hopelijk helpt je dit in de richting waarnaar je op zoek bent. Indien niet, misschien moet je wat duidelijker zijn in wat je wilt
Ja thanx. Ik gebruik nu dus gewoon de alpha channel en het bmp formaat en dat werkt perfect.
Ik had de alpha channel al eerder gebruikt in combinatie met het tga formaat, maar dan kreeg ik allemaal gekke kleuren. Dus toen wou ik het met het bmp formaat proberen en blending, maar dat werkt volgens mijn niet samen met een list. En nu gebruik ik dus de alpha channel in combinatie met het bmp formaat.

Heel erg bedankt Otis