そのようなことはありません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
ます。これが、drawingBufferのサイズを見つける正しい方法です。
gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
明確にするために、ここで混乱していることがいくつかあります
canvas.width
、canvas.height
=キャンバスのdrawingBufferをリクエストしたサイズ
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
その上、あなたが育てた2つのことがあります
- ビューポート=通常、これをdrawingBufferのサイズにします
- アスペクト比=通常、これをキャンバスの拡大縮小サイズにします
これらの定義を考えると、に使用される幅と高さviewport
は、に使用される幅と高さと同じではないことがよくありaspect ratio
ます。