0

0

如何用WebGL实现一个简单的3D渲染引擎?

夢幻星辰

夢幻星辰

发布时间:2025-09-30 15:02:02

|

579人浏览过

|

来源于php中文网

原创

答案是使用WebGL可构建基础3D渲染引擎:先获取canvas上下文并初始化环境,设置清屏色和深度测试;接着编写GLSL顶点和片元着色器,编译并链接成程序;然后定义几何数据如三角形顶点,上传至GPU缓冲区并与着色器attribute绑定;通过gl-matrix生成模型视图和投影矩阵,并传入uniform变量;最后利用requestAnimationFrame创建渲染循环,持续更新矩阵并调用drawArrays绘制图形。此流程构成了一个完整的最小3D渲染系统,支持后续扩展纹理、光照等功能。

如何用webgl实现一个简单的3d渲染引擎?

要实现一个简单的3D渲染引擎,WebGL 是一个强大的选择。它基于 OpenGL ES,可以直接在浏览器中进行硬件加速的图形渲染。虽然 WebGL 本身比较底层,但通过合理组织代码,你可以构建出一个基础但功能完整的 3D 渲染系统。

初始化 WebGL 上下文

第一步是获取 WebGL 上下文并设置基本的渲染环境。

你需要一个 canvas 元素,并从中获取 WebGL 渲染上下文:

const canvas = document.getElementById('renderCanvas');
const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');

if (!gl) {
  alert('WebGL not supported');
}

// 设置清屏颜色
gl.clearColor(0.1, 0.1, 0.1, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
gl.enable(gl.DEPTH_TEST);

编写着色器程序

WebGL 使用 GLSL 编写着色器。你需要定义顶点着色器和片元着色器来控制渲染流程。

// 顶点着色器
const vsSource = `
  attribute vec3 aPosition;
  uniform mat4 uModelViewMatrix;
  uniform mat4 uProjectionMatrix;
  void main() {
    gl_Position = uProjectionMatrix * uModelViewMatrix * vec4(aPosition, 1.0);
  }
`;

// 片元着色器
const fsSource = `
  precision mediump float;
  void main() {
    gl_FragColor = vec4(1.0, 0.8, 0.4, 1.0); // 橙色
  }
`;

接下来编译着色器并链接成程序:

function createShader(gl, type, source) {
  const shader = gl.createShader(type);
  gl.shaderSource(shader, source);
  gl.compileShader(shader);
  if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
    console.error(gl.getShaderInfoLog(shader));
    gl.deleteShader(shader);
    return null;
  }
  return shader;
}

const vertexShader = createShader(gl, gl.VERTEX_SHADER, vsSource);
const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fsSource);

const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);

if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
  console.error('Failed to link program:', gl.getProgramInfoLog(program));
}

gl.useProgram(program);

准备几何数据与矩阵变换

定义一个简单的 3D 立方体或三角形的顶点数据,并上传到 GPU 的缓冲区。

情感家园企业站5.0 多语言多风格版
情感家园企业站5.0 多语言多风格版

一套面向小企业用户的企业网站程序!功能简单,操作简单。实现了小企业网站的很多实用的功能,如文章新闻模块、图片展示、产品列表以及小型的下载功能,还同时增加了邮件订阅等相应模块。公告,友情链接等这些通用功能本程序也同样都集成了!同时本程序引入了模块功能,只要在系统默认模板上创建模块,可以在任何一个语言环境(或任意风格)的适当位置进行使用!

下载
const vertices = [
  -0.5, -0.5, 0.5,
   0.5, -0.5, 0.5,
   0.0,  0.5, 0.5
]; // 一个三角形面

const positionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);

将缓冲区连接到着色器中的 attribute:

const positionLocation = gl.getAttribLocation(program, 'aPosition');
gl.enableVertexAttribArray(positionLocation);
gl.vertexAttribPointer(positionLocation, 3, gl.FLOAT, false, 0, 0);

使用 gl-matrix 或自己实现简单的矩阵运算,生成投影和视图矩阵:

// 示例:使用 gl-matrix
const modelViewMatrix = mat4.create();
const projectionMatrix = mat4.create();

mat4.perspective(projectionMatrix, Math.PI / 4, canvas.width/canvas.height, 0.1, 100.0);
mat4.translate(modelViewMatrix, modelViewMatrix, [0.0, 0.0, -5.0]);

传入 uniform 变量:

const mvMatrixLoc = gl.getUniformLocation(program, 'uModelViewMatrix');
const projMatrixLoc = gl.getUniformLocation(program, 'uProjectionMatrix');
gl.uniformMatrix4fv(mvMatrixLoc, false, modelViewMatrix);
gl.uniformMatrix4fv(projMatrixLoc, false, projectionMatrix);

渲染循环

使用 requestAnimationFrame 实现持续渲染。

function render() {
  gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);

  // 更新模型矩阵(例如旋转)
  mat4.rotateY(modelViewMatrix, modelViewMatrix, 0.01);
  gl.uniformMatrix4fv(mvMatrixLoc, false, modelViewMatrix);

  gl.drawArrays(gl.TRIANGLES, 0, 3); // 绘制三角形
  requestAnimationFrame(render);
}
render();

基本上就这些。你已经搭建了一个最简的 3D 渲染流程:初始化上下文、加载着色器、上传几何数据、应用变换矩阵、进入渲染循环。在此基础上,可以逐步扩展支持纹理、光照、模型加载、摄像机控制等功能。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

580

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

103

2025.10.23

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

237

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

479

2024.03.01

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

783

2023.08.22

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

228

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

297

2023.10.25

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

532

2023.09.20

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

54

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何进行WebSocket调试
如何进行WebSocket调试

共1课时 | 0.1万人学习

TypeScript全面解读课程
TypeScript全面解读课程

共26课时 | 5.1万人学习

前端工程化(ES6模块化和webpack打包)
前端工程化(ES6模块化和webpack打包)

共24课时 | 5.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号