没有这样的事情是gl.viewportWidth
或gl.viewportHeight
如果要设置透视矩阵,则应使用canvas.clientWidth
和canvas.clientHeight
作为透视的输入。无论浏览器缩放画布的大小如何,这些都会为您提供正确的结果。就像您使用 css 设置画布自动缩放一样
<canvas style="width: 100%; height:100%;"></canvas>
...
var width = canvas.clientHeight;
var height = Math.max(1, canvas.clientHeight); // prevent divide by 0
mat4.perspective(45, width / height, 1, 1000, projectionMatrix);
至于视口。使用gl.drawingBufferWidth
和gl.drawingBufferHeight
。这是找到您的绘图缓冲区大小的正确方法
gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
为了清楚起见,这里有几件事混为一谈
canvas.width
, canvas.height
= 您要求画布的绘图缓冲区的大小
gl.drawingBufferWidth
, gl.drawingBufferHeight
= 你实际得到的大小。在 99.99% 的情况下,这将与 ,canvas.width
相同canvas.height
。
canvas.clientWidth
, canvas.clientHeight
= 浏览器显示画布的大小。
看看区别
<canvas width="10" height="20" style="width: 30px; height: 40px"></canvas>
或者
canvas.width = 10;
canvas.height = 20;
canvas.style.width = "30px";
canvas.style.height = "40px";
在这些情况下canvas.width
,将是 10,canvas.height
将是 20,canvas.clientWidth
将是 30,canvas.clientHeight
将是 40。通常将canvas.style.width
和设置canvas.style.height
为百分比,以便浏览器对其进行缩放以适应它所包含的任何元素。
最重要的是,您提出了两件事
- viewport = 通常你希望这是你的drawingBuffer的大小
- 纵横比 = 通常你希望这是你的画布缩放到的大小
鉴于这些定义,用于的宽度和高度viewport
通常与用于的宽度和高度不同aspect ratio
。