跳到主要内容
← Built-In functions

Built-In functions

Time

sin 的值域-1.0 到1.0,除2是0.5-0.5, 加0.5是0-1。

实时渲染 · 纹理 GLSL

第 39 课:Time

别人的解:sin 的值域-1.0 到1.0,除2是0.5-0.5, 加0.5是0-1。

别人的解

uniform vec2 iResolution;
uniform float iTime;
uniform sampler2D iChannel0;

void main() {
  vec2 uv = gl_FragCoord.xy / iResolution.xy;

  float t = sin(iTime * 2.0) * 0.5 + 0.5;
  float delta = 0.375 * t * step(0.3, uv.y);

  vec4 color = texture(iChannel0, uv);

  gl_FragColor = color;
}

复盘笔记

  • sin 的值域-1.0 到1.0,除2是0.5-0.5, 加0.5是0-1。
  • 0.375的值是这么来的:题目说0.675的位置是上颚,低点则是0.3, 所以要平移0.375,即0到0.375
  • 之所以是加不是减,因为uv是屏幕采样坐标,采样的位置越是向上加,图像越是向下
  • 问题是,为什么往上加,背景是白的而不是别的什么?
  • 因为你的贴图(iChannel0)在超出 [0.0, 1.0] 范围时,其采样模式(wrap mode)是 CLAMP_TO_EDGE,而 GPU 默认对超出边界部分返回白色或未定义值——这跟你使用的平台、设置、甚至 ShaderToy 或 Unity 有关。