gpt4 book ai didi

c++ - OpenGL glDrawArrays 比 glBegin 慢

转载 作者:太空宇宙 更新时间:2023-11-04 15:58:45 24 4
gpt4 key购买 nike

我一直在我的函数中使用 glDrawArrays。

由于某些原因,我在使用 glDrawArrays 绘图时掉了大约 400fps。

为了测试,我调用了 Print 函数 2000 次。

不太确定为什么,因为我认为 glDrawArrays 是执行此操作的方法?

这是打印函数:

void Font::Print(const char* Text, int x, int y)
{
int sLen, Loop;
int Row, Col;
float U, V, U1, V1;

CurX = x;
CurY = y;

sLen = (int)strnlen(Text, BFG_MAXSTRING);


#ifdef ARRAYDRAW
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
#else
glBegin(GL_QUADS);
#endif

for (Loop = 0; Loop != sLen; ++Loop)
{
Row = (Text[Loop] - Base) / RowPitch;
Col = (Text[Loop] - Base) - Row * RowPitch;

U = Col * ColFactor;
V = Row * RowFactor;
U1 = U + ColFactor;
V1 = V + RowFactor;

#ifdef ARRAYDRAW
Vertex vert[] = {
CurX, CurY,
U, V1,

CurX + CellX, CurY,
U1, V1,

CurX + CellX, CurY + CellY,
U1, V,

CurX, CurY + CellY,
U, V
};

glVertexPointer(2, GL_INT, sizeof(Vertex), &vert[0].x);
glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), &vert[0].u);
glDrawArrays(GL_QUADS, 0, 4);
#else
glTexCoord2f(U, V1); glVertex2i(CurX, CurY);
glTexCoord2f(U1, V1); glVertex2i(CurX + CellX, CurY);
glTexCoord2f(U1, V); glVertex2i(CurX + CellX, CurY + CellY);
glTexCoord2f(U, V); glVertex2i(CurX, CurY + CellY);
#endif


CurX += Width[Text[Loop]];
}

#ifdef ARRAYDRAW
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
#else
glEnd();
#endi

最佳答案

使用 OpenGL 的主要性能问题之一是 OpenGL 调用的数量。这就是 glDrawArrays 派上用场的地方:如果你正在渲染,比方说,一百万个三角形,那将是大约一百万次调用 glVertex 和类似的,但仍然只有几次调用使用 glDrawArrays

现在,在您的情况下,在循环内您只渲染一个四边形,两种方法的 OpenGL 调用次数大致相同。这就是您看不到性能提升的原因。

看起来你可以在没有任何循环的情况下做到这一点:

glVertexPointer(2, GL_INT, sizeof(Vertex), &vert[0].x);
glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), &vert[0].u);
glDrawArrays(GL_QUADS, 0, 4 * sLen); // <-- note

因此一次渲染所有四边形。我希望它的性能更高。

更好的方法(实践中实际使用的方法)是使用 VBO's ,因此只在 GPU 上复制顶点数据一次,然后使用它。

关于c++ - OpenGL glDrawArrays 比 glBegin 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49656061/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com