第 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 下午==