首页 > 解决方案 > 如何在OpenGL中改变纹理的位置?

问题描述

我有一个具有以下纹理坐标的纹理

    vec![
        x,
        y,
        0.0, 0.0, // u,v
        layer,
        x + w,
        y,
        1.0, 0.0,
        layer,
        x + w,
        y + h,
        1.0, 1.0,
        layer,
        x,
        y + h,
        0.0, 1.0,
        layer,
    ]

在此处输入图像描述

如何将纹理向下移动 10 个像素。

在此处输入图像描述

但是我想将我的纹理与屏幕像素对齐,我需要做什么计算才能实现这一点?

标签: openglgraphicsrust

解决方案


有两种方法可以做到这一点,这在很大程度上取决于您呈现文本的方式。从您共享的代码看来,您正在渲染一个四边形,该四边形充当角色的轴对齐边界框。在这种情况下,您需要计算归一化空间中像素的尺寸。

处理纹理坐标(即标准化空间为 [0, 1])

关于标准化坐标如何工作的快速提醒。让 sw, sh 以像素为单位表示窗口/画布/绘图区域的宽度和高度。让 nw, nh 为四边形的归一化(即 0 到 1)坐标。那么你的四边形的屏幕坐标仅仅是:

w' = nw * sw

h = nh * sh

单个像素的宽度仅为 1/sw,高度仅为 1/sh,因此将四边形向下移动 10 个像素就相当于将向量添加(1/sw, -1/sh) * 10到 4 个角。或者您可以转换为屏幕空间,添加 (0, -10),然后通过将每个坐标除以相应的屏幕长度来重新归一化。

对于第二个选项,数学保持不变,但不是在屏幕顶点上做,而是在 uvs 上做,但这更适用于当你想在不修改几何图形的情况下偏移纹理采样时,我添加了它为了完整起见。

处理屏幕坐标(即标准化空间为 [-1, 1])

在这种情况下,一维被标准化为长度 2(因为 1- (-1) = 2),而不是上述情况中的长度 1。换句话说,这种情况下的归一化坐标是(x', y') = [(x,y) * 2 - (w, h)] / (w, h) 您可以验证使用上述公式 (0,0) 映射到 (-1,-1) 和 (w,h) 映射到 (1,1)。

这意味着相对偏移的公式只是(ox', oy') = 2 * (ox, oy) / (w, h)因为常数项(w,h)/(w,h)将抵消。


推荐阅读