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

百度seo搜索引擎优化网站seo优化方案设计

百度seo搜索引擎优化,网站seo优化方案设计,网站自动抢注,苏州企业网站建设公司价格1. 环境搭建 1.1 获取 Canvas 元素和 WebGL 上下文 在 WebGL 中&#xff0c;我们通常使用<canvas>元素作为绘图区域&#xff0c;通过getContext方法获取 WebGL 上下文对象。 // 获取canvas const canvas document.querySelector(canvas); // 获取webgl上下文对象&…

1. 环境搭建

1.1 获取 Canvas 元素和 WebGL 上下文

在 WebGL 中,我们通常使用<canvas>元素作为绘图区域,通过getContext方法获取 WebGL 上下文对象。

// 获取canvas
const canvas = document.querySelector('canvas');
// 获取webgl上下文对象,注意选择webgl的1.0版本,2.0版本有一些语法不一样
const gl = canvas.getContext('webgl');

解释

  • document.querySelector('canvas'):通过选择器获取 HTML 文档中的<canvas>元素。
  • canvas.getContext('webgl'):从<canvas>元素中获取 WebGL 上下文对象gl,后续的 WebGL 操作都将基于这个上下文对象进行。
1.2 初始化着色器

着色器是 WebGL 中用于处理图形渲染的程序,分为顶点着色器和片元着色器。我们需要将着色器源码编译并链接成一个可执行的程序。

import { initShader } from '../lib';
import fragShader from '../shader/xxx/fragShader.glsl';
import vertexShader from '../shader/xxx/vertexShader.glsl';// fragShader和vertexShader引入之后是字符串,需要被编译为可执行的程序
const program = initShader(gl, vertexShader, fragShader);

initShader函数实现

export function initShader(gl, vshader_source, fshader_source) {// 创建着色器const vertexShader = createShaderFromString(gl,gl.VERTEX_SHADER,vshader_source);const fragmentShader = createShaderFromString(gl,gl.FRAGMENT_SHADER,fshader_source);// 创建一个程序对象 操作手,专门负责javaScript和shader着色器的通讯const program = gl.createProgram();gl.attachShader(program, vertexShader);gl.attachShader(program, fragmentShader);// 将javascrpt和程序对象关联gl.linkProgram(program);// 使用程序对象gl.useProgram(program);// 返回程序对象return program;
}

解释

  • gl.createShader(type):创建一个指定类型(gl.VERTEX_SHADERgl.FRAGMENT_SHADER)的着色器对象。
  • gl.shaderSource(shader, source):将着色器源码source赋值给着色器对象shader
  • gl.compileShader(shader):编译着色器对象。
  • gl.createProgram():创建一个 WebGL 程序对象。
  • gl.attachShader(program, shader):将着色器对象附加到程序对象上。
  • gl.linkProgram(program):链接程序对象,将顶点着色器和片元着色器组合成一个可执行的程序。
  • gl.useProgram(program):使用指定的程序对象进行渲染。

2. 数据传递

2.1 Attribute 变量传值

Attribute 变量用于在顶点着色器中接收顶点数据,通常是每个顶点都有不同的值。

// 获取attribute变量的内存地址
const a_Position = gl.getAttribLocation(program, 'a_Position');
// 往内存地址中写入数据
const point = [0.5, 0.5];
gl.vertexAttrib2f(a_Position, ...point);

解释

  • gl.getAttribLocation(program, 'a_Position'):获取顶点着色器中a_Position变量的内存地址。
  • gl.vertexAttrib2f(a_Position, ...point):将二维坐标point的值传递给a_Position变量。
2.2 Uniform 变量传值

Uniform 变量用于在顶点着色器和片元着色器中传递全局常量,所有顶点都使用相同的值。

const u_ScreenSize = gl.getUniformLocation(program, 'u_ScreenSize');
gl.uniform2f(u_ScreenSize, canvas.width, canvas.height);

解释

  • gl.getUniformLocation(program, 'u_ScreenSize'):获取程序对象中u_ScreenSize变量的内存地址。
  • gl.uniform2f(u_ScreenSize, canvas.width, canvas.height):将画布的宽度和高度作为二维向量传递给u_ScreenSize变量。

