Matrix 如何在webgl中缩放纹理?
我有一个尺寸为800x600的纹理。如何在webglMatrix 如何在webgl中缩放纹理?,matrix,webgl,aspect-ratio,Matrix,Webgl,Aspect Ratio,我有一个尺寸为800x600的纹理。如何在webgl上以另一种尺寸缩放它,并保持原始纵横比?假设绘图缓冲区和画布具有相同的尺寸。如果WebGL只关心ClipsAppe坐标,您可以只绘制一个2个单位的四边形(-1到+1),并根据画布的纵横比和图像的纵横比对其进行缩放 换句话说 const canvasAspect = canvas.clientWidth / canvas.clientHeight; const imageAspect = image.width / image.heigh
上以另一种尺寸缩放它,并保持原始纵横比?假设绘图缓冲区和画布具有相同的尺寸。如果WebGL只关心ClipsAppe坐标,您可以只绘制一个2个单位的四边形(-1到+1),并根据画布的纵横比和图像的纵横比对其进行缩放
换句话说
const canvasAspect = canvas.clientWidth / canvas.clientHeight;
const imageAspect = image.width / image.height;
let scaleY = 1;
let scaleX = imageAspect / canvasAspect;
请注意,您需要决定如何适合图像scaleY=1
意味着图像将始终垂直适合,而水平适合任何结果
如果希望它水平安装,则需要将scaleX设为1
let scaleX = 1;
let scaleY = canvasAspect / imageAspect;
如果希望它包含,则
let scaleY = 1;
let scaleX = imageAspect / canvasAspect;
if (scaleX > 1) {
scaleY = 1 / scaleX;
scaleX = 1;
}
let scaleY = 1;
let scaleX = imageAspect / canvasAspect;
if (scaleX < 1) {
scaleY = 1 / scaleX;
scaleX = 1;
}
如果您想让它覆盖,那么
let scaleY = 1;
let scaleX = imageAspect / canvasAspect;
if (scaleX > 1) {
scaleY = 1 / scaleX;
scaleX = 1;
}
let scaleY = 1;
let scaleX = imageAspect / canvasAspect;
if (scaleX < 1) {
scaleY = 1 / scaleX;
scaleX = 1;
}
垂直安装
水平安装
包含
盖
鉴于WebGL只关心ClipsAppe坐标,您只需绘制一个2个单位的四边形(-1到+1),并根据画布的纵横比和图像的纵横比对其进行缩放
换句话说
const canvasAspect = canvas.clientWidth / canvas.clientHeight;
const imageAspect = image.width / image.height;
let scaleY = 1;
let scaleX = imageAspect / canvasAspect;
请注意,您需要决定如何适合图像scaleY=1
意味着图像将始终垂直适合,而水平适合任何结果
如果希望它水平安装,则需要将scaleX设为1
let scaleX = 1;
let scaleY = canvasAspect / imageAspect;
如果希望它包含,则
let scaleY = 1;
let scaleX = imageAspect / canvasAspect;
if (scaleX > 1) {
scaleY = 1 / scaleX;
scaleX = 1;
}
let scaleY = 1;
let scaleX = imageAspect / canvasAspect;
if (scaleX < 1) {
scaleY = 1 / scaleX;
scaleX = 1;
}
如果您想让它覆盖,那么
let scaleY = 1;
let scaleX = imageAspect / canvasAspect;
if (scaleX > 1) {
scaleY = 1 / scaleX;
scaleX = 1;
}
let scaleY = 1;
let scaleX = imageAspect / canvasAspect;
if (scaleX < 1) {
scaleY = 1 / scaleX;
scaleX = 1;
}
垂直安装
水平安装
包含
盖
我不能真正理解这部分:v_texcoord=position.xy*.5+.5代码>(事实上,如果我忽略它,我会在重复边的情况下拉伸纹理)。位置坐标从-1到+1。乘以.5,再加上.5,它们将从0变为1,这就是您希望在四边形上显示整个纹理的内容。看,我能得到一些关于你是如何得到缩放公式的提示吗?我最近遇到了一个缩放问题。我在x方向拉伸,也就是说,用一些值水平拉伸,并做scaleY=scaleX/图像的纵横比。这里scaleX只是一些数字。图像是缩放的,但看起来在x方向拉伸有两个方面。画布的纵横比和图像的纵横比(还有四坐标的纵横比,但在上面的示例中,其纵横比为1.0,因此可以忽略)。设置scaleY=1和scaleX=1/canvasAspect将使四边形在画布上绘制时成为方形。但我们需要将其缩放为画布上的imageAspect。你应该在一个新问题中将你的代码作为一个片段发布。我真的不理解这部分:v_texcoord=position.xy*.5+.5代码>(事实上,如果我忽略它,我会在重复边的情况下拉伸纹理)。位置坐标从-1到+1。乘以.5,再加上.5,它们将从0变为1,这就是您希望在四边形上显示整个纹理的内容。看,我能得到一些关于你是如何得到缩放公式的提示吗?我最近遇到了一个缩放问题。我在x方向拉伸,也就是说,用一些值水平拉伸,并做scaleY=scaleX/图像的纵横比。这里scaleX只是一些数字。图像是缩放的,但看起来在x方向拉伸有两个方面。画布的纵横比和图像的纵横比(还有四坐标的纵横比,但在上面的示例中,其纵横比为1.0,因此可以忽略)。设置scaleY=1和scaleX=1/canvasAspect将使四边形在画布上绘制时成为方形。但我们需要将其缩放为画布上的imageAspect。您应该在新问题中以代码片段的形式发布代码。