我有一个 Canvas,我正在通过 WebGl 进行绘制。 我的画布尺寸:640 宽 x 480 高。
我在中间画一个简单的正方形。然而我惊讶地发现,当它被绘制时,它看起来有点水平拉伸。
我需要做什么才能使这个正方形看起来合适(没有拉伸)? 请注意,我没有使用任何视口设置。我刚刚完成早期的 WebGL 教程。
您正在绘制 2d 或 3d 正方形吗?如果不看到您的代码,很难知道如何提供帮助。
简短的答案是,在 WebGL 中绘制画布时,从左到右始终处于 -1 到 +1 的空间,从下到上处于 -1 到 +1 的空间。
因此,例如,如果您的画布为 300x150,并且您想在 30,40 处绘制一个 10x20 像素的矩形,则必须以某种方式将 4 个顶点中的每个顶点设置为
gl_Position
注意:该数学运算将使用画布左下角的 y 进行。如果您希望 0 位于画布顶部,请翻转 y。
clipSpaceX = pixelSpaceX * 2 / canvasWidth - 1
clipSpaceY = pixelSpaceY * 2 / canvasHeight - 1
但是获得这些结果的方法有无数种。仅举几个例子 (1) 传递在 JavaScript 中计算的剪辑空间坐标 (2) 传递像素空间坐标并在着色器中进行上述数学运算 (3) 传递单位正方形并进行数学运算以将其扩展为您想要的大小.
这真的取决于你。
问题出在 DPI / 设备像素比 (DPR) 上,可以通过 window.devicePixelRatio 看到。您可以根据此值校正对象大小,您将看到几乎正确的大小(以像素为单位)。