需要源码可以Q群:828202939 或者点击这里 <https://jq.qq.com/?_wv=1027&k=5NiS63x>
希望可以和大家一起学习、一起进步!!纯手打!!
书籍是PDF电子档,也在Q群里,所有的课程源代码在我上传的资源
<https://download.csdn.net/user/weixin_39452320/uploads>里面,本来想设置开源,好像不行!
如有错别字或有理解不到位的地方,可以留言或者加微信15250969798,在下会及时修改!!!!!
首先我们需要知道要绘制一个点,大致需要哪些步骤:
1.初始化着色器
2.获取attribute变量的存储地址
3.注册时间响应函数
4.响应鼠标点击事件
主要包括:获取鼠标点击的位置并存储在一个数组中、
清空canvas
根据数组的每个元素,在相应的位置绘制点
具体看代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" />
<title>用鼠标点击来画一个点</title> </head> <body onload="main()"> <canvas id="webgl"
width="400" height="400"> Please use a browser that supports "canvas" </canvas>
<script src="../lib/webgl-utils.js"></script> <script
src="../lib/webgl-debug.js"></script> <script
src="../lib/cuon-utils.js"></script> <script src="ClickedPoints.js"></script>
</body> </html> //顶点着色器程序,本案例设置的 var VSHADER_SOURCE = 'attribute vec4
a_Position;\n' + 'void main() {\n' + ' gl_Position = a_Position;\n' + '
gl_PointSize = 10.0;\n' + '}\n'; // 片元着色器程序,在这里设置的红色 var FSHADER_SOURCE = 'void
main() {\n' + ' gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n' + '}\n'; function
main() { // 获取canvas元素 var canvas = document.getElementById('webgl'); //
获取canvas上下文 var gl = getWebGLContext(canvas); if (!gl) { console.log('Failed to
get the rendering context for WebGL'); return; } // 初始化着色器 if (!initShaders(gl,
VSHADER_SOURCE, FSHADER_SOURCE)) { console.log('Failed to intialize shaders.');
return; } // 获取attribute变量的位置 var a_Position = gl.getAttribLocation(gl.program,
'a_Position'); if (a_Position < 0) { console.log('Failed to get the storage
location of a_Position'); return; } // 注册鼠标事件点击响应函数 canvas.onmousedown =
function(ev){ click(ev, gl, canvas, a_Position); }; // canvas背景色
gl.clearColor(0.0, 0.0, 0.0, 1.0); // 清除canvas gl.clear(gl.COLOR_BUFFER_BIT); }
var g_points = []; // 鼠标点击位置数组 function click(ev, gl, canvas, a_Position)
{//鼠标点击函数 var x = ev.clientX; // 鼠标点击处的x坐标 var y = ev.clientY; // 鼠标点击处的y坐标
//获取canvas在浏览器客户区中的坐标 var rect = ev.target.getBoundingClientRect() ;
//这里主要是先把客户区的坐标转换为canvas的坐标,然后再转化为webgl的坐标 x = ((x - rect.left) -
canvas.width/2)/(canvas.width/2); y = (canvas.height/2 - (y -
rect.top))/(canvas.height/2); // 将坐标存储到g_points数组中 g_points.push(x);
g_points.push(y); // 清除canvas gl.clear(gl.COLOR_BUFFER_BIT); var len =
g_points.length; for(var i = 0; i < len; i += 2) { // 将点的位置传输到attribute变量里
gl.vertexAttrib3f(a_Position, g_points[i], g_points[i+1], 0.0); // 绘制
gl.drawArrays(gl.POINTS, 0, 1); } }
运行结果:
热门工具 换一换