首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用lookAt和透视图转换的WebGL和glMatrix最小示例

WebGL是一种基于OpenGL ES的Web图形库,它允许在Web浏览器中进行硬件加速的3D图形渲染。glMatrix是一个用于处理矩阵和向量运算的JavaScript库,它可以与WebGL一起使用来进行3D图形编程。

在WebGL中,lookAt和透视图转换是常用的操作,用于控制相机的视角和投影。lookAt函数用于设置相机的位置、目标点和上方向,以确定相机的观察方向。透视图转换则用于将3D场景投影到2D屏幕上,以实现透视效果。

下面是一个使用WebGL和glMatrix的最小示例:

代码语言:txt
复制
// 获取WebGL上下文
const canvas = document.getElementById('canvas');
const gl = canvas.getContext('webgl');

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

// 定义片元着色器代码
const fragmentShaderSource = `
  void main() {
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
  }
`;

// 创建顶点着色器
const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, vertexShaderSource);
gl.compileShader(vertexShader);

// 创建片元着色器
const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, fragmentShaderSource);
gl.compileShader(fragmentShader);

// 创建着色器程序
const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
gl.useProgram(program);

// 定义顶点数据
const vertices = [
  -0.5, -0.5, 0.0,
  0.5, -0.5, 0.0,
  0.0, 0.5, 0.0
];

// 创建顶点缓冲区
const vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);

// 获取顶点着色器中的属性变量位置
const aPositionLocation = gl.getAttribLocation(program, 'aPosition');
gl.enableVertexAttribArray(aPositionLocation);
gl.vertexAttribPointer(aPositionLocation, 3, gl.FLOAT, false, 0, 0);

// 设置相机位置、目标点和上方向
const eye = [0, 0, 1];
const target = [0, 0, 0];
const up = [0, 1, 0];
const viewMatrix = glMatrix.mat4.create();
glMatrix.mat4.lookAt(viewMatrix, eye, target, up);

// 设置透视投影
const fov = glMatrix.glMatrix.toRadian(45);
const aspect = canvas.width / canvas.height;
const near = 0.1;
const far = 100.0;
const projectionMatrix = glMatrix.mat4.create();
glMatrix.mat4.perspective(projectionMatrix, fov, aspect, near, far);

// 获取顶点着色器中的uniform变量位置
const uModelViewMatrixLocation = gl.getUniformLocation(program, 'uModelViewMatrix');
const uProjectionMatrixLocation = gl.getUniformLocation(program, 'uProjectionMatrix');

// 设置uniform变量的值
gl.uniformMatrix4fv(uModelViewMatrixLocation, false, viewMatrix);
gl.uniformMatrix4fv(uProjectionMatrixLocation, false, projectionMatrix);

// 清空画布并绘制三角形
gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.drawArrays(gl.TRIANGLES, 0, 3);

这个示例演示了如何使用lookAt和透视投影来渲染一个简单的三角形。首先,我们创建了顶点着色器和片元着色器,并编译它们。然后,我们创建了一个着色器程序,并将顶点着色器和片元着色器附加到程序上。接下来,我们创建了一个顶点缓冲区,并将顶点数据绑定到缓冲区上。然后,我们获取顶点着色器中的属性变量位置,并启用顶点属性数组。然后,我们设置相机的位置、目标点和上方向,并创建视图矩阵。接着,我们设置透视投影,并创建投影矩阵。然后,我们获取顶点着色器中的uniform变量位置,并将视图矩阵和投影矩阵传递给它们。最后,我们清空画布并绘制三角形。

推荐的腾讯云相关产品和产品介绍链接地址:

以上是关于使用lookAt和透视图转换的WebGL和glMatrix最小示例的完善且全面的答案。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

6分6秒

使用python进行公历和农历的转换

6分29秒

易点易动上线软件管理模块

12分39秒
2分32秒

052.go的类型转换总结

2分36秒

LabVIEW水箱流量控制系统

3分26秒

Go 语言揭秘:接口类型是 nil 但不等于 nil?

1分20秒

DC电源模块基本原理及常见问题

5分33秒

065.go切片的定义

50秒

DC电源模块的体积与功率之间的关系

14分25秒

071.go切片的小根堆

2分27秒

LabVIEW智能温室控制系统

46秒

振弦传感器采集模块的主要作用

领券