如何仅推/弹出上下文';s 2d/3d转换,而不是完整的上下文?

如何仅推/弹出上下文';s 2d/3d转换,而不是完整的上下文?,3d,html5-canvas,webgl,3d,Html5 Canvas,Webgl,到目前为止,我只使用 var context = canvas.getContext('2d'); 但在将来的某个时候,我也会使用3d,所以我会寻求更多的理解来做好准备 OpenGL中的glPushMatrix()调用非常便宜,标准做法是使用glPushMatrix()-glPopMatrix()将代码段括起来,但代价很小 我把这个习惯带到画布中的2d上下文中,并用一对context.save()-context.restore(),包装代码块,但这样做至少有一个严重的问题。最简单的解决方案是

到目前为止,我只使用

var context = canvas.getContext('2d');
但在将来的某个时候,我也会使用3d,所以我会寻求更多的理解来做好准备

OpenGL中的
glPushMatrix()
调用非常便宜,标准做法是使用
glPushMatrix()
-
glPopMatrix()
将代码段括起来,但代价很小

我把这个习惯带到画布中的2d上下文中,并用一对
context.save()
-
context.restore()
,包装代码块,但这样做至少有一个严重的问题。最简单的解决方案是避免这种做法,只需显式地设置转换

这在2d中不会太糟糕,但会与标准3d编码的纹理背道而驰。所以我想知道:

  • 是否可以只推/弹出上下文的2d转换
  • 是否可以只推/弹出上下文的3d转换

glPushMatrix
glPopMatrix
已经有25年的历史了,早就不推荐使用了

是的,你在很多OpenGL示例中都看到了它们,它们被认为是旧的坏习惯

WebGL基于现代OpenGL实践。因此,它只是一个光栅化API,不包括
glPushMatrix
glPopMatrix
。相反,它只提供着色器,由您自己提供数学库

所以

是否可以只推/弹出上下文的2d转换

是,
context.save
context.restore
执行此操作。它们还保存和恢复上下文的所有其他状态,如当前的
填充样式
笔划样式
线宽
全局合成操作
,等等

如果您只想保存/恢复转换本身,答案是不,它不是内置的,但是您可以自己实现它。其要点是而不是提供更快的保存/恢复。这一点只是为了提供当前转换,因为
canvasrrenderingcontext2d
api不提供查询当前转换的方法,如果某些应用程序想要执行冲突检测或其他操作,则需要该方法

使用类似的代码,您可以轻松地提供仅转换的推送和弹出。由于它必须用JavaScript对所有转换命令(例如:
translate
rotate
scale
)进行矩阵运算,因此它是否会带来净速度的提高尚不清楚

是否可以只推/弹出上下文的3d转换

WebGL中没有这样的东西。如果你想写你自己的数学库,并添加一个推和弹出到它或找到一个已经有这个功能。无论你认为答案是“否”(在WebGL中没有这样的事情)或是(你可以自己实现),都取决于你。