You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WebGL基于glMatrix实现lookAt与透视变换时无渲染输出的问题咨询

glMatrix 视图与投影矩阵渲染异常求助
  • 我是3D图形开发领域的新手,正在学习如何使用glMatrix数学库中的lookAt与perspective矩阵。当前阶段暂未计划实现复杂效果,但在开发中发现始终无法得到预期渲染结果。
  • 不使用lookAt与perspective矩阵时是可以正常看到图形的,引入矩阵计算后没有任何内容渲染,我判断是遗漏了某个基础逻辑,希望能获得相关帮助。

核心相关代码

var lookAtMatrix=mat4.create();
var perspectiveMatrix=mat4.create();
var uniformMatrix=mat4.create();

let eye=vec3.fromValues(0,0,1);
let center=vec3.fromValues(0,0,0);
let up=vec3.fromValues(0,1,0);
mat4.lookAt(lookAtMatrix,eye,center,up);
mat4.perspective(perspectiveMatrix,.4*Math.PI,1,-1,10);
mat4.multiply(uniformMatrix,lookAtMatrix,uniformMatrix);
mat4.multiply(uniformMatrix,perspectiveMatrix,uniformMatrix);
gl.uniformMatrix4fv(matrixLocation,false,uniformMatrix);

完整可运行代码片段

着色器代码

const vertexSource = `
attribute vec4 a_position;
uniform mat4 u_matrix;
void main() {
    gl_Position = u_matrix*a_position;
}`;

const fragmentSource = `
precision mediump float;
void main() {
    gl_FragColor = vec4(255,0,0,1);
}`;

WebGL 初始化与渲染逻辑代码

function load() {
  var canvas = document.querySelector("#canvas");
  var gl = canvas.getContext("webgl");
  if(!gl){return;}

  var vertexShader = gl.createShader(gl.VERTEX_SHADER);
  gl.shaderSource(vertexShader,vertexSource);
  gl.compileShader(vertexShader);
  
  var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
  gl.shaderSource(fragmentShader,fragmentSource);
  gl.compileShader(fragmentShader);
  
  var program = gl.createProgram();
  gl.attachShader(program, vertexShader);
  gl.attachShader(program, fragmentShader);
  gl.linkProgram(program);

  matrixLocation=gl.getUniformLocation(program,"u_matrix");
  positionLocation=gl.getAttribLocation(program,"a_position");
  positionBuffer=gl.createBuffer();
  gl.bindBuffer(gl.ARRAY_BUFFER,positionBuffer);
  gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(
    [0,0,0,  .5,.5,0,  .5,0,0,
     0,.1,0,  .5,.6,0,  0,.6,-1]
  ),gl.STATIC_DRAW);
  let bufferLength=6;

  gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);
  gl.clear(gl.COLOR_BUFFER_BIT);
  // gl.enable(gl.CULL_FACE);
  // gl.cullFace(gl.BACK);
  gl.enable(gl.BLEND);
  gl.blendEquation( gl.FUNC_ADD );
  gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
  gl.useProgram(program);

  var lookAtMatrix=mat4.create();
  var perspectiveMatrix=mat4.create();
  var uniformMatrix=mat4.create();

  let eye=vec3.fromValues(0,0,1);
  let center=vec3.fromValues(0,0,0);
  let up=vec3.fromValues(0,1,0);
  mat4.lookAt(lookAtMatrix,eye,center,up);
  mat4.perspective(perspectiveMatrix,.4*Math.PI,1,-1,10);
  mat4.multiply(uniformMatrix,lookAtMatrix,uniformMatrix);
  mat4.multiply(uniformMatrix,perspectiveMatrix,uniformMatrix);
  gl.uniformMatrix4fv(matrixLocation,false,uniformMatrix);

  gl.enableVertexAttribArray(positionLocation);
  gl.bindBuffer(gl.ARRAY_BUFFER,positionBuffer);
  gl.vertexAttribPointer(positionLocation,3,gl.FLOAT,false,0,0);
  gl.drawArrays(gl.TRIANGLES,0,bufferLength);
}
load();

配套样式代码

body {
  margin: 0;
    background-color: wheat;
}

#html{
    background-color: wheat;
}
canvas {
  margin: 0;
    position: absolute;
  width: 90vw;
  height: 90vh;
  left: 5vw;
  top: 5vh;
  display: block;
  background-color: rgba(0,0,0,.1);
}

页面结构代码

<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="animation.css">
 <script src="https://cdnjs.cloudflare.com/ajax/libs/gl-matrix/2.8.1/gl-matrix-min.js"></script>
</head>
<body>
<canvas id="canvas"></canvas>
<script src="animation.js"></script>
</body>
</html>

内容的提问来源于stack exchange,提问作者user1763510

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 22:15:03