Spe*_*ump 4 javascript html5 canvas webgl
我一直在关注html5rocks的几个教程,我设法制作了一个javascript程序,它使用webGL在画布上显示一个图像.我在下面发布了我的代码.
问题是,似乎没有人向你展示如何在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);
}
Run Code Online (Sandbox Code Playgroud)
我的目标是开发一个(非常基本的)2d精灵游戏.没有图书馆的舒适.(除了glMatrix.js)
[编辑]我的渲染函数中有一个错误,已修复.
以下代码执行以下操作:
以上5个步骤只需要运行一次.
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);
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);
setRectangle(contextGL, 0.0, 0.0, 1.0, 1.0);
Run Code Online (Sandbox Code Playgroud)
其余代码必须为您要绘制的每个图像执行,并执行以下操作:
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);
您需要将步骤2分成不同的步骤.第一步,为posistions创建顶点缓冲区,只应执行一次.第二步,填充图像的位置,需要为您想要绘制的每个图像执行.
我应该说我的建议不会给出最佳实现,但它会让你绘制超过1个图像.为了达到最佳,你应该考虑做: