remove useless color buffer and prepare texture buffer implementation
This commit is contained in:
parent
6a1b25777d
commit
8c1baf3a86
|
@ -26,45 +26,6 @@ export function initBuffers(
|
||||||
new Float32Array(normals),
|
new Float32Array(normals),
|
||||||
gl.STATIC_DRAW);
|
gl.STATIC_DRAW);
|
||||||
|
|
||||||
const myColors = [
|
|
||||||
[1.0, 1.0, 1.0, 1.0],
|
|
||||||
[1.0, 0.0, 0.0, 1.0],
|
|
||||||
[0.0, 1.0, 0.0, 1.0],
|
|
||||||
[0.0, 0.0, 1.0, 1.0],
|
|
||||||
[1.0, 1.0, 0.0, 1.0],
|
|
||||||
[1.0, 0.0, 1.0, 1.0],
|
|
||||||
[0.0, 0.0, 0.0, 1.0],
|
|
||||||
[0.0, 1.0, 1.0, 1.0],
|
|
||||||
];
|
|
||||||
|
|
||||||
let faceColors: any = [];
|
|
||||||
|
|
||||||
for (let i = 0; i < 70; i++) {
|
|
||||||
faceColors = faceColors.concat(myColors);
|
|
||||||
}
|
|
||||||
// Convert the array of colors into a table for all the vertices.
|
|
||||||
|
|
||||||
const colors: any = [];
|
|
||||||
|
|
||||||
for (let j = 0; j < indices.length; ++j) {
|
|
||||||
const c = [
|
|
||||||
myColors[Math.floor(Math.random() * 8)],
|
|
||||||
faceColors[Math.floor(Math.random() * 8)],
|
|
||||||
faceColors[Math.floor(Math.random() * 8)],
|
|
||||||
faceColors[Math.floor(Math.random() * 8)],
|
|
||||||
];
|
|
||||||
// Repeat each color four times for the four vertices of the face
|
|
||||||
// colors = colors.concat([1.0, 1.0, 1.0, 1.0]);
|
|
||||||
colors.push(c[0][0]);
|
|
||||||
colors.push(c[0][1]);
|
|
||||||
colors.push(c[0][2]);
|
|
||||||
colors.push(c[0][3]);
|
|
||||||
}
|
|
||||||
|
|
||||||
const colorBuffer = gl.createBuffer();
|
|
||||||
gl.bindBuffer(gl.ARRAY_BUFFER, colorBuffer);
|
|
||||||
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);
|
|
||||||
|
|
||||||
const indexBuffer = gl.createBuffer();
|
const indexBuffer = gl.createBuffer();
|
||||||
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
|
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
|
||||||
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER,
|
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER,
|
||||||
|
@ -73,7 +34,6 @@ export function initBuffers(
|
||||||
|
|
||||||
return {
|
return {
|
||||||
position: positionBuffer,
|
position: positionBuffer,
|
||||||
color: colorBuffer,
|
|
||||||
indices: indexBuffer,
|
indices: indexBuffer,
|
||||||
normals: normalBuffer,
|
normals: normalBuffer,
|
||||||
};
|
};
|
||||||
|
|
|
@ -30,14 +30,12 @@ async function main() {
|
||||||
|
|
||||||
const vsSource = `
|
const vsSource = `
|
||||||
attribute vec4 aVertexPosition;
|
attribute vec4 aVertexPosition;
|
||||||
attribute vec4 aVertexColor;
|
|
||||||
attribute vec4 aVertexNormal;
|
attribute vec4 aVertexNormal;
|
||||||
|
|
||||||
uniform mat4 uProjectionMatrix;
|
uniform mat4 uProjectionMatrix;
|
||||||
uniform mat4 uviewMatrix;
|
uniform mat4 uviewMatrix;
|
||||||
uniform mat4 umodelMatrix;
|
uniform mat4 umodelMatrix;
|
||||||
|
|
||||||
varying highp vec4 vColor;
|
|
||||||
varying highp vec4 vNormal;
|
varying highp vec4 vNormal;
|
||||||
varying highp vec3 vPosition;
|
varying highp vec3 vPosition;
|
||||||
void main()
|
void main()
|
||||||
|
@ -47,7 +45,6 @@ async function main() {
|
||||||
umodelMatrix *
|
umodelMatrix *
|
||||||
aVertexPosition;
|
aVertexPosition;
|
||||||
vPosition = vec3(aVertexPosition);
|
vPosition = vec3(aVertexPosition);
|
||||||
vColor = aVertexColor;
|
|
||||||
vNormal = umodelMatrix * aVertexNormal;
|
vNormal = umodelMatrix * aVertexNormal;
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
@ -55,7 +52,6 @@ async function main() {
|
||||||
const fsSource = `
|
const fsSource = `
|
||||||
precision highp float;
|
precision highp float;
|
||||||
|
|
||||||
varying highp vec4 vColor;
|
|
||||||
varying highp vec4 vNormal;
|
varying highp vec4 vNormal;
|
||||||
varying highp vec3 vPosition;
|
varying highp vec3 vPosition;
|
||||||
|
|
||||||
|
@ -91,7 +87,6 @@ async function main() {
|
||||||
const fsSource2 = `
|
const fsSource2 = `
|
||||||
precision highp float;
|
precision highp float;
|
||||||
|
|
||||||
varying highp vec4 vColor;
|
|
||||||
varying highp vec4 vNormal;
|
varying highp vec4 vNormal;
|
||||||
varying highp vec3 vPosition;
|
varying highp vec3 vPosition;
|
||||||
|
|
||||||
|
@ -126,7 +121,6 @@ async function main() {
|
||||||
const fsSource3 = `
|
const fsSource3 = `
|
||||||
precision highp float;
|
precision highp float;
|
||||||
|
|
||||||
varying highp vec4 vColor;
|
|
||||||
varying highp vec4 vNormal;
|
varying highp vec4 vNormal;
|
||||||
varying highp vec3 vPosition;
|
varying highp vec3 vPosition;
|
||||||
|
|
||||||
|
@ -193,8 +187,6 @@ async function main() {
|
||||||
attribLocations: {
|
attribLocations: {
|
||||||
vertexPosition: gl.getAttribLocation(shaderProgram,
|
vertexPosition: gl.getAttribLocation(shaderProgram,
|
||||||
'aVertexPosition'),
|
'aVertexPosition'),
|
||||||
vertexColor: gl.getAttribLocation(shaderProgram,
|
|
||||||
'aVertexColor'),
|
|
||||||
vertexNormal: gl.getAttribLocation(shaderProgram,
|
vertexNormal: gl.getAttribLocation(shaderProgram,
|
||||||
'aVertexNormal'),
|
'aVertexNormal'),
|
||||||
},
|
},
|
||||||
|
@ -283,15 +275,15 @@ async function main() {
|
||||||
circleSize = $('#input2').val();
|
circleSize = $('#input2').val();
|
||||||
circleSize = parseFloat(circleSize);
|
circleSize = parseFloat(circleSize);
|
||||||
});
|
});
|
||||||
$('#sphere').on('click', async function() {
|
$('#o_sphere').on('click', async function() {
|
||||||
const data = await getObj('/static/objs/sphere.obj');
|
const data = await getObj('/static/objs/sphere.obj');
|
||||||
updateObj(data);
|
updateObj(data);
|
||||||
});
|
});
|
||||||
$('#teapot').on('click', async function() {
|
$('#o_teapot').on('click', async function() {
|
||||||
const data = await getObj('/static/objs/teapot.obj');
|
const data = await getObj('/static/objs/teapot.obj');
|
||||||
updateObj(data);
|
updateObj(data);
|
||||||
});
|
});
|
||||||
$('#fox').on('click', async function() {
|
$('#o_fox').on('click', async function() {
|
||||||
const data = await getObj('/static/objs/fox.obj');
|
const data = await getObj('/static/objs/fox.obj');
|
||||||
updateObj(data);
|
updateObj(data);
|
||||||
});
|
});
|
||||||
|
@ -413,26 +405,6 @@ function drawScene(gl: any,
|
||||||
programInfo.attribLocations.vertexNormal);
|
programInfo.attribLocations.vertexNormal);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tell WebGL how to pull out the positions from the position
|
|
||||||
// buffer into the vertexPosition attribute.
|
|
||||||
{
|
|
||||||
const numComponents = 4;
|
|
||||||
const type = gl.FLOAT;
|
|
||||||
const normalize = false;
|
|
||||||
const stride = 0;
|
|
||||||
const offset = 0;
|
|
||||||
gl.bindBuffer(gl.ARRAY_BUFFER, buffers.color);
|
|
||||||
gl.vertexAttribPointer(
|
|
||||||
programInfo.attribLocations.vertexColor,
|
|
||||||
numComponents,
|
|
||||||
type,
|
|
||||||
normalize,
|
|
||||||
stride,
|
|
||||||
offset);
|
|
||||||
gl.enableVertexAttribArray(
|
|
||||||
programInfo.attribLocations.vertexColor);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tell WebGL which indices to use to index the vertices
|
// Tell WebGL which indices to use to index the vertices
|
||||||
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, buffers.indices);
|
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, buffers.indices);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
/**
|
||||||
|
* Initialize a texture and load an image.
|
||||||
|
* @param {any} gl the gl context
|
||||||
|
* @param {string} url the url of the texture
|
||||||
|
*/
|
||||||
|
export function loadTexture(gl: any, url: any) {
|
||||||
|
const texture = gl.createTexture();
|
||||||
|
gl.bindTexture(gl.TEXTURE_2D, texture);
|
||||||
|
|
||||||
|
// Because images have to be downloaded over the internet
|
||||||
|
// they might take a moment until they are ready.
|
||||||
|
// Until then put a single pixel in the texture so we can
|
||||||
|
// use it immediately. When the image has finished downloading
|
||||||
|
// we'll update the texture with the contents of the image.
|
||||||
|
const level = 0;
|
||||||
|
const internalFormat = gl.RGBA;
|
||||||
|
const width = 1;
|
||||||
|
const height = 1;
|
||||||
|
const border = 0;
|
||||||
|
const srcFormat = gl.RGBA;
|
||||||
|
const srcType = gl.UNSIGNED_BYTE;
|
||||||
|
const pixel = new Uint8Array([0, 0, 255, 255]); // opaque blue
|
||||||
|
gl.texImage2D(gl.TEXTURE_2D, level, internalFormat,
|
||||||
|
width, height, border, srcFormat, srcType,
|
||||||
|
pixel);
|
||||||
|
|
||||||
|
const image = new Image();
|
||||||
|
image.onload = function() {
|
||||||
|
gl.bindTexture(gl.TEXTURE_2D, texture);
|
||||||
|
gl.texImage2D(gl.TEXTURE_2D, level, internalFormat,
|
||||||
|
srcFormat, srcType, image);
|
||||||
|
|
||||||
|
// WebGL1 has different requirements for power of 2 images
|
||||||
|
// vs non power of 2 images so check if the image is a
|
||||||
|
// power of 2 in both dimensions.
|
||||||
|
if (isPowerOf2(image.width) && isPowerOf2(image.height)) {
|
||||||
|
// Yes, it's a power of 2. Generate mips.
|
||||||
|
gl.generateMipmap(gl.TEXTURE_2D);
|
||||||
|
} else {
|
||||||
|
// No, it's not a power of 2. Turn off mips and set
|
||||||
|
// wrapping to clamp to edge
|
||||||
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
||||||
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
||||||
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
image.src = url;
|
||||||
|
|
||||||
|
return texture;
|
||||||
|
}
|
||||||
|
|
||||||
|
function isPowerOf2(value: number) {
|
||||||
|
return (value & (value - 1)) == 0;
|
||||||
|
}
|
|
@ -18,6 +18,7 @@
|
||||||
<button id='button1'>Change Shader to black and white</button>
|
<button id='button1'>Change Shader to black and white</button>
|
||||||
<button id='button2'>Change Shader to colored</button>
|
<button id='button2'>Change Shader to colored</button>
|
||||||
<button id='button3'>Change Shader to flat</button>
|
<button id='button3'>Change Shader to flat</button>
|
||||||
|
<button id='button3'>Change Shader to texture</button>
|
||||||
</div>
|
</div>
|
||||||
<div class='ui-block'>
|
<div class='ui-block'>
|
||||||
<input id='input1' value='50'></input>
|
<input id='input1' value='50'></input>
|
||||||
|
@ -29,9 +30,15 @@
|
||||||
<button id='changecirclesize'>Change circle size</button>
|
<button id='changecirclesize'>Change circle size</button>
|
||||||
</div>
|
</div>
|
||||||
<div class='ui-block'>
|
<div class='ui-block'>
|
||||||
<button id='sphere'>Set obj to sphere</button>
|
<button id='o_sphere'>Set object to sphere</button>
|
||||||
<button id='teapot'>Set obj to teapot</button>
|
<button id='o_teapot'>Set object to teapot</button>
|
||||||
<button id='fox'>Set obj to fox</button>
|
<button id='o_fox'>Set object to fox</button>
|
||||||
|
</div>
|
||||||
|
<div class='ui-block'>
|
||||||
|
<button id='t_grey'>Set texture to white</button>
|
||||||
|
<button id='t_wall'>Set texture to wall</button>
|
||||||
|
<button id='t_fox'>Set texture to fox</button>
|
||||||
|
<button id='t_ice'>Set texture to ice</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in New Issue