我正在使用OpenGL ES2来渲染相当多的大多数2d项目,到目前为止,我已经通过将一个预乘的模型/视图/投影矩阵作为一个均匀的方式发送到顶点着色器,然后将我的顶点与结果相乘那里的MVP。
所有项目都使用纹理地图集进行批处理,每批使用一个MVP。所以我的所有顶点都与MVP的翻译有关。
现在我想为每个单独的项目进行旋转和缩放,这意味着我需要为每个项目设置不同的模型。所以我修改了我的顶点以包含模型(16个浮点数!)并在我的着色器中添加了mat4属性,这一切都运行良好。但我对此解决方案感到失望,因为它大大增加了顶点大小。
因为当我盯着我的屏幕试图想出一个不同的解决方案时,我想到在将它们发送到着色器之前将顶点转换为世界空间。如果可能,甚至可以筛选空间。我使用的顶点是像素化的非标准化坐标。
所以问题是,这样的事情可能吗?如果是,你怎么做?我想不出为什么它不应该是因为它只是数学,但经过相当长时间的谷歌搜索,它看起来并不像很多人实际上这样做...
奇怪的是,如果确实可能的话,在这样的情况下这将是一个非常重要的优化。
答案 0 :(得分:0)
如果每批次的矩阵数量有限,那么您可以将所有这些矩阵作为制服传递(最好是在UBO中),并使用索引扩展顶点数据,该索引指定您需要使用哪个矩阵。
这与用于skeletal animation的GPU皮肤类似。