Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[OpenGL] Texture kleuren 'lekken' door.

Pagina: 1
Acties:

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Hullo,

Ik ben druk bezig met OpenGL (via JOGL), en heb nu een probleempje met textures waar ik ook na hard googlen niet uitkom.

Afbeeldingslocatie: http://img156.imageshack.us/img156/2077/problem01nc1.th.png

Ik heb 2 objecten, een kubus en een piramide, waarvan de cubus 2 textures heeft. Het probleem is dat de rest van de vertices om een of andere reden met de kleur van de laatst getekende texel getekend worden. Afgezien van de gele en blauwe texture zouden zowel de cube als de piramide gewoon wit moeten zijn.

De kubus heeft 1 zijde met een blauwe texture (welke in de laatste hoek bruin is), dan 4 zijden zonder texture die ook spontaan bruin worden (zouden wit moeten zijn), en dan 1 zijde met een gele texture. Deze gele kleur zie je daarna terug op de piramide.

Dit is het stuk code dat de 'face' (eigen objecttype) tekent:
Java:
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
    public void draw(GL gl)
    {
        int i;
        if(texture != null)
            gl.glBindTexture(GL.GL_TEXTURE_2D, texture.getTextureObject());     
        switch(type)
        {
            case TYPE_QUAD :
                gl.glBegin(GL.GL_QUADS);
                break;
            case TYPE_TRIANGLE_FAN :
                gl.glBegin(GL.GL_TRIANGLE_FAN);
                break;
            default:
                throw new RuntimeException("Unknown face type for mesh " + mesh.id);
        }
        
        for(i = 0;i < indices.length;i++)
        {
            if(texture != null)
                gl.glTexCoord2f(TEXTURE_COORD[i * 2], TEXTURE_COORD[i * 2 + 1]);
            gl.glColor3fv(mesh.colors, indices[i] * 3);
            gl.glVertex3fv(mesh.vertices, indices[i] * 3);
        }
        gl.glEnd();
    }

https://niels.nu


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19-11 23:43

.oisyn

Moderator Devschuur®

Demotivational Speaker

Duh. Wellicht wil je de texture weer unbinden als je geen texture wilt hebben :). Sowieso is het per definitie zo dat elke vertex de laatst ingestelde settings meekrijgt (kleur, texture coords, etc). Calls als glTexCoord() veranderen gewoon een globale state, en op het moment dat jij glVertex() aanroept wordt die state gebruikt bij het creëren van de vertex. Het is dus niet zo dat als jij geen texture coordinaat instelt voor een vertex (wat sowieso een rare bewoording is, want je stelt hem dus niet in voor een vertex) die vertex geen texture coordinaat krijgt. Op dezelfde manier kun je prima meerdere keren glTexCoord() aanroepen - dit overschrijft gewoon de laatst ingestelde waarde, het is niet zo dat je vertex dan ineens meerdere texture coordinaten krijgt :)

Op het moment dat jij vind dat er geen texture moet zijn dan stel je ook geen coordinaten meer in, en dus worden de laatst ingestelde gebruikt. Ook haal je de texture niet weg, waardoor hij nog steeds gebruikt wordt.

[ Voor 41% gewijzigd door .oisyn op 04-03-2008 11:19 ]

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.


  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Yay :)

Java:
1
2
3
4
        if(texture != null)
            gl.glBindTexture(GL.GL_TEXTURE_2D, texture.getTextureObject());     
        else
            gl.glBindTexture(GL.GL_TEXTURE_2D, 0);


Thanks, ik had al zo'n vermoeden dat ik iets simpels vergeten was, helaas is dit iets wat ze in de meeste tutorials niet uitleggen.

Edit: bedankt voor de uitleg ook, ik wist niet dat textures op die manier in gebruik bleven.

[ Voor 13% gewijzigd door Hydra op 04-03-2008 11:22 ]

https://niels.nu