繁体   English   中英

WebGL canvas 大小更改不会随着视口更改而更新

[英]WebGL canvas size change doesn't update per viewport change

我有以下代码用于调整 canvas 的大小并保持纵横比相同。 它工作正常,但仅在初始 WebGL 加载时。 我可以在控制台中看到,每次 window 使用window.addEventListener('resize', resizeCanvas); ,但实际的 GL canvas 保持不变,直到再次刷新页面。

function resizeCanvas(canvas) {
            const displayWidth  = window.innerWidth;
            const displayHeight = window.innerHeight;
         
            // Check if the canvas is not the same size.
            const needResize = gl.canvas.width  !== displayWidth ||
                             canvas.height !== displayHeight;
            
            canvasAspect = displayWidth / displayHeight;
            imageAspect = 3 / 4;
            imageMaxWidth = 900;
            imageMaxHeight = 1200;

            if (needResize) {
                if (displayWidth <= imageMaxWidth) {
                    canvas.width = displayWidth;
                    canvas.height = Math.round(displayHeight * canvasAspect / imageAspect);
                } if (displayWidth > imageMaxWidth) {
                    canvas.width = imageMaxWidth;
                    canvas.height = imageMaxHeight;
                } if (displayHeight <= imageMaxHeight) {
                    canvas.width = Math.round(displayWidth * imageAspect / canvasAspect);;
                    canvas.height = displayHeight;
                }
            }       
            
            gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);
            gl.clear(gl.COLOR_BUFFER_BIT);

            return needResize;
        }

        window.addEventListener('resize', resizeCanvas);

这是图像和 function 加载的地方。

const loadImage = (d,i) => {
                gl.uniform1i(gl.getUniformLocation(p,`t${i+1}`), i);
                
                const srcType = gl.UNSIGNED_BYTE;
                const img = new Image();
                img.onload = function(){
                        const [textureWidth, textureHeight] = [img.naturalWidth, img.naturalHeight];
                        gl.uniform2f(gl[`t${(i+1)}res`], textureWidth, textureHeight); 
                        gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
                        gl.activeTexture(i=== 0 ? gl.TEXTURE0 : gl.TEXTURE1);
                        gl.bindTexture(gl.TEXTURE_2D, gl.createTexture());
                        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
                        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
                        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
                        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
                        gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, srcType, this);
                        if(i === images.length - 1){
                            gl_update(gl);                  
                        }
                }
                img.src = d;
        }

        const tmp = start_gl("canvas1", getStringFromDOMElement('vs'), getStringFromDOMElement('fs'));
        const gl = tmp.gl;
        const p = tmp.program;

        const images = ["001.jpg","002.jpg"];

        images.map(loadImage);

        resizeCanvas(gl.canvas);
        gl_update(gl);

更改 canvas 的高度和宽度与显示 webgl 上下文的分辨率有关。您要做的是更改 webgl 视口的大小以反映 innerWidth/innerHeight 的大小。

gl.viewport(0,0,canvas.width,canvas.height);

将在 canvas 内设置 webgl 视口以反映适当的大小,这样当您将导航器调整到原来的一半时,您不会看到一半的观察圈消失。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM