免費(fèi)網(wǎng)站設(shè)計(jì) 優(yōu)幫云公司網(wǎng)絡(luò)優(yōu)化方案
我會(huì)持續(xù)更新關(guān)于wegl的編程指南中的代碼。
當(dāng)前的代碼不會(huì)使用書中的縮寫,每一步都是會(huì)展開寫。希望能給后來學(xué)習(xí)的一些幫助
git代碼地址
接著? 上一節(jié)?接著做平移的轉(zhuǎn)化。本案例是三角形的旋轉(zhuǎn)
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><h3>可以按下按鍵ADSW</h3><p>旋轉(zhuǎn)的角度:<span id="num"></span></p><canvas id='canvas'></canvas><script>let canvas = document.getElementById('canvas');let gl = canvas.getContext('webgl');let vertexShaderSource = `attribute vec2 a_Position;uniform float u_CosB,u_SinB; void main(){gl_Position.x = a_Position.x * u_CosB - a_Position.y*u_SinB;gl_Position.y = a_Position.x * u_SinB + a_Position.y*u_CosB;gl_Position.z = 0.0;gl_Position.w = 1.0;}`let fragmentShaderSouce = `precision mediump float;void main(){gl_FragColor = vec4(1.0,0.0,0.0,1.0);}`// 創(chuàng)建頂點(diǎn)著色器let vertexShader = gl.createShader(gl.VERTEX_SHADER);// 設(shè)置著色器源代碼gl.shaderSource(vertexShader, vertexShaderSource)// 編譯著色器gl.compileShader(vertexShader)// 創(chuàng)建著片元色器let fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);// 設(shè)置著色器源代碼gl.shaderSource(fragmentShader, fragmentShaderSouce)// 編譯著色器gl.compileShader(fragmentShader)//創(chuàng)建渲染程序let program = gl.createProgram();// 把頂點(diǎn)著色器添加到渲染程序gl.attachShader(program, vertexShader);gl.attachShader(program, fragmentShader);gl.linkProgram(program);//使用當(dāng)前渲染程序gl.useProgram(program)//檢測著色器鏈接是否正確if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {throw gl.getProgramInfoLog(program);} //x抽的旋轉(zhuǎn)角度let rotateX = 0.0;//y軸的旋轉(zhuǎn)角度let rotateY = 0;//三角的三個(gè)頂點(diǎn)的坐標(biāo)位置let positonArray = new Float32Array([0.0, 0.5, -0.5, -0.5, 0.5, -0.5]);// 獲取頂點(diǎn)著色器的變量let a_Position = gl.getAttribLocation(program, 'a_Position');// 獲取旋轉(zhuǎn)角度的變量let u_CosB = gl.getUniformLocation(program, 'u_CosB')let u_SinB = gl.getUniformLocation(program, 'u_SinB')// 創(chuàng)建緩沖區(qū)let buffer = gl.createBuffer();//將緩沖區(qū)對(duì)象綁定到目標(biāo)gl.bindBuffer(gl.ARRAY_BUFFER, buffer);//向緩沖區(qū)寫入數(shù)據(jù)gl.bufferData(gl.ARRAY_BUFFER, positonArray, gl.STATIC_DRAW)//將緩沖區(qū)對(duì)象綁定到目標(biāo)gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0)// 啟用變量a_Positiongl.enableVertexAttribArray(a_Position);//繪制gl.clearColor(0.0, 0.0, 0.0, 1.0);const render = function () {//賦值x角度gl.uniform1f(u_CosB, Math.cos(Math.PI*rotateX/180.0));//賦值y角度gl.uniform1f(u_SinB, Math.sin(Math.PI*rotateX/180.0));// 清空畫布gl.clear(gl.COLOR_BUFFER_BIT);// 繪制三角形gl.drawArrays(gl.TRIANGLES, 0, 3)setNumer()}render()document.onkeydown = function (e) { //對(duì)整個(gè)頁面監(jiān)聽 var keyNum = window.event ? e.keyCode : e.which; //獲取被按下的鍵值 //判斷如果用戶按下了回車鍵(keycody=13) if (keyNum == 65) {console.log('A');rotateX -= 1; rotateY=0render()}//判斷如果用戶按下了空格鍵(keycode=32), if (keyNum == 68) {console.log('D');rotateX +=1; rotateY=0render()}//判斷如果用戶按下了空格鍵(keycode=32), if (keyNum == 83) {console.log('S');rotateY -= 1; rotateX=0render()}//判斷如果用戶按下了空格鍵(keycode=32), if (keyNum == 87) {console.log('W');rotateY += 1; rotateX=0render();}}function setNumer (){let text = document.getElementById('num');text.innerText = `rotateX:${ rotateX}`} </script>
</body></html>