<html>
<head>
<script src="./lib/webgl-debug.js" type="text/javascript"></script>
<script src="./lib/webgl-utils.js" type="text/javascript"></script>
<script src="./lib/cuon-utils.js" type="text/javascript"></script>
<script src="./lib/cuon-matrix.js" type="text/javascript"></script>
</head>
<body>
<canvas width="800" height="800" id='canvas'></canvas>
<script type="text/javascript">
const v_Shader=`
attribute vec4 a_position;
uniform mat4 u_ModelViewMatrix;
attribute vec2 a_textureCoord;
varying vec2 v_textureCoord;
void main(){
gl_Position=u_ModelViewMatrix*a_position;
gl_PointSize=1.0;
v_textureCoord=a_textureCoord;
}
`
const f_shader=`
precision mediump float;
varying vec2 v_textureCoord;
uniform sampler2D u_sampler;
void main(){
gl_FragColor=texture2D(u_sampler,v_textureCoord);
}
`
var canvas=document.getElementById('canvas')
var gl=getWebGLContext(canvas)
if(!gl){
alert('初始化webgl失败')
}
if(!initShaders(gl,v_Shader,f_shader)){
alert('初始化着色器失败')
}
this.drawCube(gl)
function drawCube(gl){
var cubeArray=new Float32Array([
1.0, 1.0, 1.0, -1.0, 1.0, 1.0, -1.0,-1.0, 1.0, 1.0,-1.0, 1.0,
1.0, 1.0, 1.0, 1.0,-1.0, 1.0, 1.0,-1.0,-1.0, 1.0, 1.0,-1.0,
1.0, 1.0, 1.0, 1.0, 1.0,-1.0, -1.0, 1.0,-1.0, -1.0, 1.0, 1.0,
-1.0, 1.0, 1.0, -1.0, 1.0,-1.0, -1.0,-1.0,-1.0, -1.0,-1.0, 1.0,
-1.0,-1.0,-1.0, 1.0,-1.0,-1.0, 1.0,-1.0, 1.0, -1.0,-1.0, 1.0,
1.0,-1.0,-1.0, -1.0,-1.0,-1.0, -1.0, 1.0,-1.0, 1.0, 1.0,-1.0
])
initVertexArrayBuffer(gl,cubeArray,3,'a_position')
var textures = new Float32Array([
1.0,1.0, 0.0,1.0, 0.0,0.0, 1.0,0.0,
1.0,1.0, 0.0,1.0, 0.0,0.0, 1.0,0.0,
1.0,1.0, 1.0,0.0, 0.0,0.0, 0.0,1.0,
1.0,1.0, 1.0,0.0, 0.0,0.0, 0.0,1.0,
0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0,
1.0,1.0, 0.0,0.0, 0.0,1.0, 1.0,1.0
]);
initVertexArrayBuffer(gl,textures,2,'a_textureCoord')
var index_array = new Uint8Array([
0, 1, 2, 2,3,0,
4, 5, 6, 6,7,4,
8, 9,10, 10,11,8,
12,13,14, 14,15,12,
16,17,18, 18,19,16,
20,21,22, 22,23,20
]);
const elementBuffer=gl.createBuffer()
initTexture()
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, elementBuffer)
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER,index_array,gl.STATIC_DRAW)
let currentAngle=0
let tick=function(){
currentAngle=this.computeAngle(currentAngle)
draw(currentAngle)
requestAnimationFrame(tick)
}
tick()
}
function draw(currentAngle){
var viewMatrix = new Matrix4();
viewMatrix.setLookAt(5,5,5,0,0,0,0,1,0);
var projMat4=new Matrix4()
projMat4.setPerspective(30,1,1,300);
var modelMat4=new Matrix4()
modelMat4.setRotate(currentAngle, 0, 0, 1)
var modeViewMatrix = projMat4.multiply(viewMatrix.multiply(modelMat4));
let u_ModelViewMatrix=gl.getUniformLocation(gl.program, 'u_ModelViewMatrix')
gl.uniformMatrix4fv(u_ModelViewMatrix, false, modeViewMatrix.elements);
gl.enable(gl.DEPTH_TEST)
gl.clearColor(0, 0, 0, 1)
gl.clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER_BIT)
gl.drawElements(gl.TRIANGLES,36, gl.UNSIGNED_BYTE, 0)
}
function computeAngle(currentRotate){
return currentRotate+=1
}
function initVertexArrayBuffer(gl,arrayData,num,attrStr){
const vertexBuffer=gl.createBuffer()
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer)
gl.bufferData(gl.ARRAY_BUFFER,arrayData,gl.STATIC_DRAW)
let a_var=gl.getAttribLocation(gl.program, attrStr)
gl.vertexAttribPointer(a_var, num, gl.FLOAT, false, 0, 0)
gl.enableVertexAttribArray(a_var)
}
function initTexture() {
var texture=gl.createTexture();
var u_Sampler=gl.getUniformLocation(gl.program,"u_sampler");
console.log(u_Sampler)
var image=new Image();
image.onload=function(){
loadTexture(gl,texture,image,u_Sampler);
}
image.src="./img/dd.jpg"
}
function loadTexture(gl,texture,image,u_Sampler){
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL,1);
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D,texture);
gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR)
gl.texImage2D(gl.TEXTURE_2D,0,gl.RGB,gl.RGB,gl.UNSIGNED_BYTE,image);
gl.uniform1i(u_Sampler,0)
gl.clearColor(0, 0, 0, 1)
gl.clear(gl.COLOR_BUFFER_BIT)
gl.drawArrays(gl.TRIANGLES, 0, 6)
}
</script>
</body>
</html>
