亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么我們應該在將一些數據放入該緩沖區之前調用 webgl.bindBuffer ?

為什么我們應該在將一些數據放入該緩沖區之前調用 webgl.bindBuffer ?

慕婉清6462132 2023-07-14 10:19:14
我試圖弄清楚緩沖區在 WebGL 中到底是如何工作的,但我有點卡住了。以下是我的猜測 - 請確認或否認。const positions = new Float32Array([ -1, 1, -0.5, 0, -0.25, 0.25,]);let buffer = gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER, buffer);gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);gl.bindBuffer(gl.ARRAY_BUFFER, null);我們通過 JS 在 RAM 上創建一個浮點數組。WebGL 直接在 GPU 上創建一個空緩沖區,并將該緩沖區的引用返回給 JS?,F在變量buffer是一個指針。將緩沖區上的指針設置為gl.ARRAY_BUFFER?,F在我們將數據從 RAM復制到 GPU 緩沖區。取消綁定緩沖區gl.ARRAY_BUFFER(但緩沖區在 GPU 上仍然可用,我們可以多次重新綁定它)。那么為什么我們不能只調用createBuffer()withpositions而不是 usingARRAY_BUFFER作為 JS 和 GPU 之間的橋梁呢?這些只是 OpenGL API 的限制還是我們有充分的理由不這樣做?如果我錯了,請糾正我,但是分配已知大小的內存比分配一些內存并positions在調用后重新分配大小要快bufferData。
查看完整描述

1 回答

?
qq_遁去的一_1

TA貢獻1725條經驗 獲得超8個贊

因為 API 才是唯一真正的答案。

許多人都同意你的觀點,認為不同的 API 會更好。這是出現新 api(DirectX11/12、Vulkan、Metal、WebGPU)的原因之一

但問題中的描述在技術上不正確

  1. 我們通過 JS 在 RAM 上創建一個浮點數組。

  2. WebGL 創建一個代表 GPU 緩沖區的對象(GPU 上未分配任何內容)

  3. 將緩沖區上的指針設置為 gl.ARRAY_BUFFER。

  4. 現在我們分配一個緩沖區并將數據從 RAM 復制到 GPU 緩沖區。

  5. 從 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 本身所要求的


查看完整回答
反對 回復 2023-07-14
  • 1 回答
  • 0 關注
  • 93 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號