Zet*_*eto 6 opengl rendering opengl-es directx-11 batching
我正在我的游戏引擎中使用自动OpenGL批处理方法,以减少绘制调用和冗余调用.
我的批处理树设计从最昂贵的状态开始,并为每个较便宜的状态添加叶子.
示例:树根:着色器/程序兄弟:混合状态... aso
所以我的问题是这个列表中最有可能是最昂贵的电话:
还想知道哪种方法会更快:
- 将所有可处理的绘制命令收集到单个顶点缓冲区并仅调用1个绘制调用(此方法也会强制更新cpu侧每个顶点的矩阵变换)
- 不要批处理并渲染很多小绘制调用,只有批处理粒子系统......
PS:渲染目标将始终更改为Pre或Post,具体取决于使用情况.
迄今取得的进展:
1:帧缓冲状态
2:程序
3:纹理绑定
...
N:顶点数组绑定,统一绑定
WebGL中的当前执行树:
每个步骤都是一个兄弟哈希树,以避免再次检查主渲染队列中的状态缓存
加载纹理/程序/着色器/缓冲区在渲染到额外队列之前发生,以便将来进行多线程处理,并确保在对其执行任何操作之前初始化上下文.
自渲染对象的最大问题是你无法控制什么时候发生的事情,例如如果开发人员在gl初始化之前调用这些方法,他就不知道为什么会有一些错误或问题...
此类操作的相对成本当然取决于使用模式和您的一般情况.但是你可能会发现Nvidia的"Beoynd Porting"演示幻灯片作为一个有用的指南.让我在这里重现幻灯片48:
国家相对成本变化
- 降低成本......
- 渲染目标~60K/s
- 程序~300K/s
- ROP
- 纹理绑定~1.5M/s
- 顶点格式
- UBO绑定
- 统一更新~10M/s
这不会直接匹配列表中的所有项目符号.例如glEnable/glDisable可能影响任何事情 GL的缓冲区绑定也不是GPU直接看到的.当然,缓冲区绑定主要是客户端状态,具体取决于目标.混合状态的改变将是ROP状态改变,等等.
| 归档时间: |
|
| 查看次数: |
1560 次 |
| 最近记录: |