3. 缓冲区对象

缓冲区对象用于存储大量的顶点数据,提高数据传输效率。

// 1.创建顶点数据对象
const vertices = new Float32Array([0, 0.5,-0.5, -0.5,0.5, -0.5,
]);// 2.创建缓冲区对象
const buffer = gl.createBuffer();// 3.绑定缓冲区对象的用途
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);// 4.向缓冲区中写入数据
gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);// 5.设置attribute变量对缓冲区的访问规则
const a_Position = gl.getAttribLocation(program, 'a_Position');
gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0);// 6.启动数据读取
gl.enableVertexAttribArray(a_Position);

解释

  • gl.createBuffer():创建一个缓冲区对象。
  • gl.bindBuffer(target, buffer):将缓冲区对象buffer绑定到指定的目标targetgl.ARRAY_BUFFER用于存储顶点数据)。
  • gl.bufferData(target, data, usage):将数据data写入到绑定的缓冲区对象中,usage指定数据的使用方式(gl.STATIC_DRAW表示数据不会频繁更改)。
  • gl.vertexAttribPointer(location, size, type, normalized, stride, offset):设置attribute变量对缓冲区的访问规则。
    • locationattribute变量的内存地址。
    • size:每个顶点的分量个数。
    • type:数据的格式。
    • normalized:是否需要归一化。
    • stride:连续顶点属性之间的间隔。
    • offset:顶点属性在数组中的偏移量。
  • gl.enableVertexAttribArray(location):启动对attribute变量的数据读取。

4. 绘制操作

4.1 gl.drawArrays

gl.drawArrays用于从缓冲区中读取顶点数据并进行绘制。

gl.drawArrays(gl.POINTS, 0, 3);

解释

  • gl.drawArrays(mode, first, count)
    • mode:指定绘制的模式,如gl.POINTS(点)、gl.LINES(线)、gl.TRIANGLES(三角形)等。
    • first:从第几个顶点开始绘制。
    • count:要绘制的顶点数量。
4.2 gl.drawElements

gl.drawElements用于通过索引缓冲区来绘制图形,适用于多个顶点共享的情况。

const indices = new Uint16Array([0, 1, 2]);
const indexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);
gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_SHORT, 0);

解释

  • gl.createBuffer():创建一个索引缓冲区对象。
  • gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, buffer):将缓冲区对象绑定到索引缓冲区目标。
  • gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW):将索引数据写入到索引缓冲区中。
  • gl.drawElements(mode, count, type, offset)
    • mode:绘制模式。
    • count:要绘制的索引数量。
    • type:索引数据的类型。
    • offset:索引数据在缓冲区中的偏移量。

5. 矩阵变换

在 WebGL 中,我们通常使用矩阵来实现视图和投影变换。

import { mat4 } from 'gl-matrix';// 创建视图矩阵
const createViewMatrix = () => {const viewMatrix = mat4.create();// 创建视图矩阵,三个参数,相机位置,注视的坐标,上方向mat4.lookAt(viewMatrix, [vModelView.viewX, vModelView.viewY, vModelView.viewZ],[vModelView.lookAtX, vModelView.lookAtY, vModelView.lookAtZ], [0, 1, 0]);gl.uniformMatrix4fv(u_ViewMatrix, false, viewMatrix);
};// 创建投影矩阵
const createProjMatrix = () => {const projMatrix = mat4.create();// 创建正交投影矩阵mat4.orthoNO(projMatrix, ...Object.values(vModelProj));gl.uniformMatrix4fv(u_ProjMatrix, false, projMatrix);
};

解释

  • mat4.create():创建一个 4x4 的单位矩阵。
  • mat4.lookAt(out, eye, center, up):创建一个视图矩阵,eye表示相机位置,center表示注视的坐标,up表示上方向。
  • mat4.orthoNO(out, left, right, bottom, top, near, far):创建一个正交投影矩阵。
  • gl.uniformMatrix4fv(location, transpose, value):将 4x4 矩阵value传递给uniform变量locationtranspose表示是否需要转置矩阵。

6. 深度检测

深度检测用于判断物体的正确遮挡关系,确保离相机近的物体遮挡离相机远的物体。

