在 openGL 中,模型坐标应该在我的 CPU 上还是通过 OpenGL 调用在 GPU 上计算?

Posted

技术标签:

【中文标题】在 openGL 中,模型坐标应该在我的 CPU 上还是通过 OpenGL 调用在 GPU 上计算?【英文标题】:In openGL should model coordinates be calculated on my CPU or on the GPU with OpenGL calls? 【发布时间】:2017-08-10 21:30:44 【问题描述】:

我目前正在尝试了解 openGL。我对矩阵转换背后的数学有很好的理解。 所以我想编写一个小型 3D 应用程序,我可以在其中渲染很多很多顶点。会有不同的对象,每个对象都有自己的一组顶点和世界坐标。

要获得我的顶点的实际坐标,我需要将它们乘以与我的对象的位置/旋转相对应的变换矩阵。

这是我的问题,我不明白在 OpenGL 中如何通过 GPU 对所有这些顶点进行这些转换。根据我的理解,它会快得多,但我似乎不明白该怎么做。

或者我应该使用 CPU 计算每个坐标并使用 openGL 绘制转换后的顶点?

【问题讨论】:

通常情况下,您为 OpenGL 提供矩阵(在 CPU 上相乘),OpenGL 将处理通过这些矩阵(模型、视图、投影)放置顶点,因此它们最终位于屏幕空间中(我相信这是在 GPU 上完成的)。您可以在着色器(也在 GPU 上)中进行顶点 MVP 乘法以获得更多控制。我没有给出这个答案,因为我不知道它是如何完成的。 【参考方案1】:

有几种不同的方法可以解决这个问题,具体取决于您的具体情况。

人们使用的主要绘图模型如下所示:(我不打算检查确切的语法,但我很确定这是正确的)

//Host Code, draw loop
for(Drawable_Object const& object : objects) 
    glm::mat4 mvp;
    glm::projection = /*...*/;
    glm::view = /*...*/;
    glm::model = glm::translate(glm::mat4(1), object.position);//position might be vec3 or vec4
    mvp = projection * view * model;
    glUniformMatrix1fv(glGetUniformLocation(program, "mvp"), 1, false, glm::value_ptr(mvp));
    object.draw();//glDrawArrays, glDrawElements, etc...


//GLSL Vertex Shader
layout(location=0) in vec3 vertex;
uniform mat4 mvp;
/*...*/

void main() 
    gl_Position = mvp * vec4(vertex, 1);
    /*...*/

在此模型中,矩阵在主机上计算,然后应用到 GPU。这最大限度地减少了需要在 CPUGPU 总线上传递的数据量(虽然通常不是图形的限制,但需要牢记),并且是在读取/解析代码方面通常是最干净的。

您可以使用多种其他技术(并且,如果您进行实例化渲染,必须使用),但对于大多数应用程序,没有必要以任何重大方式偏离此模型.

【讨论】:

好吧,我想我高度误解了着色器的使用。在这种情况下,您有着色器,因此 GPU 上的程序将应用于顶点,并作为参数给他变换矩阵。所以它会将此变换应用于它遇到的所有顶点正确吗? @florentt 是的。我建议您找到比您正在使用的更好的 OpenGL 教程。我推荐this one。

以上是关于在 openGL 中,模型坐标应该在我的 CPU 上还是通过 OpenGL 调用在 GPU 上计算?的主要内容,如果未能解决你的问题,请参考以下文章

opengl 着色器坐标系

我的OpenGL学习进阶之旅OpenGL的坐标系的学习笔记

我的OpenGL学习进阶之旅OpenGL的坐标系的学习笔记

当涉及旋转时,将鼠标坐标转换为 OpenGL 中的模型坐标

消费者生产者模型中的双缓冲 OpenGL 对象

openGL中的坐标系