首页
学习
活动
专区
工具
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最小示例的完善且全面的答案。

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

相关·内容

没有搜到相关的沙龙

领券