opengl 从片段着色器中的纹理采样,UV与透视成比例

m4pnthwp  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(162)

在片段着色器中:
如果我有一个纹理(视口大小)上传为一个统一的sampler 2D。该纹理是渲染到一个较早的通道。当前运行的片段对应于1:1的纹理在UV空间。片段着色器采样周围的像素在纹理的基础上,delta 值。

如何保持 delta 与相机透视成比例?

例如:delta 是世界空间中的1个单位。
如果有帮助的话,你可以假设:
相机具有正交投影。
你可以访问碎片的世界位置。
视口/纹理-分辨率:(一二八○年,七二○年)

编辑

下面是我认为我可以做的:
CPU上的每一帧(或当摄像机投影改变时):
(sudo代码)
Mat 4组合=相机.投影()* 相机.视图();
Vec 4世界_增量= Vec 4(1,1,0,0);//不是位置
Vec 2 ndc_delta =(组合的 * 世界_delta).xy;
Vec2的uv_delta = ndc_delta / 2;
(uv_delta);

uidvcgyl

uidvcgyl1#

我把问题搞复杂了。我不懂正投影。

如何保持 delta 与相机透视成比例?

视口[16,9]单位和world_delta [1,1]单位

width *= zoom;
height *= zoom;

right = width / 2;
left = -right
top = height / 2;
bottom = -top;

然后,正如BDL在评论中指出的,您可以从以下公式中推导出NDC中的增量:

ndc_delta.x = world_delta.x / (right - left);
ndc_delta.y = world_delta.y / (top - bottom);

或者简单地说:

ndc_delta.x = world_delta.x / width;
ndc_delta.y = world_delta.y / height;

相关问题