javascript - webgl2,不能一次打印多个对象
问题描述
我有 2 个函数,每个函数都绘制一个对象,在这两个函数中我都有这样的东西:
vao = gl.createVertexArray();
gl.bindVertexArray(vao);
let vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, flatten(positions), gl.STATIC_DRAW);
gl.vertexAttribPointer(0, 3, gl.FLOAT, gl.FALSE, 12, 0);
gl.enableVertexAttribArray(0);
当我调用函数时,
firstfunction();
secondfunction();
只打印第二个函数的对象,如何解决这个问题?在 html 文件中,对于 gl_position,我使用运算符“+”来打印不同的对象,对吗?
编辑:这是我的主要,js
"use strict";
let gl;
let vao;
let program;
let modelMatrix = mat4(1.0);
let viewMatrix = mat4(1.0);
let projectionMatrix = mat4(1.0);
let modelMatrix1 = mat4(1.0);
let vertexCounter =5700;
function createGeometry() {
let positions = [];
positions.push(vec3(-0.5,0, 0.5));
positions.push(vec3(0.5, 0, 0.5));
positions.push(vec3(0.5, 0, -0.5));
positions.push(vec3(-0.5, 0, 0.5));
positions.push(vec3(0.5, 0, -0.5));
positions.push(vec3(-0.5, 0, -0.5));
//triangle 1
positions.push(vec3(-0.5, 0, -0.5));
positions.push(vec3(0.5, 0, -0.5));
positions.push(vec3(0,-0.5, 0));
//triangle 2
positions.push(vec3(0.5, 0, -0.5));
positions.push(vec3(0.5, 0, 0.5));
positions.push(vec3(0, -0.5, 0));
//triangle 3
positions.push(vec3(-0.5, 0, -0.5));
positions.push(vec3(-0.5, 0, 0.5));
positions.push(vec3(0,-0.5, 0));
//triangle 4
positions.push(vec3(-0.5, 0, 0.5));
positions.push(vec3(0.5, 0, 0.5));
positions.push(vec3(0,-0.5, 0));
vao = gl.createVertexArray();
gl.bindVertexArray(vao);
let vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, flatten(positions), gl.STATIC_DRAW);
gl.vertexAttribPointer(0, 3, gl.FLOAT, gl.FALSE, 12, 0);
gl.enableVertexAttribArray(0);
// let colors = [];
// colors.push(vec3(1.0, 0.0, 0.0));
// colors.push(vec3(1.0, 0.0, 1.0));
// colors.push(vec3(1.0, 1.0, 0.0));
//let vboColor = gl.createBuffer();
//gl.bindBuffer(gl.ARRAY_BUFFER, vboColor);
//gl.bufferData(gl.ARRAY_BUFFER, flatten(colors), gl.STATIC_DRAW);
//gl.vertexAttribPointer(1, 3, gl.FLOAT, gl.FALSE, 12, 0);
//gl.enableVertexAttribArray(1);
}
function loadModel() {
let modelData = loadObj(teapotModel);
let meshData = loadMeshData(modelData[0], "Teapot");
let popositions = meshData.positions;
let normals = meshData.normals;
let colors = meshData.colors;
let vertexCounter = meshData.vertexCount;
vao = gl.createVertexArray();
gl.bindVertexArray(vao);
let vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, popositions, gl.STATIC_DRAW);
gl.vertexAttribPointer(1, 3, gl.FLOAT, gl.FALSE, 12, 0);
gl.enableVertexAttribArray(1);
//gl.bufferData(gl.ARRAY_BUFFER, flatten(normals), gl.STATIC_DRAW);
// gl.vertexAttribPointer(3, 3, gl.FLOAT, gl.FALSE, 12, 0);
// gl.enableVertexAttribArray(3);
let vboColor = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vboColor);
gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);
gl.vertexAttribPointer(2, 3, gl.FLOAT, gl.FALSE, 12, 0);
gl.enableVertexAttribArray(2);
}
function render(timestamp, previousTimestamp) {
let light = getLightPosition(); // vec3
let rotation = getRotation(); // vec3
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
gl.useProgram(program);
gl.uniformMatrix4fv(
gl.getUniformLocation(program, "u_projectionMatrix"),
gl.FALSE,
flatten(projectionMatrix));
// let offset = Math.cos(timestamp / 1000.0) * 2.0;
// let cameraPosition = vec3(offset, 2.0, 5.0);
// let targetPosition = vec3(0.0, 0.0, 0.0);
// let upVector = vec3(0.0, 1.0, 0.0);
// viewMatrix = lookAt(cameraPosition, targetPosition, upVector);
gl.uniformMatrix4fv(
gl.getUniformLocation(program, "u_viewMatrix"),
gl.FALSE,
flatten(viewMatrix));
//scale (2,1,2)
let t1 = mat4(2.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 2.0, 0.0,
0.0, 0.0, 0.0, 1.0);
let t2 = translate( 0.0, -0.5, 0.0 );
let changedmodelMatrix = mat4(1.0)
changedmodelMatrix =mult(t2,mult(t1,modelMatrix));
gl.uniformMatrix4fv(
gl.getUniformLocation(program, "u_model_matrix"),
gl.FALSE,
flatten(changedmodelMatrix));
//let popositions = meshData.positions;
//set matrix for teapotposition
// gl.uniformMatrix4fv(
// gl.getUniformLocation(program, "u_teapotposition"),
// gl.FALSE,
// flatten(popositions));
let t3 = translate(0.0, 0.5, 0.0);
let changedmodelMatrix1 = mat4(1.0);
changedmodelMatrix1 = mult(t3,modelMatrix1);
gl.uniformMatrix4fv(
gl.getUniformLocation(program, "u_model_matrix1"),
gl.FALSE,
flatten(changedmodelMatrix1));
gl.bindVertexArray(vao);
gl.drawArrays(gl.TRIANGLES, 0, 18); // pyramid
gl.bindVertexArray(vao);
gl.drawArrays(gl.TRIANGLES, 0, vertexCounter); //teapot
window.requestAnimFrame(function (time) {
render(time, timestamp);
});
}
window.onload = function init() {
let canvas = document.getElementById("rendering-surface");
gl = WebGLUtils.setupWebGL(canvas);
gl.viewport(0, 0, canvas.width, canvas.height);
gl.enable(gl.DEPTH_TEST);
gl.enable(gl.CULL_FACE);
gl.clearColor(0.0, 0.0, 0.0, 0.0);
createGeometry();
loadModel();
// Program.
program = initShaders(gl, "vertex-shader", "fragment-shader");
// Camera.
modelMatrix = mat4(1.0);
projectionMatrix = perspective(60.0, canvas.width / canvas.height, 0.1, 100.0);
let eyePos = vec3(0.75, 0.25, 3);
let lookAtPos = vec3(0.0, 0.0, 0.0);
let upVector = vec3(0.0, 1.0, 0.0);
viewMatrix = lookAt(eyePos, lookAtPos, upVector);
gl.bindVertexArray(vao);
// Render.
render(0, 0);
};
html:
<html>
<head>
<meta charset="UTF-8" />
<title>Introduction to WebGL</title>
<script type="x-shader/x-vertex" id="vertex-shader">#version 300 es
precision mediump float;
layout(location = 0) in vec3 a_position;
layout(location = 1) in vec4 a_teapotposition;
layout(location = 2) in vec3 a_teapotcolor;
uniform mat4 u_model_matrix;
uniform mat4 u_viewMatrix;
uniform mat4 u_projectionMatrix;
//uniform mat4 u_model_matrix1;
out vec3 v_teapotcolor;
void main() {
v_teapotcolor = a_teapotcolor;
gl_Position =
a_teapotposition +
u_projectionMatrix
* u_viewMatrix
* u_model_matrix
* vec4(a_position, 1.0)
;
}
</script>
<script type="x-shader/x-fragment" id="fragment-shader">#version 300 es
precision mediump float;
in vec3 v_teapotcolor;
out vec4 color;
void main() {
color = vec4(v_teapotcolor, 1.0 ) //*
//vec4(0.5,0.2,0.1, 1.0)
;
}
</script>
任何帮助表示赞赏。
解决方案
推荐阅读
- r - 计算 R 中观察到的月份数
- python - 在父类python selenium中导入方法
- date - 带日期的 Hive 查询
- regex - 如何使用正则表达式在 Bash 中查找递归子字符串?
- excel - 如何使用vba在excel的列中查找重复项,然后弹出一个Msgbox?
- c# - 使用 HTTP 部分内容播放 html 5 视频时,Chrome 会锁定 HTTP 端口
- chef-infra - 厨师刀命令:刀菜谱上传样本时出现错误
- java - 如何从其他类访问arrayLists(可能在其他包中)
- vba - 通过细胞矩阵选择细胞
- python - 导入的函数可以在没有导入变量的情况下打印变量的值,但我不能,为什么会发生这种情况?