在 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 上计算?的主要内容,如果未能解决你的问题,请参考以下文章