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



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

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

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

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

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

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

//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 上应用。这最大限度地减少了需要在 CPU<->GPU 总线上传递的数据量(虽然这通常不是图形的限制,但可以考虑在内(,并且在读取/解析代码方面通常是最干净的。

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

最新更新