WEBGL(4):动态绘制点并根据详细自定义颜色

1 实现代码

复制代码
<!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>
    <script src="js/glMatrix-0.9.6.min.js"></script>
    <script>
        let vertexstring = `
        attribute vec3 a_position;
        uniform     mat4    proj;
        attribute vec3 a_color;
        varying vec3 inColor;
        void main(void){
            gl_Position = vec4(a_position,1.0)  ;
            gl_PointSize=60.0;
            inColor = a_color;
        }
        `;
        let fragmentstring = `
        precision mediump float;
        varying vec3 inColor;
        void main(void){
          gl_FragColor = vec4(inColor,1.0);
        }
        `;
        var projMat4 = mat4.create();
        var webgl;
        function init() {
            initWebgl();
            initShader();
            initBuffer();
            draw();
        }
        function initWebgl() {
            let webglDiv = document.getElementById('myCanvas');
            webgl = webglDiv.getContext("webgl");
            webgl.viewport(0, 0, webglDiv.clientWidth, webglDiv.clientHeight);
            mat4.ortho(0, webglDiv.clientWidth, webglDiv.clientHeight, 0, -1.0, 1.0, projMat4)
        }
        function initShader() {

            let vsshader = webgl.createShader(webgl.VERTEX_SHADER);
            let fsshader = webgl.createShader(webgl.FRAGMENT_SHADER);

            webgl.shaderSource(vsshader, vertexstring);
            webgl.shaderSource(fsshader, fragmentstring);

            webgl.compileShader(vsshader);
            webgl.compileShader(fsshader);
            if (!webgl.getShaderParameter(vsshader, webgl.COMPILE_STATUS)) {
                var err = webgl.getShaderInfoLog(vsshader);
                alert(err);
                return;
            }
            if (!webgl.getShaderParameter(fsshader, webgl.COMPILE_STATUS)) {
                var err = webgl.getShaderInfoLog(fsshader);
                alert(err);
                return;
            }
            let program = webgl.createProgram();
            webgl.attachShader(program, vsshader);
            webgl.attachShader(program, fsshader)

            webgl.linkProgram(program);
            webgl.useProgram(program);

            webgl.program = program
        }
        var points = [];
        var colors=[];
        function initBuffer() {
            let aPsotion = webgl.getAttribLocation(webgl.program, "a_position");
            let aColor = webgl.getAttribLocation(webgl.program, "a_color");
            
            document.addEventListener("mousedown", function (e) {
                debugger
                let x = e.clientX;
                let y = e.clientY;
                let rect = e.target.getBoundingClientRect();
                let pointx = ((x - rect.left) - 512) / 512;
                let pointy = (350 - (y - rect.top)) / 350;
                points.push(pointx);
                points.push(pointy);
                points.push(0);
                if(pointx>0&&pointy>0){
                    colors.push(1.0);  
                    colors.push(0.0);  
                    colors.push(0.0);  
                }else if(pointx<0&&pointy>0){
                    colors.push(0.0);  
                    colors.push(1.0);  
                    colors.push(0.0);  
                }else if(pointx<0&&pointy<0){
                    colors.push(0.0);  
                    colors.push(0.0);  
                    colors.push(1.0); 
                }else{
                    colors.push(0.0);  
                    colors.push(1.0);  
                    colors.push(1.0); 
                }
                let pointPosition = new Float32Array(points);
                let pointBuffer = webgl.createBuffer();
                webgl.bindBuffer(webgl.ARRAY_BUFFER, pointBuffer);
                webgl.bufferData(webgl.ARRAY_BUFFER, pointPosition, webgl.STATIC_DRAW);
                webgl.enableVertexAttribArray(aPsotion);
                webgl.vertexAttribPointer(aPsotion, 3, webgl.FLOAT, false, 0, 0);

                let pointColor = new Float32Array(colors);
                let pointColorBuffer = webgl.createBuffer();
                webgl.bindBuffer(webgl.ARRAY_BUFFER, pointColorBuffer);
                webgl.bufferData(webgl.ARRAY_BUFFER, pointColor, webgl.STATIC_DRAW);
                webgl.enableVertexAttribArray(aColor);
                webgl.vertexAttribPointer(aColor, 3, webgl.FLOAT, false, 0, 0);




                webgl.clearColor(0.0, 0.0, 0.0, 1.0);
                webgl.clear(webgl.COLOR_BUFFER_BIT | webgl.DEPTH_BUFFER_BIT);
                webgl.drawArrays(webgl.POINTS, 0, points.length / 3);
            })



            let uniformProj = webgl.getUniformLocation(webgl.program, "proj");
            webgl.uniformMatrix4fv(uniformProj, false, projMat4);
        }
        function draw() {
            webgl.clearColor(0.0, 0.0, 0.0, 1.0);
            webgl.clear(webgl.COLOR_BUFFER_BIT | webgl.DEPTH_BUFFER_BIT);

        }
    </script>
</head>

<body onload="init()">
    <canvas id='myCanvas' width="1024" height='700'></canvas>
</body>

</html>

2 实现效果

根据鼠标点击的坐标,实现方块颜色进行变化

相关推荐
刘一说15 小时前
腾讯位置服务JavaScript API GL地图组件库深度解析:Vue生态中的地理空间可视化利器
javascript·vue.js·信息可视化·webgl·webgis
烛阴1 天前
从“无”到“有”:手动实现一个 3D 渲染循环全过程
前端·webgl·three.js
WebGISer_白茶乌龙桃2 天前
Cesium实现“悬浮岛”式,三维立体的行政区划
javascript·vue.js·3d·web3·html5·webgl
烛阴2 天前
拒绝配置地狱!5 分钟搭建 Three.js + Parcel 完美开发环境
前端·webgl·three.js
WebGISer_白茶乌龙桃3 天前
Vue3 + Mapbox 加载 SHP 转换的矢量瓦片 (Vector Tiles)
javascript·vue.js·arcgis·webgl
ThreePointsHeat7 天前
Unity WebGL打包后启动方法,部署本地服务器
unity·游戏引擎·webgl
林枫依依8 天前
电脑配置流程(WebGL项目)
webgl
冥界摄政王10 天前
CesiumJS学习第四章 替换指定3D建筑模型
3d·vue·html·webgl·js·cesium
温宇飞12 天前
高效的线性采样高斯模糊
javascript·webgl
冥界摄政王13 天前
Cesium学习第一章 安装下载 基于vue3引入Cesium项目开发
vue·vue3·html5·webgl·cesium