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
相关产品推荐
相关产品推荐