// 深度检测,用来判断物体的正确遮挡关系
gl.enable(gl.DEPTH_TEST);

解释

  • gl.enable(capability):启用指定的功能,gl.DEPTH_TEST表示启用深度检测。

7. 动画循环

使用requestAnimationFrame实现动画循环,不断更新和重绘场景。

let angleX = 0;
let angleY = 0;
const render = () => {gl.clearColor(0, 0, 0, 1);gl.clear(gl.COLOR_BUFFER_BIT);angleX += 1;angleY += 1;cube.rotation = [angleX, angleY, 0];gl.drawElements(gl.TRIANGLES, cube.count, gl.UNSIGNED_SHORT, 0);requestAnimationFrame(render);
};render();

解释

  • requestAnimationFrame(callback):请求浏览器在下次重绘之前调用callback函数,实现动画循环。

文章转载自:

http://IPXnz0fT.bkpbm.cn
http://X6wufdKo.bkpbm.cn
http://w4BqCiJV.bkpbm.cn
http://mqhLI5ho.bkpbm.cn
http://6sMk9Hwy.bkpbm.cn
http://aPEPibu0.bkpbm.cn
http://GUOALtGe.bkpbm.cn
http://xDnPuJcf.bkpbm.cn
http://k83yv4Yr.bkpbm.cn
http://0hg0blt7.bkpbm.cn
http://xqGenrS2.bkpbm.cn
http://9Xv87ER9.bkpbm.cn
http://k6CW62MJ.bkpbm.cn
http://QGzHsAct.bkpbm.cn
http://tbk1kG9H.bkpbm.cn
http://wswvtE6j.bkpbm.cn
http://mDvD7TnJ.bkpbm.cn
http://ni4BcOXp.bkpbm.cn
http://Mtq0Abtd.bkpbm.cn
http://dTKElXgY.bkpbm.cn
http://NR3hb8nL.bkpbm.cn
http://sDy0AaDy.bkpbm.cn
http://osw16u2e.bkpbm.cn
http://j2N2hI5x.bkpbm.cn
http://3NK2kps8.bkpbm.cn
http://f0UAjpLf.bkpbm.cn
http://qNRNg5t4.bkpbm.cn
http://r0n8ZRcN.bkpbm.cn
http://nOV7kK8k.bkpbm.cn
http://WSJiGrhY.bkpbm.cn
http://www.dtcms.com/wzjs/667638.html

相关文章:

  • 宿迁网站建设方案服装设计师接单网站
  • 怎样建立网站免费的室内设计工作室网站怎么做
  • 深圳市营销型网站建设wordpress 产品页 如何关联
  • 中小学网站建设规范企业网站管理系统程序名称
  • sql数据库环境网站搭建教程平台手机app开发
  • 自助外贸网站制作网站不备案怎么做网页淘宝客
  • 怎么把做的网站放到腾讯云里面多少钱 网站建设
  • 婚纱照网站模板石家庄最新新闻
  • wordpress枚举用户名网站优化方法
  • 钦州建设局网站帮别人做非法网站自首
  • 网站的对比怎么样制作网站教程
  • 礼品公司网站模板惠州百优做网站小程序熊掌号
  • 平顶山北京网站建设云浮罗定哪有做网站的
  • 如何开网站建设公司深圳网络营销公司
  • 网站必须备案衡水电商网站建设
  • 成都h5建站库存管理软件永久免费版
  • 建设网站用英文怎么说网站建设领导小组
  • 做营销网站企业做网站平台的公司
  • 做机械设计兼职的网站快排seo排名软件
  • 装修平台网站排名前十名有哪些如何用群晖做自己的网站
  • 网站的关键词在哪里设置wordpress首页乱码
  • 浙江常规网站建设自定义表情在线制作
  • 国内好看的网站设计江阴市网站建设
  • 整站关键词排名优化wordpress获取数组长度
  • 怎样查网站备案德阳网站怎么做seo
  • 邯郸网站优化技巧网站栏目功能分析
  • 高端网站设计地址福建网站建设优化
  • 域名购买成功后网站怎么建设网架公司起名
  • 私人做网站网页设计网站长沙
  • 网站qq启动链接怎么做阳明拍卖公司网站