Hi,
Mein OpenGL 2D Renderer ist soweit erstmal funktionsfähig.
Eine minimale Font-Engine ist auch schon eingebaut, damit ich mir mal die FPS anzeigen lassen kann.
Alles in Allem habe ich aber nur knapp halb so viel FPS, wie auf dem gleichen Stand mit DirectX 11.
Als kleinen "Stresstest" hab ich mal 2000 Sprites gerendert, mit wechselnden Texture-Atlassen. D.h. knapp 2000x glDrawElements() pro Frame.
Erreicht habe ich damit knapp 100FPS.
Da ich mit OpenGL noch nicht soo vertraut bin, meine Frage: ist das so in Ordnung oder müsste da mehr drin sein?
Bei jeder Frame schreibe ich die Vertices in ein Array, was dann bei Bedarf (z.B. wenn sich der TextureAtlas ändert, ein anderer Shader verwendet werden soll, etc.) gerendert wird.
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
|
//Vertices in Array speichern
unsigned int n = this->VerticesInBuffer;
this->VertexData[n++] = *spriteset->GetSpriteVertex(this->Timer->GetTotalTime(),-1,0);
this->VertexData[n++] = *spriteset->GetSpriteVertex(this->Timer->GetTotalTime(),-1,1);
this->VertexData[n++] = *spriteset->GetSpriteVertex(this->Timer->GetTotalTime(),-1,2);
this->VertexData[n++] = *spriteset->GetSpriteVertex(this->Timer->GetTotalTime(),-1,3);
this->VerticesInBuffer += 4;
|
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
//Rendern
glBindBuffer(GL_ARRAY_BUFFER, this->VertexBufferId);
glBufferData(GL_ARRAY_BUFFER, this->VerticesInBuffer * sizeof(Grafics::VERTEX), this->VertexData, GL_DYNAMIC_DRAW);
glEnableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, this->VertexBufferId);
if (userectindexbuffer == true)
{
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->RectangleIndexBufferId);
}
glBindVertexArray(this->VertexArrayId);
if (this->CurrentPrimitiveTopology == PRIMITIVE_TRIANGLELIST)
{
//Triangle - List
int indexcount = this->VerticesInBuffer / 4 * 6;
glDrawElements(GL_TRIANGLES, indexcount, GL_UNSIGNED_SHORT, 0);
}
else if (this->CurrentPrimitiveTopology == PRIMITIVE_LINE)
{
//Lines
glDrawArrays(GL_LINES, 0, this->VerticesInBuffer);
}
this->VerticesInBuffer = 0;
|
Gibt es vielleicht noch irgendwelche Funktionen, die man im 2D nicht braucht, und die Standardmäßig laufen?
GL_CULL_FACE und GL_DEPTH_TEST sind schon disabled.
Gruß