分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 技术分享

WebGl通过缓冲区绘制多个点

发布时间:2023-09-06 02:27责任编辑:沈小雨关键词:Web

使用缓冲区对象向顶点着色器传入多个点

1. 创建缓冲区对象gl.createBuffer()
2. 绑定缓冲区对象gl.bindBuffer()
3. 将数据写入缓冲区对象gl.bufferData()
4. 将缓冲区对象分配给一个attribute对象gl.vertexAttribPointer()
5. 开启attribute变量 gl.enableVertexAttribArray()
 
 1 ?// 顶点着色器,设置坐标和设置尺寸。 2 ????????var VSHADER_SOURCE = 3 ????????????` 4 ????attribute vec4 a_Position; 5 ????attribute float a_PointSize; 6 ????void main(){ 7 ??????gl_Position=a_Position; 8 ??????gl_PointSize=a_PointSize; 9 ????}10 ????`11 12 ????????//片元着色器13 ????????var FSHADER_SOURCE =14 ????????????`15 ????void main(){16 ????????gl_FragColor=vec4(1.0,0.0,0.0,1.0);17 ??????}18 ????`19 20 ????????function main() {21 ????????????var canvas = document.getElementById(‘webgl‘);22 ????????????var gl = getWebGLContext(canvas);23 ????????????if (!gl) {24 ????????????????return;25 ????????????}26 ????????????//初始化着色器27 ????????????if (!initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE)) {28 ????????????????return;29 ????????????}30 31 ????????????//必须初始化着色器后, 获取attribute变量的存储位置 getAttribLocation(program,name);32 ????????????var a_Position = gl.getAttribLocation(gl.program, ‘a_Position‘);33 34 ????????????// 获取大小的存储位置35 ????????????var a_PointSize = gl.getAttribLocation(gl.program, ‘a_PointSize‘);36 37 ????????????if (a_Position < 0) {38 ????????????????console.log(‘a_Position0‘);39 ????????????????return;40 ????????????}41 ????????????// // 将顶点位置传输给attribute42 ????????????// gl.vertexAttrib3f(a_Position,0.0,0.0,.0,0);43 44 ????????????gl.vertexAttrib1f(a_PointSize, 20.0);45 46 ????????????// 设置顶点位置,并返回数量47 ????????????var n = initVertextBuffers(gl);48 ????????????//设置背景色49 ????????????gl.clearColor(0.0, 0.0, 0.0, 1.0);50 ????????????// 清空canvas51 ????????????gl.clear(gl.COLOR_BUFFER_BIT);52 53 ????????????// 绘制一个点 从第一个顶点绘制3个点54 ????????????gl.drawArrays(gl.POINTS, 0, n);55 56 ????????}57 ????????main();58 59 ????????function initVertextBuffers(gl) {60 ????????????// Float32Array 类型化数组执行起来效率更快。 webGL类型化数组与普通数组不同,不支持pop,push方法。61 ????????????var vertices = new Float32Array([0.0, 0.5, -0.5, -0.5, 0.5, -0.5]);62 ????????????var n = 3;//点的个数63 ????????????//创建缓冲区对象64 ????????????var vertexBuffer = gl.createBuffer();65 ????????????if (!vertexBuffer) {66 ????????????????console.log(‘Failed to create the buffer object‘);67 ????????????????return -1;68 ????????????}69 70 ????????????// 将缓冲区对象绑定到目标71 ????????????gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);72 ????????????// 向缓冲区写入数据(只能写在目标)73 ????????????gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);74 ????????????var a_Position = gl.getAttribLocation(gl.program, ‘a_Position‘);75 76 ????????????// 将缓冲区对象分配给a_Position变量77 ????????????gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0);78 79 ????????????// 连接a_Position变量与分配给它的缓冲区对象80 ????????????gl.enableVertexAttribArray(a_Position);81 ????????????return n;82 ????????}
View Code

WebGl通过缓冲区绘制多个点

原文地址:https://www.cnblogs.com/yiluxiangbei/p/10166434.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved