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

WebGL基础知识快速入门

目录

  • WebGL概述
  • WebGL环境搭建

WebGL是一种基于OpenGL ES 2.0的JavaScript API,它允许在Web浏览器中直接进行硬件加速的3D图形渲染。WebGL可以将复杂的3D图形和2D图形直接绘制到HTML的<canvas>元素中,从而实现跨平台的互动3D图形应用,无需插件。

WebGL概述

  • 核心概念:WebGL利用GPU(图形处理器)来渲染图形,这使得它能处理复杂的图形计算,如光照、阴影、纹理贴图等。
  • 着色语言:WebGL使用GLSL(OpenGL Shading Language)编写顶点着色器和片段着色器,用于计算顶点位置和像素颜色。
  • 图形管线:WebGL遵循传统的图形渲染管线,包括顶点处理、图元装配、光栅化等阶段。
  • 上下文获取:通过canvas.getContext('webgl')canvas.getContext('experimental-webgl')获取WebGL渲染上下文。

WebGL环境搭建

1. HTML准备:

创建一个<canvas>元素,这是WebGL绘制图形的画布。

   <canvas id="webgl-canvas"></canvas>

2. 获取WebGL上下文:

在JavaScript中获取canvas元素并初始化WebGL上下文。

   const canvas = document.getElementById('webgl-canvas');
   const gl = canvas.getContext('webgl');
   if (!gl) {
     alert('WebGL not supported');
   }

3. 设置视口和清除颜色:

配置WebGL的视口大小,并清除颜色缓冲区。

   gl.viewport(0, 0, canvas.width, canvas.height);
   gl.clearColor(0.0, 0.0, 0.0, 1.0); // 设置背景色为黑色
   gl.clear(gl.COLOR_BUFFER_BIT); // 清除颜色缓冲区

WebGL代码示例

// 获取WebGL上下文
const canvas = document.getElementById('webgl');
const gl = canvas.getContext('webgl');

// 设置清空颜色为黑色
gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);

// 创建顶点着色器和片段着色器
const vertexShaderSource = `
attribute vec2 position;
void main() {
  gl_Position = vec4(position, 0.0, 1.0);
}
`;

const fragmentShaderSource = `
precision mediump float;
uniform vec4 u_FragColor;
void main() {
  gl_FragColor = u_FragColor;
}
`;

// 编译着色器
function compileShader(type, source) {
  const shader = gl.createShader(type);
  gl.shaderSource(shader, source);
  gl.compileShader(shader);
  if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
    console.error('Shader compile error:', gl.getShaderInfoLog(shader));
    gl.deleteShader(shader);
    return null;
  }
  return shader;
}

const vertexShader = compileShader(gl.VERTEX_SHADER, vertexShaderSource);
const fragmentShader = compileShader(gl.FRAGMENT_SHADER, fragmentShaderSource);

// 创建程序对象并连接着色器
const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
  console.error('Program link error:', gl.getProgramInfoLog(program));
  return;
}
gl.useProgram(program);

// 设置顶点位置
const positionAttributeLocation = gl.getAttribLocation(program, 'position');
gl.enableVertexAttribArray(positionAttributeLocation);
const positionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
const positions = [0, 0];
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);
gl.vertexAttribPointer(positionAttributeLocation, 2, gl.FLOAT, false, 0, 0);

// 设置颜色并绘制
const colorLocation = gl.getUniformLocation(program, 'u_FragColor');
gl.uniform4f(colorLocation, 1.0, 0.0, 0.0, 1.0); // 红色
gl.drawArrays(gl.POINTS, 0, 1); // 绘制一个点

此代码首先设置了WebGL上下文,然后定义了两个着色器:顶点着色器负责确定顶点位置,片段着色器负责决定每个片段(像素)的颜色。接着,它编译和链接这些着色器,并通过一个顶点位置缓冲区在画布中心绘制了一个红色的点。


http://www.kler.cn/news/314690.html

相关文章:

  • 安装nuxt3
  • 「iOS」viewController的生命周期
  • Android TV RecyclerView列表获得焦点左右换行
  • 如何在Mac上安装多个Python环境
  • Spring Mybatis PageHelper分页插件 总结
  • MySQL篇(SQL优化)(持续更新迭代)
  • Android Studio 开发快速获取开发版和发布版SHA1和MD5
  • 汽车美容服务管理系统的数据库设计与数据操作
  • nvm 下载node报错:Could not retrieve https://nodejs.org/dist/index.json.
  • 奇安信渗透2面经验分享
  • HarmonyOS第一课-应用程序框架基础习题答案
  • 邮件安全治理
  • 解决nginx代理SSE接口的响应没有流式返回
  • 详细分析Spring的动态代理机制
  • zynq的PS端mac与RTL8211F的连接要点
  • 微服务架构中的负载均衡与服务注册中心(Nacos)
  • Cursor免费 GPT-4 IDE 工具的保姆级使用教程
  • Spring01
  • C# 中的NPOI 库
  • 生物信息常用编辑器:轻量高效的VS Code
  • 山东潍坊戴尔存储服务器维修 md3800f raid恢复
  • Docker Registry API best practice 【Docker Registry API 最佳实践】
  • 解决mybatis plus 中 FastjsonTypeHandler无法正确反序列化List类型的问题
  • 跨游戏引擎的H5渲染解决方案(腾讯)
  • linux-系统备份与恢复-备份工具
  • uniapp 微信小程序 订阅消息功能实现
  • 大数据实验2.Hadoop 集群搭建(单机/伪分布式/分布式)
  • Flask 设置session 自定义登录验证
  • 提前解锁 Vue 3.5 的新特性
  • Prometheus监控k8s环境构建