Non esiste una cosa è gl.viewportWidth
o gl.viewportHeight
Se si desidera impostare il vostro punto di vista a matrice si dovrebbe usare canvas.clientWidth
e canvas.clientHeight
come gli ingressi alla prospettiva. Quelli ti daranno i risultati corretti indipendentemente da quale dimensione il browser ridimensiona la tela. Come in se si imposta la scala auto canvas con 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);
Per quanto riguarda il viewport. Utilizzare gl.drawingBufferWidth
e gl.drawingBufferHeight
. Questo è il modo corretto per trovare la dimensione della vostra drawingBuffer
gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
Giusto per essere chiari ci sono diverse cose conflated qui
canvas.width
, canvas.height
= formato richiesto drawingBuffer della tela per essere
gl.drawingBufferWidth
, gl.drawingBufferHeight
= dimensioni effettivamente ottenute. Nel 99,99% dei casi questo sarà uguale a canvas.width
, canvas.height
.
canvas.clientWidth
, canvas.clientHeight
= la dimensione del browser sta visualizzando la tela.
Per vedere la differenza
<canvas width="10" height="20" style="width: 30px; height: 40px"></canvas>
o
canvas.width = 10;
canvas.height = 20;
canvas.style.width = "30px";
canvas.style.height = "40px";
In questi casi canvas.width
saranno 10, canvas.height
sarà di 20, canvas.clientWidth
sarà 30, canvas.clientHeight
saranno 40. E 'comune per impostare canvas.style.width
e canvas.style.height
in percentuale in modo che il browser lo ridimensiona per adattarsi a qualsiasi elemento in cui è contenuto.
In cima a che ci sono le 2 cose hai tratto
- viewport = in genere si desidera che questo sia la dimensione del vostro rapporto di aspetto drawingBuffer
- = in genere si desidera che questo sia la dimensione del vostro tela viene scalata a
date queste definizioni la larghezza e l'altezza utilizzata per viewport
spesso non è uguale alla larghezza e altezza utilizzata per aspect ratio
.
Mi dispiace per equivoco intorno a gl.viewportWidth o gl.viewportAltezza, questi parametri assegnati in un momento dopo inizializza gl oggetto (funzione js), quindi gl.viewportWidth = canvas.clientWidth e gl.viewportHeight = canvas.clientHeight. Inoltre, se queste cose fossero state scritte erroneamente, sarebbero state corrette, ma il problema si verifica quando provo a richiamare manualmente la finestra di dialogo, nel caso in cui i parametri trasmessi debbano essere dominanti (vedere il codice).
Per gl.drawingBufferWidth e gl.drawingBufferAltezza, grazie, mi ha davvero aiutato – jorj