【发布时间】:2015-10-07 13:10:40
【问题描述】:
我对 OpenGL 相当陌生。我刚开始学习着色器,尤其是顶点和片段着色器。我的理解是,当通过着色器完成操作时,您可以获得相当显着的性能提升,因为着色器在 GPU 上运行。
但是,我已经尝试对这个主题进行一些研究,并且我似乎发现了一些关于这个问题的不同意见,至少在顶点着色器方面是这样。
渲染如下对象与使用 glMultMatrixd 之类的调用进行转换之间的主要区别是什么:
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, &vertices[0]);
glNormalPointer(GL_FLOAT, 0, &normals[0]);
glDrawArrays(GL_TRIANGLES, 0, vertices.size() / 3);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
vs 使用如下所示的 VAO/VBO 设置,我将转换矩阵设置为着色器中的统一变量并在那里进行转换。
glBindVertexArray(vaoHandle);
glBindBuffer(GL_ARRAY_BUFFER, bufferHandle[0]);
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(float), vertices.data(), GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, bufferHandle[1]);
glBufferData(GL_ARRAY_BUFFER, normals.size() * sizeof(float), normals.data(), GL_STATIC_DRAW);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(1);
.....
glBindVertexArray(vaoHandle);
glDrawArrays(GL_TRIANGLES, 0, vertices.size() / 3);
请注意...我不在乎下面的代码有什么问题。同样,我只是想知道实际上是否存在性能差异,为什么?这两种方法的引擎盖下发生了什么?为什么一个会比另一个更快/更慢?转换也是如此。为什么使用统一的顶点着色器比使用 glMultMatrix 更快?
【问题讨论】:
标签: c++ performance opengl graphics glsl