当前位置: 首页 > news >正文

webgl入门实例-09索引缓冲区示例

实现效果

在这里插入图片描述

实现代码

<!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/*** 索引缓冲区(也称为元素数组缓冲区)是WebGL中一种优化渲染性能的重要机制,它允许您重用顶点数据来绘制复杂的几何图形。* 减少内存使用:可以重用顶点数据而不需要重复存储* 提高性能:减少需要传输到GPU的数据量* 支持复杂几何:更容易构建由多个三角形组成的复杂形状*/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);// n代表法线var jsArrayData = [// 每6个为一个顶点的信息//x     y       z       nx      ny      nz-0.5,   +0.5,   0.0,    0.0,    0.0,    0.0, // 0+0.5,   +0.5,   0.0,    0.0,    0.0,    0.0, // 1+0.5,   -0.5,   0.0,    0.0,    0.0,    0.0, // 2-0.5,   -0.5,   0.0,    0.0,    0.0,    0.0, // 3];//右顶点var indexDatas = [0,1,2, // 第一个三角形对应 jsArrayData 中的 0 1 20,2,3, // 第二个三角形];//指定绘制所使用的顶点数据 从 该缓冲区中获取var triangleBuffer  =   webgl.createBuffer();webgl.bindBuffer(webgl.ARRAY_BUFFER, triangleBuffer);// 将顶点数据存入缓冲区webgl.bufferData(webgl.ARRAY_BUFFER, new Float32Array(jsArrayData), webgl.STATIC_DRAW);var indexBuffer     =   webgl.createBuffer();webgl.bindBuffer(webgl.ELEMENT_ARRAY_BUFFER, indexBuffer);webgl.bufferData(webgl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indexDatas), webgl.STATIC_DRAW);// 设置重绘背景的颜色webgl.clearColor(0.0, 0.0, 0.0, 1.0);//! 执行绘制,即将背景清空成制定的颜色(clearColor)webgl.clear(webgl.COLOR_BUFFER_BIT);webgl.enableVertexAttribArray(v3PositionIndex);webgl.vertexAttribPointer(v3PositionIndex, 3, // 每个点对应 类型为 vec4(), 如这里写的3, 假设顶点缓冲区中的xyz都为1.0, 3-->vec4(1.0, 1.0, 1.0, 1.0)   2--> vec4(1.0, 1.0, 0.0, 1.0)  1-->vec4(1.0, 0.0, 0.0, 1.0)webgl.FLOAT, false, // 是否正交化4 * 6, // jsArrayData中的没6个存储一个点的信息0 // 顶点的起始位置);// 索引缓冲区使用 drawElements webgl.drawElements(webgl.TRIANGLES,6, // 画6给索引, 即indexDatas的长度webgl.UNSIGNED_SHORT, // 索引缓冲区中的数据类型0 // 顶点位置偏移量);//Sandcastle_End}window.onload = function() {Sandcastle.finishedLoading();Init()}</script>
</body></html>

相关文章:

  • 【华为】OSPF震荡引起CPU占用率高怎么解决?
  • SvelteKit 最新中文文档教程(21)—— 最佳实践之图片
  • Python-基于协同过滤的推荐系统详解:从经典方法到前沿技术
  • 使用mybatisPlus自带的分页方法+xml实现数据分页
  • PyTorch:学习 CIFAR-10 分类
  • 25.4.17学习总结
  • 多线程进阶知识篇(二)
  • CSDN创作四载记:我的创作纪念日随笔与感悟
  • SpringBoot整合Thymeleaf模板:构建现代化Web视图层的完整指南
  • 5G中LDPC编码之码块分段
  • C++入门小馆: C/C++内存管理
  • DAY 47 leetcode 232--栈与队列.用栈实现队列
  • 视频剪辑入门
  • iptables防火墙
  • 【C++初阶】第14课—缝合怪deque和优先队列、仿函数
  • AI在能源消耗管理及能源效率提升中的核心应用场景及技术实现
  • vllm 本地部署qwen2.5/Qwen2.5-32B-Instruct-AWQ模型
  • Crawl4AI:为大语言模型打造的开源网页数据采集工具
  • AI Agent系列(九) -Data Agent(数据分析智能体)
  • 【无人机】PX4飞控怎么烧写加载固件,更新固件方法,详细流程
  • 湖北宜昌:在青山绿水间解锁乡村振兴“密码”
  • 东方红资管官宣:41岁原国信资管董事长成飞出任新总经理
  • 四川资阳市原市长王善平被双开,“笃信风水,大搞迷信活动”
  • 视频丨雄姿英发!中国仪仗队步入莫斯科红场
  • 心相印回应官方旗舰店客服辱骂消费者:正排查
  • 铲屎官花5万带猫狗旅行,宠旅生意有多赚?