webgl入门实例-07顶点缓冲区示例

实现效果

实现代码

html 复制代码
<!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, maximum-scale=1, minimum-scale=1, user-scalable=no" />
    <meta name="description" content="Render voxel primitives with different shape types." />
    <meta name="cesium-sandcastle-labels" content="Showcases, WEBGL" />
    <title>WEBGL Demo</title>
</head>

<body>
    <canvas id="myCanvas" style="border: 1px solid red;" width='600' height='600'></canvas>

    <script type="text/plain" id="VSHADER_SOURCE">
        attribute vec3 v3Position;
        void main(void)
        {
            gl_Position = vec4(v3Position, 1.0);
        }
    </script>

    <script type="text/plain" id="FSHADER_SOURCE">
        void main(void)
        {
            gl_FragColor = vec4(0.0, 1.0, 1.0, 1.0);
        }
    </script>
    
    <script id="cesium_sandcastle_script">
        "use strict";
        function Init() {
            //Sandcastle_Begin
            var webgl = null;
            var VSHADER_SOURCE = document.getElementById("VSHADER_SOURCE").textContent;
            var FSHADER_SOURCE = document.getElementById("FSHADER_SOURCE").textContent;

            var canvas = document.getElementById('myCanvas');
            webgl = canvas.getContext("webgl");

            webgl.viewport(0, 0, canvas.clientWidth, canvas.clientHeight);

            var vertexShaderObject = webgl.createShader(webgl.VERTEX_SHADER);
            var fragmentShaderObject = webgl.createShader(webgl.FRAGMENT_SHADER);

            webgl.shaderSource(vertexShaderObject,VSHADER_SOURCE);
            webgl.shaderSource(fragmentShaderObject,FSHADER_SOURCE);

            webgl.compileShader(vertexShaderObject);
            webgl.compileShader(fragmentShaderObject);

            if (!webgl.getShaderParameter(vertexShaderObject, webgl.COMPILE_STATUS)) 
            { 
                alert("error:vertexShaderObject");
                return; 
            }
            if (!webgl.getShaderParameter(fragmentShaderObject, webgl.COMPILE_STATUS))
            { 
                alert("error:fragmentShaderObject");
                return;
            }

            var programObject = webgl.createProgram();

            webgl.attachShader(programObject, vertexShaderObject);
            webgl.attachShader(programObject, fragmentShaderObject);

            var v3PositionIndex = 0;
            webgl.bindAttribLocation(programObject, v3PositionIndex, "v3Position");

            webgl.linkProgram(programObject);
            if (!webgl.getProgramParameter(programObject, webgl.LINK_STATUS)) 
            { 
                alert("error:programObject"); 
                return; 
            }

            webgl.useProgram(programObject);

            //1 顶点缓冲区
            //2 索引缓冲区
            //3 纹理
            //4 帧缓冲
            //5 深度缓冲区
            //6 颜色缓冲区
            //7 模板缓冲区

            //1 模型矩阵
            //2 观察矩阵
            //3 投影矩阵
            //4 视口

            var vertexArray = [
                0.0, 1.0, 0.0,//上顶点
                -1.0, -1.0, 0.0,//左顶点
                1.0, -1.0, 0.0//右顶点
            ];

            // 该示例中并未使用到z坐标,因此以下顶点数据与 vertexArray 相等 对应的 ebgl.vertexAttribPointer的第二个参数变为2即可
            // 如:webgl.vertexAttribPointer(v3PositionIndex,2,webgl.FLOAT,false,0,0)
            var vertexArray1 = [
                0.0, 1.0,//上顶点
                -1.0, -1.0,//左顶点
                1.0, -1.0//右顶点
            ];

            // 顶点缓冲区
            var triangleBuffer = webgl.createBuffer(); 
             // 指定绘制所使用的顶点数据 从 该缓冲区中获取
            webgl.bindBuffer(webgl.ARRAY_BUFFER, triangleBuffer);
            // 分配内存 Float32单精度  Float16半精度
            // webgl.STATIC_DRAW的作用是告诉显卡该数据在内存中不会被改变
            // webgl.STREAM_DRAW数据偶尔变化,变得不多的情况
            // webgl.DYNAMIC_DRAW数据动态变化大
            // 性能优化:尽量减少数据更新,变多少,更新多少
            webgl.bufferData(webgl.ARRAY_BUFFER, new Float32Array(vertexArray), webgl.STATIC_DRAW); //申请在显卡中开辟新的内存 将数据存入显卡内存

            webgl.clearColor(0.0, 0.0, 0.0, 1.0);
            webgl.clear(webgl.COLOR_BUFFER_BIT);

            webgl.enableVertexAttribArray(v3PositionIndex);

            webgl.vertexAttribPointer(
                v3PositionIndex, 
                3, // 对应gl_Position,对应vec4,vec4中,除第四个分量为1外,其余未分配的将自动填充为0,如第一个点 vec4( 0.0, 1.0, 0.0, 1.0)
                webgl.FLOAT, 
                false, 
                0,  // 指定多少个字节存储一个顶点的信息,如 x, y, z 共3个
                0
            );

            webgl.drawArrays(
                webgl.TRIANGLES, 0, 3 // 绘制3个点,顶点shader就被执行3次

            );
             //Sandcastle_End
        }

        window.onload = function() {
            Sandcastle.finishedLoading();
            Init()
        }
    
    </script>
</body>

</html>
相关推荐
Aurora@Hui1 天前
WebGL & Three.js
webgl
CC码码3 天前
基于WebGPU实现canvas高级滤镜
前端·javascript·webgl·fabric
ct9783 天前
WebGL 图像处理核心API
图像处理·webgl
ct9786 天前
Cesium 矩阵系统详解
前端·线性代数·矩阵·gis·webgl
ct9788 天前
WebGL Shader性能优化
性能优化·webgl
棋鬼王9 天前
Cesium(一) 动态立体墙电子围栏,Wall墙体瀑布滚动高亮动效,基于Vue3
3d·信息可视化·智慧城市·webgl
Longyugxq11 天前
Untiy的Webgl端网页端视频播放,又不想直接mp4格式等格式的。
unity·音视频·webgl
花姐夫Jun12 天前
cesium基础学习-坐标系统相互转换及相应的场景
学习·webgl
ct97812 天前
WebGL开发
前端·gis·webgl
作孽就得先起床12 天前
unity webGL导出.glb模型
unity·c#·游戏引擎·webgl