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?
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); } |