1
我想繪製一堆四邊形。使用std :: vector作爲頂點/元素列表與OpenGL
現在我有一個問題;繪圖工作正常,速度很快,但我使用std :: vector作爲我的四邊形容器,他們真的很慢。來自XNA我想我應該創建類似spriteBatch的東西,以便我可以調用DrawQuad()將給定的四元組添加到列表中,最後調用End()來繪製每個四元組。
我當前的代碼通常打印這樣的控制檯:
DrawQuad(): 77
End(): 0
一遍又一遍。
Main.cpp的(SF ::時鐘是SFML時鐘類)
sf::Clock time;
for (int y = 0; y < 100; y++)
for (int x = 0; x < 100; x++)
renderer.DrawQuad("A", Vector2<GLfloat>(-1.0f + x * 0.02f, -1.0f + y * 0.02f));
std::cout << "DrawQuad(): " << time.getElapsedTime().asMilliseconds() << std::endl;
Renderer.cpp:
void TextRenderer::DrawQuad(string text, Vector2<GLfloat> position)
{
//TOP LEFT
vertexBufferVector.push_back(position.X);
vertexBufferVector.push_back(position.Y);
//TOP RIGHT
vertexBufferVector.push_back(position.X + 0.02f);
vertexBufferVector.push_back(position.Y);
//BOTTOM RIGHT
vertexBufferVector.push_back(position.X + 0.02f);
vertexBufferVector.push_back(position.Y + 0.02f);
//BOTTOM LEFT
vertexBufferVector.push_back(position.X);
vertexBufferVector.push_back(position.Y + 0.02f);
int elementCount = elementBufferVector.size()/6;
elementBufferVector.push_back(elementCount * 4);
elementBufferVector.push_back(elementCount * 4 + 1);
elementBufferVector.push_back(elementCount * 4 + 2);
elementBufferVector.push_back(elementCount * 4 + 2);
elementBufferVector.push_back(elementCount * 4 + 3);
elementBufferVector.push_back(elementCount * 4);
}
void TextRenderer::End()
{
sf::Clock time;
GLfloat* vertexArray = &vertexBufferVector[0];
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * vertexBufferVector.size(), vertexArray, GL_STATIC_DRAW);
GLint* elementArray = &elementBufferVector[0];
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLint) * elementBufferVector.size(), elementArray, GL_STATIC_DRAW);
glDrawElements(GL_TRIANGLES, elementBufferVector.size(), GL_UNSIGNED_INT, 0);
vertexBufferVector.clear();
elementBufferVector.clear();
std::cout << "End(): " << time.getElapsedTime().asMilliseconds() << std::endl;
}
如何誰知道他們在做什麼的人解決這個問題? 10000四邊形真的不應該是一個問題。
寫這畢竟我也增加了從(100,100)的循環來(1000,100),而現在的繪圖需要4-5毫秒,是算好?我想不...
4ms約爲250 fps,是不是太慢了? – 2013-04-07 19:14:47
我應該評論給DrawQuad的「A」論點:起初我想製作一些可以繪製文字的東西,但是我從這開始,所以它就在那裏。 Roger:我不知道......這就是爲什麼我問。但是調用DrawQuad多次所需要的800ms太多了 – Semicolon 2013-04-07 19:15:37
對於100k四元組,4-5ms是可以的,因爲您正在爲每一幀重新創建頂點數組。 OpenGL應該有一種方法來創建一個靜態頂點緩衝區,只要不改變它的內容,它的運行速度會更快。 – riv 2013-04-07 19:24:16