gpt4 book ai didi

opengl - "immediate mode"在OpenGL中是什么意思?

转载 作者:行者123 更新时间:2023-12-03 05:18:10 28 4
gpt4 key购买 nike

什么是“立即模式”?给出一个代码示例。

什么时候必须使用立即模式而不是保留模式?使用每种方法的优点和缺点是什么?

最佳答案

“立即模式”的一个示例是使用 glBeginglEndglVertex在他们之间。 “立即模式”的另一个例子是使用 glDrawArrays带有客户端顶点数组(即不是顶点缓冲区对象)。

您通常永远不想使用立即模式(可能除了您的第一个“hello world”程序),因为它是已弃用的功能并且无法提供最佳性能。

立即模式不是最佳的原因是显卡与程序流程直接链接。驱动程序无法告诉 GPU 在 glEnd 之前开始渲染,因为它不知道您何时完成提交数据,并且它也需要传输该数据(它只能glEnd 之后执行)。
同样,对于客户端顶点数组,驱动程序只能在您调用 glDrawArrays 时提取数组的副本。 ,并且这样做时它必须阻止您的应用程序。原因是否则您可以在驱动程序捕获数组内存之前修改(或释放)数组内存。它无法提前或推迟该操作,因为它只知道数据在某一时间点准确有效。

与此相反,如果您使用顶点缓冲区对象,则可以用数据填充缓冲区并将其交给 OpenGL。您的进程不再拥有该数据,因此无法再修改它。司机可以依赖这一事实,并且可以(甚至推测)在公交车空闲时上传数据。
您以后的任何一个glDrawArraysglDrawElements调用只会进入工作队列并立即返回(在实际完成之前!),因此您的程序会不断提交命令,同时驱动程序会一一完成。他们也可能不需要等待数据到达,因为驱动程序已经可以更早地做到这一点。
因此,渲染线程和GPU异步运行,每个组件始终处于繁忙状态,从而产生更好的性能。

立即模式确实具有使用起来非常简单的优点,但话又说回来,以一种不弃用的方式正确使用 OpenGL 也不是精确的火箭科学——它只需要很少的额外工作。

下面是立即模式下典型的 OpenGL“Hello World”代码:

glBegin(GL_TRIANGLES);
glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(0.0f, 1.0f);
glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(0.87f, -0.5f);
glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(-0.87f, -0.5f);
glEnd();

编辑:
根据常见要求,保留模式下的相同内容看起来有点像这样:

float verts = {...};
float colors = {...};
static_assert(sizeof(verts) == sizeof(colors), "");

// not really needed for this example, but mandatory in core profile after GL 3.2
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

GLuint buf[2];
glGenBuffers(2, buf);

// assuming a layout(location = 0) for position and
// layout(location = 1) for color in the vertex shader

// vertex positions
glBindBuffer(GL_ARRAY_BUFFER, buf[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

// copy/paste for color... same code as above. A real, non-trivial program would
// normally use a single buffer for both -- usually with stride (5th param) to
// glVertexAttribPointer -- that presumes interleaving the verts and colors arrays.
// It's somewhat uglier but has better cache performance (ugly does however not
// matter for a real program, since data is loaded from a modelling-tool generated
// binary file anyway).
glBindBuffer(GL_ARRAY_BUFFER, buf[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);

glDrawArrays(GL_TRIANGLES, 0, 3);

关于opengl - "immediate mode"在OpenGL中是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6733934/

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