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>
相关推荐
孪生前端2 小时前
如何用配置驱动一套 Three.js 数字孪生模板
webgl
用户83134859306984 天前
Vue+Threejs实现人物奔跑场景
vue.js·webgl·three.js
元气少女小圆丶5 天前
unity发布web嵌入到前端页面的接受参数
前端·unity·webgl
WebGIS开发7 天前
WebGIS开发进阶教程①:WebGL坐标系
gis·webgl·gis开发
虚焦像素_8 天前
MapLibre GL 实战:一套引擎搞定 2D 平面与 3D 球面
webgl
山河木马10 天前
GPU自动处理专题4-填充覆盖区域(光栅化)
javascript·webgl·计算机图形学
智商偏低10 天前
WebGL 百万线段高性能 Demo(批量绘制,无循环绘制)
webgl
weixin_4368040712 天前
毒蘑菇性能测试增强版 - 毒蘑菇性能测试 - 在线 WebGL GPU 帧率压力测试工具
webgl
山河木马13 天前
GPU自动处理专题3-NDC怎么映射成屏幕像素坐标(视口变换)
javascript·webgl·图形学
山河木马13 天前
GPU自动处理专题2-NDC是什么(透视除法)
javascript·webgl·计算机图形学