opengl - 如何在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 个像素。
但是我想将我的纹理与屏幕像素对齐,我需要做什么计算才能实现这一点?
解决方案
有两种方法可以做到这一点,这在很大程度上取决于您呈现文本的方式。从您共享的代码看来,您正在渲染一个四边形,该四边形充当角色的轴对齐边界框。在这种情况下,您需要计算归一化空间中像素的尺寸。
处理纹理坐标(即标准化空间为 [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)
将抵消。
推荐阅读
- java - 仅当我在其中一个线程中收到回调时才释放 CountDownLatch
- python - 在python中将数字转换为字符串中的单词
- python - 在 Python BOXSDK 中不工作 JWT 身份验证
- r - 按行从数据框中的列中提取公共子字符串
- android - RecyclerView 中没有数据
- asp.net - ASP.NET MVC:如何在表格中显示 int 评级值?
- angular - Angular ng build 不生成 dist 文件夹
- java - 无法使用 SavedModelBundle 在 java 中加载 Tensorflow 模型
- android - 升级到 OkHttp 4.7.0 或更高版本后使用 Robolectric 时出现“没有此类提供程序:BCJSSE”
- c# - 检查网站表中的值是否已存在于 IEnumerable 中