NPS*_*NPS 9 canvas viewport webgl
我希望我的webgl应用程序视口和画布对浏览器窗口大小更改(包括F11按钮)做出反应.即我希望画布始终是100%宽度和高度,我希望视口大小和宽高比是合适的.前者我用简单的方法实现:
<canvas style="width: 100%; height:100%;">
Run Code Online (Sandbox Code Playgroud)
虽然我不确定这是否可行.后者我试图用我在这里找到的一些信息来实现:Webgl gl.viewport改变但显然我做错了.我意识到:
canvas.onresize = resizeViewport;
Run Code Online (Sandbox Code Playgroud)
这是错误的,因为画布的大小不会经常变化(它总是100%的宽度和高度),但我不知道我应该怎么做.
这是该应用程序的在线版本:http://nps.netarteria.pl/gallery.
gma*_*man 11
我认为这有效:
var canvas;
var gl;
function render() {
gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);
// Draw a 1 pixel border around the edge using
// the scissor test since it's easier than setting up
// a lot of stuff
gl.clearColor(1, 0, 0, 1); // red
gl.disable(gl.SCISSOR_TEST);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.enable(gl.SCISSOR_TEST);
gl.scissor(1, 1, gl.canvas.width - 2, gl.canvas.height - 2);
gl.clearColor(0, 0, 1, 1); // blue
gl.clear(gl.COLOR_BUFFER_BIT);
};
function resizeCanvas() {
var width = canvas.clientWidth;
var height = canvas.clientHeight;
if (canvas.width != width ||
canvas.height != height) {
canvas.width = width;
canvas.height = height;
// in this case just render when the window is resized.
render();
}
}
function main() {
canvas = document.getElementById("c");
gl = canvas.getContext("webgl");
resizeCanvas();
}
window.addEventListener('resize', resizeCanvas);
main();Run Code Online (Sandbox Code Playgroud)
body {
margin: 0;
}
#c {
width: 100vw;
height: 100vh;
display: block;
}Run Code Online (Sandbox Code Playgroud)
<canvas id="c"></canvas>Run Code Online (Sandbox Code Playgroud)
据我所知,调整大小只适用于窗口.遗憾的是,HTML5规范没有将resize事件添加到其他元素.
注意:如果您总是渲染(例如游戏),那么您不需要监听resize事件.只需在渲染循环开始时调用resizeCanvas.如果浏览器调整了画布的大小,无论其容器如何,代码都会看到大小不再匹配并更新画布的drawingbuffer的大小.
用于渲染画布的正确视口大小几乎总是:
// Set the viewport to be the size of the canvas's drawingBuffer.
gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);
Run Code Online (Sandbox Code Playgroud)
如果您使用的是典型的3D数学库,那么您还有一个投影矩阵和一个函数 - 通常称为perspectivefieidOfView,aspect,zNear和zFar参数.几乎所有WebGL程序的正确方面是:
// Set the aspect of our perspective matrix to match the size
// the canvas is displayed at.
var aspect = gl.canvas.clientWidth / gl.canvas.clientHeight
???.perspective(fieldOfView, aspect, zNear, zFar);
Run Code Online (Sandbox Code Playgroud)
显然你需要缓存clientWidth和clientHeight.原因是设置canvas.width会改变可以改变的CSS布局clientHeight
更新了上面的代码.
从使用100%到切换100vw,100vw因为这些可以说更正确.它们描述了你想要的是什么,使画布成为视口的大小,而前一个解决方案使画布成为文档的大小,然后尝试强制文档为窗口的大小.由于文档的内容可能大于可能被认为是错误解决方案的窗口.
| 归档时间: |
|
| 查看次数: |
16831 次 |
| 最近记录: |