gpt4 book ai didi

opengl - 使用着色器将纹素移动到其中心

转载 作者:行者123 更新时间:2023-12-04 02:26:16 26 4
gpt4 key购买 nike

我正在尝试将平方纹理 texel 移动到以下时间的纹理中心。
下面的代码正在完成它的工作,除非我希望绘制的像素在到达几何体(平面)的中心时消失,而现在它只会随着时间的增加而变得越来越小,并且纹理似乎收缩了。

enter image description here

uniform float time;
varying vec2 vUv;

void main() {

vec2 center = vec2(0.5, 0.5);
vec2 newPosition = vec2(vUv.x + t * (center.x - vUv.x), vUv.y + t * (center.y - vUv.y);

gl_FragColor = texture2D( texture, vec2(newPosition.x, newPosition.y) );
}

编辑:

将此视为纹理中心的黑洞。
enter image description here

最佳答案

据我了解,您希望纹素位于 vUvt=0并在 center过了一会儿。

结果是放大了纹理的中心。

实际上你的代码是从 t = 0 开始的至 t = 1 .当t = 1纹素位置是 center .

您使用 mix 具有相同的行为功能。

vec2 newPosition = mix(vUv, center, t);

也当 t = 1 全部 纹素在 center并且图像是单色图像。 (纹理中心的颜色)。

你的问题是 t持续增长。当 t > 1 texel 继续他们的道路。在他们都在中心相遇之后,现在他们彼此疏远了。效果是纹理反转,您会看到缩小。

根据您希望它如何结束,有多种解决方案:
  • 您想转到最大缩放并保留此图像:clamp t 在 [0, 1] 范围内像这样t = clamp(t, 0, 1); .
  • 您想转到最大缩放并且图像消失:当 t > 1 时停止绘制它(或 t >= 1 如果您不想要单色图像)。
  • 您想要无限放大,即 texel 越来越靠近中心但永远不会到达它。

  • 对于这第三种行为,您可以使用新的 t ,说 t2 :
  • t2 = 1 - 1/(t*k+1); // Where k > 0
  • t2 = 1 - pow(k, -t); // Where k > 1
  • t2 = f(t); // Where f(0) = 0, f is increasing, continuous and limit in +∞ is 1
  • 关于opengl - 使用着色器将纹素移动到其中心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29103171/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com