相关疑难解决方法(0)

OpenGL状态冗余消除树,呈现状态优先级

我正在我的游戏引擎中使用自动OpenGL批处理方法,以减少绘制调用和冗余调用.

我的批处理树设计从最昂贵的状态开始,并为每个较便宜的状态添加叶子.

示例:树根:着色器/程序兄弟:混合状态... aso

所以我的问题是这个列表中最有可能是最昂贵的电话:

  • 约束计划
  • 绑定纹理
  • 绑定缓冲区
  • 缓冲纹理,顶点数据
  • 绑定渲染目标
  • glEnable/glDisable
  • 混合状态方程,颜色,函数,colorWriteMask
  • 深度模板状态depthFunc,stencilOperations,stencilFunction,writeMasks

还想知道哪种方法会更快:
- 将所有可处理的绘制命令收集到单个顶点缓冲区并仅调用1个绘制调用(此方法也会强制更新cpu侧每个顶点的矩阵变换)
- 不要批处理并渲染很多小绘制调用,只有批处理粒子系统......

PS:渲染目标将始终更改为Pre或Post,具体取决于使用情况.

迄今取得的进展:

  • Andon M. Coleman:最便宜的均匀和顶点阵列绑定,昂贵的FBO,纹理绑定
  • datenwolf:程序使State Cache无效

1:帧缓冲状态
2:程序
3:纹理绑定
...
N:顶点数组绑定,统一绑定

WebGL中的当前执行树:

  • 程序
  • 属性指针
  • 质地
  • 混合状态
  • 深度国家
  • 模具前/后状态
  • 光栅化州
  • 采样器状态
  • 绑定缓冲区
  • 绘制数组

每个步骤都是一个兄弟哈希树,以避免再次检查主渲染队列中的状态缓存

加载纹理/程序/着色器/缓冲区在渲染到额外队列之前发生,以便将来进行多线程处理,并确保在对其执行任何操作之前初始化上下文.

自渲染对象的最大问题是你无法控制什么时候发生的事情,例如如果开发人员在gl初始化之前调用这些方法,他就不知道为什么会有一些错误或问题...

opengl rendering opengl-es directx-11 batching

6
推荐指数
1
解决办法
1560
查看次数

标签 统计

batching ×1

directx-11 ×1

opengl ×1

opengl-es ×1

rendering ×1