【发布时间】:2020-05-24 08:29:16
【问题描述】:
我想在 WebGL 中绘制图像,但缩小了尺寸。当我不缩放时,图像质量很好,但如果我将其缩小,则图像质量很差。
我从这里读到了“在 WebGL 中处理高 DPI(视网膜)显示”:http://www.khronos.org/webgl/wiki/HandlingHighDPI,我也尝试过这样做。我在 WebGL 中的代码是:
Initializations:
var devicePixelRatio = window.devicePixelRatio || 1;
gl.canvas.style.width = "800px";
gl.canvas.style.height = "600px";
canvas.width = Math.round(800 * devicePixelRatio);
canvas.height = Math.round(600 * devicePixelRatio);
For drawing:
gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
matrix = m3.scale(matrix, 28/800, 35/600); // matrix for scaling texture
Textures:
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_MIN_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
但这与 HTML 图像的质量不同。我的 HTML 代码是:
setTimeout(function() {
var imagine = new Image();
imagine.src = 'Tank.png';
imagine.width = '28';
imagine.height = '35';
document.body.appendChild(imagine);
}, 1000);
我在画布中的代码是:
var imagine = new Image();
imagine.src = 'Tank.png';
imagine.width = '28';
imagine.height = '35';
imagine.onload = function() {
context.drawImage(imagine, 0, 0, 28, 35);
}
context = canvas.getContext('2d');
图片质量的区别如下(质量:WebGL
我知道这不是一个很大的区别,但我真的想展示高质量的图片。在 HTML 中,图片更平滑。我观察到,如果我放大 Chrome 浏览器,来自 HTML 的图片质量会提高,但 WebGL 图片保持相同的分辨率并且会降低质量。如果我刷新页面,为 WebGL 更新 devicePixelRatio,那么图片的质量会更好,但我的浏览器在 500% 缩放时运行速度较慢,我认为是因为它使画布更大并且必须绘制更多。但是在 HTML 中,如果我以 500% 的缩放比例移动图像,则没有问题,图像移动得很好,质量也很好。
在这种情况下 - WebGL image rendering bad quality - 图像未缩放,但我需要缩小图片。
与这种情况相比 - canvas drawImage quality - 我在所有三个程序中都将值作为整数。
最后一个问题:
如何在 webGL 中以与在 HTML 中相同的质量(看不到这些轨道中的线条)绘制图像,并且即使浏览器放大也能获得良好的质量?我还有什么其他的可能性来画它们?我应该使用什么技术?我想使用 WebGL,因为它有一些 HTML 没有的功能,我想从头开始绘制一些东西,比如线条或点。
编辑 1:这是正常分辨率的图片。
在这张图片中,轨道的线条似乎不是笔直的,而是交叉的。如果您可以近距离观察 Canvas 和 WebGL 中的图像,轨道的第一行,首先在左侧,然后在右侧,它们是笔直的。更多的是,带有 Canvas 的图片有更多的直线轨道,甚至是最后一条。 HTML的最后一个图像具有相同形状的所有轨道。
对不起,因为我放了非常小的图片。这是因为我需要这个比例,我需要那些图片不要更大。如果我要画更大的图片,那么 devicePixelRatio 会使图片看起来更好,但我不使用正常尺寸的图片。这样,问题就可以通过 devicePixelRatio 解决。对于较小的尺寸,这种带有 devicePixelRatio 的方法对我没有帮助。这就是我寻找其他解决方案的原因。
【问题讨论】:
-
如果这些图像是根据您在它们上面建立的顺序排列的:第一张图像看起来清晰而完美,其他两张看起来模糊到无用的地步。所以 webgl 赢了。如果您的图像排序与代码排序不同:请解决此问题。
-
是的,第一张照片可能看起来很完美,但轨道画得不好。也许有更多的细节试图融入其中,但看起来并不好。当然,第二个和第三个是模糊的,但是因为它们不强制绘制像素,它们看起来更好。第三个看起来比其他更好,因为它没有第二个模糊。我不喜欢那种清脆的感觉,这就是为什么我说那个图像画得有点差。如果你仔细看,第一张和第二张图片的第一条线是笔直的,但第三张没有。第三个所有线条都有点弯曲
-
请提供完整的原始图像(原始分辨率),因为无法知道创意质量如何。
标签: javascript html image canvas webgl