跳到主要内容
← Math

Math

Line Segment

很酷的裁剪手法:float seg = step(dot(l, a), dot(l, uv)) * step(dot(l, uv), dot(l, b));

实时渲染 · 2D 片段 HLSL

第 15 课:Line Segment

我的解:很酷的裁剪手法:float seg = step(dot(l, a), dot(l, uv)) * step(dot(l, uv), dot(l, b));

我的解

cbuffer Uniforms : register(b0) {
  float2 iResolution;
  float iTime;
};

struct PSInput {
  float4 position : SV_Position;
};

float4 main(PSInput input) : SV_Target {
  float2 uv = input.position.xy / iResolution.xy;
  uv *= 2.0;
  uv -= 1.0;
  uv.x *= iResolution.x / iResolution.y;

  float2 a = float2(cos(iTime + 3.14), sin(iTime + 3.14));
  float2 b = float2(cos(iTime), sin(iTime));

  float2 lineAB = b-a;
  float2 norm_lineAB = normalize(lineAB);
  float2 n = normalize(float2(lineAB.y,-lineAB.x));
  float d = -dot(n, a);

  float endpointA = dot(norm_lineAB,a);
  float endpointB = dot(norm_lineAB,b);

  float p = dot(uv, norm_lineAB);

  float rangeCheck = step(min(endpointA,endpointB), p)-step(max(endpointA,endpointB), p);
  float _line = 1.0 - smoothstep(0.1,0.105,abs(dot(uv, n) + d));


  float3 backColor  = float3(0.12, 0.12, 0.12);
  float3 shapeColor = float3(0.38, 0.12, 0.93);

  float3 result = lerp(backColor, shapeColor, _line * rangeCheck);

  return float4(result, 1.0);
}

复盘笔记

  • 很酷的裁剪手法:float seg = step(dot(l, a), dot(l, uv)) * step(dot(l, uv), dot(l, b));
  • <2025/08/12>
  • ==记录时间: 5月27日 2025, 04:11 下午==