- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 OpenGL ES 的新手,我正在编写一个 iPad 应用程序,它需要我加载一个 Wavefront Obj 文件,然后在 OpenGL 中绘制它们。我的问题是关于呈现 Obj 文件组的最有效方式。
关于我所拥有的一些背景知识。 Obj 模型的所有解析/加载都在工作(我使用 GLM 加载文件),因此繁琐的事情不在话下。对于基础项目,我在 XCode 中扩展了 OpenGL ES 游戏模板,并删除了对着色器的所有调用。我正在为我的着色器使用 GLKit 的 BaseEffect,并使用 VAO 和 VBO 加载我所有的顶点数据。对于具有 16 个组的模型,在初始时间我将每个组分成一个 VAO,每个 VAO 都有一个用于顶点数据和法线(交错)的 VBO,以及一个用于纹理坐标的第二个 VBO。每个组都有一种 Material (有时是一种纹理,但为了问题的缘故只假设 Material )。
在我的渲染例程(下面的伪代码)中,我循环遍历为每个组创建的所有 VAO,将组的 Material 应用到 BaseEffect,然后使用 DrawArrays 绘制它(不使用 DrawElements 因为我已经设置 VBO 以便数据已经按索引顺序排列,尽管它可能不如在图形内存上高效)。这行得通,我可以用不同的 Material 绘制每个模型,但随着组数的增加,我的帧率下降,因为我必须花更多的时间在我的渲染函数中循环遍历每个组。对于较少的模型数量,这很好,但随着我向应用程序添加更多模型,帧速率远低于 30fps,这是我的基准。
for (groups in model)
{
Bind VAO for this group
Apply Material or Texture (if one exists) for this group using GLKBaseEffect
Call PrepareToDraw for GLKBaseEffect
DrawArrays passing it the vertex count for this group
glBindVertexArray(0)
}
显而易见的答案是简化模型以减少组数,但我很好奇渲染例程是否有任何改进可以让我做同样的事情但减少 Draw 调用。我仍然希望有一个详细的 obj 文件,但也希望有最高效的渲染。
这是绘制 obj 文件的最佳方法吗?我必须为文件中的每个组使用多种 Material /纹理,或者有没有一种方法可以在不遍历每个组并单独绘制它们的情况下完成?我希望能够让每个 obj 模型只有 1 次调用 DrawArrays/DrawElements,但我不知道如何做到这一点并且仍然对对象应用多种 Material /纹理。我一直在看这段代码并想“必须有更好的方法”,但我不确定那是什么。如果我遗漏了一个明显的难题,或者如果您有任何建议可以优化它,我将永远感激不已。
最佳答案
我认为您的想法非常正确。您实际上一次只能有一组纹理或一个着色器处于事件状态,因此您必须绘制模型中使用该状态的部分,切换状态,然后绘制下一组。
如果您的性能随着您添加更多模型而下降,您可以尝试对您的组进行排序,以便在不切换的情况下连续绘制所有具有相同状态的组。
因此,如果您要绘制 100 个模型副本,并且模型具有 A、B 和 C 三组:那么不要这样做:
foreach(model)
set state A;
glDrawArrays(A);
set state B;
glDrawArrays(B);
set state C;
glDrawArrays(C);
你应该这样做:
sort models into groups;
foreach(group)
set state
foreach(instance of group)
glDrawArrays
这为您节省了大约 99% 的状态转换(着色器切换、纹理绑定(bind)等)。这将是一个很大的性能改进。
关于opengl-es - 在 OpenGL ES 中渲染对象组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11216721/
在我的 OpenGL 程序中,我按顺序执行以下操作: // Drawing filled polyhedrons // Drawing points using GL_POINTS // Displa
我想传递一个包含原始页面的局部变量,这个变量只包含一个带有值的符号。 当我使用此代码时,它运行良好,可以在部分中访问 origin 变量: render :partial => "products",
为什么这个 HTML/脚本(来自“JavaScript Ninja 的 secret ”)不渲染? http://jsfiddle.net/BCL54/
我想在阅读完 View 后返回到特定的网页位置(跳转到页内 anchor )。换句话说,在 views.py 中,我想做类似的事情: context={'form':my_form} return r
我有一个包含单条折线的 PathGeometry,并以固定的间隔向该线添加一个新点(以绘制波形)。使用 Perforator 工具时,我可以看到每次向直线添加一个点时,WPF 都会将整个 PathGe
尝试了解如何消除或最小化网站上不同 JavaScript 库的渲染延迟。 例如,如果我想加载来自许多社交网络的“即时”关注按钮,它们似乎会相互阻止渲染,并且您会收到令人不快的弹出窗口。 (func
我有以 xyz 点格式表示 3D 表面(即地震断层平面)的数据。我想创建这些表面的 3D 表示。我使用 rgl 和 akima 取得了一些成功,但是它无法真正处理可能会自行折叠或在同一 x,y 点具有
我正在用 Libgdx 编写一个小游戏。 我有一个 Render[OpenGL] 线程,它不断对所有对象调用 render() 和一个更新线程不断对所有对象调用 update(double delta
我有一个 .Rmd 文件包含: ```{r, echo=FALSE, message=FALSE, results='asis'} library(xtable) print(xtable(group
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
请不要评判我,我只是在学习 Swift。 最近我安装了 MetalPetal 框架,并按照说明操作: https://github.com/MetalPetal/MetalPetal#example-
如果您尝试渲染 Canvas 宽度和高度之外的图像,计算机是否仍会尝试渲染它并使用资源来尝试渲染它?我只是想找出在尝试渲染图像之前检查图像是否在 Canvas 内是否更好。 最佳答案 我相信它仍然在无
我在 safari 中渲染时遇到问题。 在 firefox、chrome 和 IE 上。如下图所示: input.searchbox{-webkit-border-radius:10px;-moz-b
我正在尝试通过远程桌面在 Windows7 下运行我在 RHEL7 服务器中制作的 java 程序。 服务器中的所有java程序都无法通过远程桌面呈现。如果我在服务器位置访问服务器本身,它们看起来没问
我正处于一个新项目的设计阶段,该项目将采用数据集并将其加载到文档中,然后围绕模板呈现文档。呈现的文件可以是 CSV 数据集、PDF 营销信函、电子邮件……很多东西。数据不会是数学方程式,我只是在寻找一
有没有办法在不同的 div 下渲染 React 组件的子组件? ... ... ... ... ...
使用以下代码: import numpy as np from plotly.offline import iplot, init_notebook_mode import plotly.graph_
截至最近, meteor 的所有文档都指出 onRendered是一种在模板完成渲染时获取回调的新方法。和 rendered只是为了向后兼容。 但是,这似乎对我不起作用。 onRendered永远不会
所以在我的基本模板中,我有:{% render "EcsCrmBundle:Module:checkClock" %} 然后我创建了 ModuleController.php ... getDoctr
我正在使用 vue-mathjax 来编译我的 vue 项目中的数学方程。它正在编译第一个括号 () 之间的文本。我想防止编译括号内的字符串。在文档中我发现,对于$符号,如果我们想逃避编译,我们需要使
我是一名优秀的程序员,十分优秀!