Webgl gl.изменение просмотра
у меня проблема с изменением размера холста и gl.viewport
синхронизации.
Предположим, что я начинаю с обоих холстов 300x300 холст и инициализации gl.viewport
в тех же размерах (gl.vieport(0, 0, 300, 300)
).
После этого в консоли браузера я делаю свои тесты:
я меняю размер моего холста, используя jquery, вызывая что-то вроде
$("#scene").width(200).height(200)
-
после этого я вызываю свой resizeWindow функция:
function resizeWindow(width, height){ var ww = width === undefined? w.gl.viewportWidth : width; var h = height === undefined? w.gl.viewportHeight : height; h = h <= 0? 1 : h; w.gl.viewport(0, 0, ww, h); mat4.identity(projectionMatrix); mat4.perspective(45, ww / h, 1, 1000.0, projectionMatrix); mat4.identity(modelViewMatrix); }
- функция, которая синхронизирует видовое окно с требуемыми размерами.
к сожалению, мой gl.viewport
после этого вызова занимает лишь часть моего холста.
Кто-нибудь может сказать мне, что происходит?
1 ответов
нет такой вещи составляет gl.viewportWidth
или gl.viewportHeight
если вы хотите установить свою матрицу перспективы, вы должны использовать canvas.clientWidth
и canvas.clientHeight
как ваши входы в перспективу. Они дадут вам правильные результаты независимо от того, какой размер браузера масштабирует холст. Как если бы вы установили автоматическую шкалу canvas с помощью 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. Это общий для set canvas.style.width
и canvas.style.height
в процентах, чтобы браузер масштабировал его, чтобы соответствовать любому элементу, в котором он содержится.
кроме того, есть 2 вещи, которые вы подняли
- viewport = обычно вы хотите, чтобы это был размер вашего drawingBuffer
- соотношение сторон = как правило, вы хотите, чтобы это был размер вашего холста масштабируется до
учитывая эти определения, ширина и высота, используемые для viewport
часто не совпадает с шириной и высотой, используемый для aspect ratio
.