[c, opengl] glDrawelements / glVertexpointer ellende

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • tec
  • Registratie: Juni 2001
  • Laatst online: 17-12-2024
Hoi, ik ben al een tijdje druk aan het programmeren aan een iPhone game in Obj-C + OpengLES. Nu had ik gisteren het idee om mijn renderengine te optimaliseren door een stuk te herschrijven middels C structs.

Idee: VertexBuffer struct bevat VertexData structs welke dan weer de dat voor een vertex bevat (coordinaten uv spul kleurtjes normal).

De VertexBuffer heeft een array vertexes en een array indexes, hieraan kunnen vertexes en indexes toegevoegd worden, zodra er geen ruimte meer is wordt het array vergroot.

Bovenstaande lijkt allemaal prima te werken, op het moment dat de render methode aangeroepen wordt kan ik de arrays uitlezen en bevatten deze de juiste data. Ondanks dat alle data klopt wordt er toch niet gerenderd wat ik wil, als ik de render methode van GL_TRIANGLES naar GL_POINTS zet dan zie ik dat er van de 3 quads maar 2 getekend worden en daarvan mist er bij 1 een hoekpunt, het lijkt daarnaast zo te zijn dat er punten over elkaar liggen.

Ik heb een vermoeden dat het iets met de stride of offset pointer te maken heeft maar het ontbreekt mij aan voldoende C kennis om de vinger op de pijnlijke plek te kunnen leggen.

Heeft iemand enig idee wat er mis gaat?

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
typedef struct {
    Coordinate3D    coordinate;
    UV              uv;
    Color           color;
} VertexData;

typedef struct {
    VertexData *vertexes;
    uint *indexes;
    uint vertexSpace;
    uint vertexCount;
    uint indexSpace;
    uint indexCount;
    uint blendMode;
    bool flush;
} VertexBuffer;



-(void)drawBufferAt:(uint)index {
    
    VertexBuffer *b = &vertexBuffers[index];
    
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    
    glEnable(GL_BLEND);
    
    switch (b->blendMode) {
        case BLEND_MODE_DEFAULT:
            glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA);
            break;
        case BLEND_MODE_MULTIPLY:
            glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA);
            break;
        case BLEND_MODE_SCREEN:
            glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR);
            break;
        case BLEND_MODE_DODGE:
            glBlendFunc(GL_DST_COLOR, GL_ONE);
            break;
        default:
            glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA);
            break;
    }
    
    glVertexPointer(3, GL_FLOAT, sizeof(VertexData), &b->vertexes[0].coordinate);
    glColorPointer(4, GL_FLOAT, sizeof(VertexData), &b->vertexes[0].color);
    glTexCoordPointer(2, GL_FLOAT, sizeof(VertexData), &b->vertexes[0].uv);
    glDrawElements(GL_TRIANGLES, b->indexCount, GL_UNSIGNED_SHORT, b->indexes);
    
    glDisable(GL_BLEND);
    
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_COLOR_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    
}

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 12:01
GL_UNSIGNED_SHORT past bij je uint type?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19:58

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat lijkt me idd de issue. Als 'uint' een typedef is voor 'unsigned int', dan zijn dat 32 bits ints. Maar een short is maar 16 bits. Je zult de 'uint' dus moeten veranderen in een 'ushort' (als die bestaat) of 'unsigned short'

[ Voor 9% gewijzigd door .oisyn op 31-05-2010 01:16 ]

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.


Acties:
  • 0 Henk 'm!

  • tec
  • Registratie: Juni 2001
  • Laatst online: 17-12-2024
Haha, damn, dat was het inderdaad. In mn oude code stond netjes gluShort als datatype, bij herschrijven heb ik deze met alle gemak van de wereld naar een uint veranderd.. doh :)

Thanks beiden!

Voor de volledigheid:
code:
1
2
3
4
5
6
7
8
9
10
typedef struct {
    VertexData *vertexes;
    gluShort *indexes;
    uint vertexSpace;
    uint vertexCount;
    uint indexSpace;
    uint indexCount;
    uint blendMode;
    bool flush;
} VertexBuffer;