3
我一直在關注html5rocks的一些教程,並且我設法制作了一個javascript程序,它使用webGL在畫布上顯示ONE圖像。我已經發布了下面的代碼。在WebGL中繪製多個2D圖像
問題是,似乎沒有人向您展示如何在webGL中繪製多個對象。我從來沒有直接使用過webGL,所以對我來說不是很直觀。
如何修改此代碼以繪製imageObjectArray
中的每個對象? (請注意,我現在只是畫imageObjectArray[0]
。
function render(canvas, contextGL, imageObjectArray) {
vertexShader = createShaderFromScriptElement(contextGL, "2d-vertex-shader");
fragmentShader = createShaderFromScriptElement(contextGL, "2d-fragment-shader");
program = createProgram(contextGL, [vertexShader, fragmentShader]);
contextGL.useProgram(program);
var positionLocation = contextGL.getAttribLocation(program, "a_position");
var texCoordLocation = contextGL.getAttribLocation(program, "a_texCoord");
var texCoordBuffer = contextGL.createBuffer();
contextGL.bindBuffer(contextGL.ARRAY_BUFFER, texCoordBuffer);
contextGL.enableVertexAttribArray(texCoordLocation);
contextGL.vertexAttribPointer(texCoordLocation, 2, contextGL.FLOAT, false, 0, 0);
setRectangle(contextGL, 0.0, 0.0, 1.0, 1.0);
var texture = contextGL.createTexture();
contextGL.bindTexture(contextGL.TEXTURE_2D, texture);
contextGL.texParameteri(contextGL.TEXTURE_2D, contextGL.TEXTURE_WRAP_S, contextGL.CLAMP_TO_EDGE);
contextGL.texParameteri(contextGL.TEXTURE_2D, contextGL.TEXTURE_WRAP_T, contextGL.CLAMP_TO_EDGE);
contextGL.texParameteri(contextGL.TEXTURE_2D, contextGL.TEXTURE_MIN_FILTER, contextGL.NEAREST);
contextGL.texParameteri(contextGL.TEXTURE_2D, contextGL.TEXTURE_MAG_FILTER, contextGL.NEAREST);
contextGL.texImage2D(contextGL.TEXTURE_2D, 0, contextGL.RGBA, contextGL.RGBA, contextGL.UNSIGNED_BYTE, imageObjectArray[0].displayObject.data);
var resolutionLocation = contextGL.getUniformLocation(program, "u_resolution");
contextGL.uniform2f(resolutionLocation, canvas.width, canvas.height);
var buffer = contextGL.createBuffer();
contextGL.bindBuffer(contextGL.ARRAY_BUFFER, buffer);
contextGL.enableVertexAttribArray(positionLocation);
contextGL.vertexAttribPointer(positionLocation, 2, contextGL.FLOAT, false, 0, 0);
setRectangle(contextGL, imageObjectArray[0].x, imageObjectArray[0].y, imageObjectArray[0].width, imageObjectArray[0].height);
// draw
contextGL.drawArrays(contextGL.TRIANGLES, 0, 6);
}
function setRectangle(gl, x, y, width, height) {
var x2 = x + width;
var y2 = y + height;
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(
[x, y,
x2, y,
x, y2,
x, y2,
x2, y,
x2, y2
]), gl.STATIC_DRAW);
}
我在這裏的目的是要在(非常基本的)2D精靈的遊戲工作。如果沒有庫的舒適性。(除也許glMatrix.js)
[編輯]我的渲染功能有在它的錯誤,固定
由於爲偉大的解釋!但是,你說:「你需要將步驟2分成不同的步驟。第一步,創建位置的頂點緩衝區,應該只執行一次」 - 你一次意味着什麼?我不是應該爲每個圖像執行整個第2步嗎? – Spectraljump
你想將'var buffer = contextGL.createBuffer();'移出循環,其餘的依然存在。 – Cutch
不要讓它更混亂,但另一種做法是在步驟2中創建一個單位矩形,並添加一些制服(如矩陣)以將該單位矩陣平移,縮放並旋轉到要繪製圖像的大小和位置。哪個更快或更好,更新每個圖像的緩衝區或爲每個圖像計算不同的矩陣,我不知道。 – gman