- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 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);
与使用如下所示的 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);
请注意...我不关心下面的代码有什么问题。同样,我只想知道是否确实存在性能差异,为什么?这两种方法的底层原理是什么?为什么一个会比另一个更快/更慢?转换也是如此。为什么在顶点着色器中使用 uniform 会比使用 glMultMatrix 更快?
最佳答案
在至少一半最近的任何 GPU 上,对于这两种情况,GPU 最终执行的内容基本相同。我认为在相当长的一段时间内,没有人构建出真正具有固定管道专用硬件的 GPU。对于桌面 GPU,我相信这种转变发生在大约 10 多年前(在此之前的几年,它们已经是可编程的,但仍然具有固定功能的硬件)。对于移动 GPU,向纯可编程 GPU 的过渡发生得较晚,但也发生在很久以前。
如果您使用固定管道,驱动程序会根据您设置的固定功能状态为您生成着色器代码。因此,您真正比较的是从传递给驱动程序的 GLSL 编译而来的着色器,以及驱动程序根据状态值生成的着色器。
显然,在这两种情况下,着色器都将在 GPU 上运行,因此除此之外并没有根本的区别。
现在,您可能会问:哪个更有效率?一般没法说。一些注意事项包括:
由驱动程序为固定功能状态生成的着色器可能具有优势,因为它们经过大量调整,很可能在着色器程序集中。这主要是针对工作站级 GPU 完成的,其中许多软件使用传统固定功能 OpenGL 的时间更长。
您用 GLSL 编写的着色器的优势在于它们完全您需要的,没有别的。因此,从这个意义上说,它们可能会更适合您的精确用例。当然,驱动程序从固定功能状态生成的相应着色器也可以高度精简,但这不在您的控制范围内。尤其是如果您关心各种平台上的性能,坦率地说,我不会相信所有 GPU 供应商都能为我生成高效的着色器代码。
当然,编写自己的着色器代码还有其他主要优势。它允许你做一些用固定管道根本不可能做的事情。即使在固定管道可以完成工作的地方,一旦掌握了编写 GLSL 代码的窍门,使用着色器通常也会更容易。
关于c++ - OpenGL 性能 : VBOs/Vertex shader vs. glEnableClientState/glVertexPointer 和 glMultMatrix 与 glUniformMatrix,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32974471/
我在使用 dijkstra 时遇到了这个错误:TypeError:不可排序的类型:Vertex() dijkstra(g, g.get_vertex('a')) File "C:/Use
我对为自定义类实现迭代器感到困惑。我正在尝试为 std::set 实现一个迭代器,其中我的 Vertex 类声明为: class Vertex{
我正在尝试学习和实现有向图,但在执行程序时遇到了一些困难。 // ADD Function public boolean addVertex(Vertex v) { boolean added
我是 OpenGL 的初学者,我试图每 5 秒将大量“对象”从一个位置移动到另一个位置。如果我在顶点着色器中计算位置,fps 急剧下降,难道不应该在 GPU 上完成这些类型的计算吗? 这是顶点着色器代
我正在学习使用 Boost 图形库。我已经按照此处的说明定义了一个自定义结构来存储有关顶点的信息:Modifying vertex properties in a Boost::Graph . str
我正在尝试使用 boost::adjacency list 和捆绑属性创建一个 TreeMap 来存储每个顶点的父级,我想以一种它们不会失效的方式存储顶点描述符以防万一我删除了一个顶点,所以我使用了
要定义一个从 int 到 struct vertex 的映射,我应该定义 map[int]vertex 还是 map[int]*vertex?首选哪一个? 我扩展了 Chickencha 的代码: p
我创建了一个 VBO(顶点缓冲区对象)和 VAO(顶点数组对象)并执行了以下操作: glBindVertexArray(vao); glBindBuffer(GL_ARRAY_BUFFER, vbo)
我用 HBase 设置了 Titan。 我删除图中的所有顶点 全部删除后显示为空。 gremlin> g.V.count() ==>0 但是如果我重新登录泰坦,那么图中会有一堆空顶点 gremlin>
我正在探索使用计算着色器将骨骼变形应用于网格顶点,而不是使用流输出的顶点着色器。我发现计算着色器的执行速度比顶点着色器慢得多,但在我把它写下来之前,我想确定我没有做错什么。 使用我的 100,000
这里我有一个有向图G,我需要判断是否存在一组顶点不相交的循环,以便每个顶点都属于一个循环。 我不确定这是否可以在多项式时间内完成或者它是否是 NP-Complete?谁能至少指出我正确的方向? 最佳答
要检测一个点是否在多边形中,您可以从该点到无穷远投影一条线,然后查看它与多少个多边形顶点相交......足够简单。我的问题是,如果射线在其中一个点上与多边形相交,则将其视为与两个线段相交,并被视为在多
我在 VehicleHistoryGraph 数据库中创建了一个 Message 类型的顶点,并向其中加载了 50,000 个该类型的顶点。 当我尝试使用此 SQL 语句一次删除所有顶点时 - DEL
所以我正在尝试将 Graph 类作为另一个项目的一部分。顶点存储在由 unordered_map 定义的邻接表中。我正在尝试创建一个散列函数以允许我的 Vertex 类存储在此 map 中,但我不知道
我正在尝试使用 Parma Polyhedra 库 [1]枚举(凸)多面体的顶点,例如,我有一个由四个约束指定的矩形: Constraint_System cs; cs.insert(x >= 0);
我开始了解 Visual Studio 2017 中的 OpenGL。按照 www.learnopengl.com 教程并通过了纹理检查点,转换是目前的主要问题。 我使用预先获取的统一位置 ID 将我
有一个预定的笔记本,它使用 BigQuery 客户端和具有所有者权限的服务帐户。当我手动运行单元格时,它会更新 BQ 表。 BQ 和 Vertex AI 都有一个项目。 我发现了一个类似的问题,但是
我在 R 中使用 Igraph 包,当我通过 V(graph) 访问顶点名称列表时,我得到以下结果: Vertex sequence: [1] "d66cp96igcdnt25brjeics9d11
我有一个 U-SQL 脚本,它在数据湖中存储的多个 JSON 文件上运行,当我针对单个文件运行该脚本时,一切正常,但是打开它以针对我的所有文件运行每次都会出现以下错误,并且作业永远不会超过“准备”阶段
我正在尝试实现 phong 阴影,但无济于事。我正在一点一点地构建着色器(这本身可能是一个问题),但这就是我目前所处的位置。我希望它将我的结果(犹他茶壶)输出为黑色背景上的白色图像。当我从顶点着色器中
我是一名优秀的程序员,十分优秀!