1 回答
TA贡献1725条经验 获得超7个赞
因为 API 才是唯一真正的答案。
许多人都同意你的观点,认为不同的 API 会更好。这是出现新 api(DirectX11/12、Vulkan、Metal、WebGPU)的原因之一
但问题中的描述在技术上不正确
我们通过 JS 在 RAM 上创建一个浮点数组。
WebGL 创建一个代表 GPU 缓冲区的对象(GPU 上未分配任何内容)
将缓冲区上的指针设置为 gl.ARRAY_BUFFER。
现在我们分配一个缓冲区并将数据从 RAM 复制到 GPU 缓冲区。
从 gl.ARRAY_BUFFER 取消绑定缓冲区(但该缓冲区在 GPU 上仍然可用,我们可以多次重新绑定它)。
不需要第 5 步。没有理由解除缓冲区的绑定。
你可以这样想。想象一下,您有一个 javascript 函数,可以将图像绘制到画布上,但图像的传递方式与示例中的缓冲区相同。这是代码
class Context {
constructor(canvas) {
this.ctx = canvas.getContext('2d');
}
bindImage(img) {
this.img = img;
}
drawImage(x, y) {
this.ctx.drawImage(this.img, x, y);
}
}
假设您想绘制 3 张图像
const ctx = new Context(someCanvas);
ctx.bindImage(image1);
ctx.drawImage(0, 0);
ctx.bindImage(image2);
ctx.drawImage(10, 10);
ctx.bindImage(image3);
ctx.drawImage(20, 20);
会工作得很好。没有理由这样做
const ctx = new Context(someCanvas);
ctx.bindImage(image1);
ctx.drawImage(0, 0);
ctx.bindImage(null); // not needed
ctx.bindImage(image2);
ctx.drawImage(10, 10);
ctx.bindImage(null); // not needed
ctx.bindImage(image3);
ctx.drawImage(20, 20);
ctx.bindImage(null); // not needed
WebGL 中也是如此。有时会将 null 绑定到某些东西,例如
gl.bindFramebuffer(gl.FRAMEBUFFER, null); // start drawing to the canvas
但大多数时候解除绑定只是程序员的个人喜好,而不是 API 本身所要求的
添加回答
举报