{"id":2428,"date":"2025-07-22T17:41:40","date_gmt":"2025-07-22T08:41:40","guid":{"rendered":"https:\/\/remoooo.com\/?p=2428"},"modified":"2025-07-22T17:41:42","modified_gmt":"2025-07-22T08:41:42","slug":"cloud","status":"publish","type":"post","link":"https:\/\/remoooo.com\/en\/cloud\/","title":{"rendered":"\u98ce\u683c\u5316\u5361\u901a\u4f53\u79ef\u4e91"},"content":{"rendered":"<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-540.png\" alt=\"\" class=\"wp-image-2429 lazyload\"\/><noscript><img decoding=\"async\" width=\"1619\" height=\"924\" src=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-540.png\" alt=\"\" class=\"wp-image-2429 lazyload\"\/><\/noscript><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#d4d4d433\" stroke=\"#d4d4d44d\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#d4d4d433\" stroke=\"#d4d4d44d\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#d4d4d433\" stroke=\"#d4d4d44d\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"function getCloudColor(    viewVector,      \/\/ \u89c6\u7ebf\u65b9\u5411    skyColor,        \/\/ \u80cc\u666f\u5929\u7a7a\u8272    basePos,         \/\/ \u5c04\u7ebf\u8d77\u70b9    samples,         \/\/ \u91c7\u6837\u6b21\u6570    umbral,          \/\/ \u9608\u503c\uff0c\u7528\u4e8e\u5254\u9664\u4f4e\u566a\u58f0    brightFactor,    \/\/ \u9ad8\u5149\u5f3a\u5ea6    dither,          \/\/ \u6296\u52a8\u53c2\u6570    CLOUD_PARAMS     \/\/ \u5404\u79cd\u4e91\u5c42\u5e73\u9762\u3001\u4e2d\u5fc3\u3001\u539a\u5ea6\u7b49\u5e38\u91cf):    \/\/ 1. \u5982\u679c\u89c6\u7ebf\u671d\u4e0b\uff0c\u76f4\u63a5\u8fd4\u56de\u5929\u7a7a\u8272    if viewVector.y \u2264 0:        return skyColor    \/\/ 2. \u8ba1\u7b97\u5c04\u7ebf\u4e0e\u4e0a\u4e0b\u4e91\u5c42\u5e73\u9762\u7684\u4ea4\u70b9 t0\u3001t1    t0 = (CLOUD_BOTTOM - basePos.y) \/ viewVector.y    t1 = (CLOUD_TOP    - basePos.y) \/ viewVector.y    \/\/ 3. \u751f\u6210\u91c7\u6837\u8d77\u70b9 p \u548c\u6b65\u957f stepV    p     = basePos + viewVector * t0    pEnd  = basePos + viewVector * t1    stepV = (pEnd - p) \/ samples    p    += stepV * dither  \/\/ \u52a0\u5165\u5c11\u91cf\u6296\u52a8\uff0c\u51cf\u5c11\u6761\u5e26    \/\/ 4. \u6cbf\u5c04\u7ebf\u91c7\u6837\uff0c\u7d2f\u79ef\u201c\u4e91\u539a\u5ea6\u201d cv \u548c\u201c\u9996\u6b21\u51fb\u4e2d\u6df1\u5ea6\u201d den    cv       = 0          \/\/ \u7d2f\u8ba1\u7684\u4e91\u4f53\u79ef\u5206\u91cf    den      = 0          \/\/ \u9996\u6b21\u8fdb\u5165\u4e91\u5c42\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff080\uff5e1\uff09    firstHit = true    totalRange = (CLOUD_CENTER - CLOUD_BOTTOM) + (CLOUD_TOP - CLOUD_CENTER)    for i in 0 .. samples-1:        \/\/ 4.1 \u91c7\u6837\u566a\u58f0\uff08height field\uff09        noiseHi = sampleNoiseHeight(p.xz, timeOffsetHigh)        noiseLo = sampleNoiseHeight(p.zx, timeOffsetLow)  \/\/ \u53ef\u9009\u591a\u5c42\u6df7\u5408        noise   = mixAndSmooth(noiseHi, noiseLo)        \/\/ 4.2 \u6839\u636e\u9608\u503c\u8ba1\u7b97\u4e91\u5c42\u4e0a\u4e0b\u8fb9\u754c        v    = (noise - umbral) \/ (1 - umbral)        inf  = CLOUD_CENTER - v * (CLOUD_CENTER - CLOUD_BOTTOM)        sup  = CLOUD_CENTER + v * (CLOUD_TOP    - CLOUD_CENTER)        \/\/ 4.3 \u5224\u65ad\u5f53\u524d\u91c7\u6837\u70b9 p.y \u662f\u5426\u5728\u4e91\u5c42\u5185\u90e8        if inf &lt; p.y &lt; sup:            cv += min(stepLength, sup - inf)            if firstHit:                den      = (sup - p.y) \/ totalRange                firstHit = false        else if withinSoftEdge(p.y, inf, sup, CLOUD_EDGE_WIDTH):            \/\/ \u8fb9\u7f18\u8fc7\u6e21\uff1a\u8f6f\u6dfb\u52a0\u4e00\u70b9\u79ef\u7d2f            cv += softBlendAmount(p.y, inf, sup)             if firstHit:                den      = (sup - p.y) \/ totalRange                firstHit = false        p += stepV    \/\/ 5. \u5f52\u4e00\u5316\u7d2f\u79ef\u503c\u548c\u6df1\u5ea6    opacity   = clamp(cv \/ (2 * CLOUD_EDGE_WIDTH \/ viewVector.y), 0, 1)    density   = clamp(den, 0.0001, 1)    \/\/ 6. \u6309 density \u5206\u5c42\u9009\u8272\uff1a\u4f4e\u2014\u4e2d\u2014\u9ad8    if density &lt; 0.33:        baseColor = COL_SH  \/\/ \u4e91\u5e95\u8272    else if density &lt; 0.66:        baseColor = COL_MD  \/\/ \u4e2d\u5c42\u8272    else:        baseColor = COL_HI  \/\/ \u4e91\u9876\u8272    \/\/ 7. \u89c6\u5411\u9ad8\u5149\uff1a\u53ea\u6709\u9ad8\u5bc6\u5ea6\u90e8\u5206\u624d\u989d\u5916\u63d0\u4eae    if density &gt; 0.66:        highlight = dot(computeNormal(density), -viewVector)        baseColor = mix(baseColor, COL_HI, highlight * brightFactor)    \/\/ 8. \u81ea\u9634\u5f71\uff1a\u8d8a\u539a\u8d8a\u6697    baseColor *= mix(1.0, 0.85, density^2 * 0.5)    \/\/ 9. \u8fb9\u7f18\u63cf\u8fb9\uff1a\u6839\u636e\u6df1\u5ea6\u573a\u68af\u5ea6\u589e\u5f3a\u8f6e\u5ed3    edgeFactor = computeEdgeFactor(opacity)    baseColor  = mix(baseColor, OUTLINE_COLOR, edgeFactor * 0.3)    \/\/ 10. \u6839\u636e\u5929\u7a7a\u4eae\u5ea6\u5728\u591c\u95f4\u9002\u5f53\u6697\u5316    nightFactor = computeNightFactor(skyColor)    baseColor  *= nightFactor    \/\/ 11. \u6700\u7ec8\u6df7\u5408\uff1a\u4e91\u5c42\u8986\u76d6\u80cc\u666f    alpha = opacity * clamp((viewVector.y - 0.05) * 5.0, 0, 1)    return mix(skyColor, baseColor, alpha)\" style=\"color:#D4D4D4;display:none\" aria-label=\"copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">Function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">getCloudColor<\/span><span style=\"color: #D4D4D4\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">viewVector<\/span><span style=\"color: #D4D4D4\">,      <\/span><span style=\"color: #6A9955\">\/\/ \u89c6\u7ebf\u65b9\u5411<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">skyColor<\/span><span style=\"color: #D4D4D4\">,        <\/span><span style=\"color: #6A9955\">\/\/ \u80cc\u666f\u5929\u7a7a\u8272<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">basePos<\/span><span style=\"color: #D4D4D4\">,         <\/span><span style=\"color: #6A9955\">\/\/ \u5c04\u7ebf\u8d77\u70b9<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">samples<\/span><span style=\"color: #D4D4D4\">,         <\/span><span style=\"color: #6A9955\">\/\/ \u91c7\u6837\u6b21\u6570<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">umbral<\/span><span style=\"color: #D4D4D4\">,          <\/span><span style=\"color: #6A9955\">\/\/ \u9608\u503c\uff0c\u7528\u4e8e\u5254\u9664\u4f4e\u566a\u58f0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">brightFactor<\/span><span style=\"color: #D4D4D4\">,    <\/span><span style=\"color: #6A9955\">\/\/ \u9ad8\u5149\u5f3a\u5ea6<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">dither<\/span><span style=\"color: #D4D4D4\">,          <\/span><span style=\"color: #6A9955\">\/\/ \u6296\u52a8\u53c2\u6570<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">CLOUD_PARAMS<\/span><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #6A9955\">\/\/ \u5404\u79cd\u4e91\u5c42\u5e73\u9762\u3001\u4e2d\u5fc3\u3001\u539a\u5ea6\u7b49\u5e38\u91cf<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ 1. \u5982\u679c\u89c6\u7ebf\u671d\u4e0b\uff0c\u76f4\u63a5\u8fd4\u56de\u5929\u7a7a\u8272<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">viewVector<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\"> \u2264 <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">skyColor<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ 2. \u8ba1\u7b97\u5c04\u7ebf\u4e0e\u4e0a\u4e0b\u4e91\u5c42\u5e73\u9762\u7684\u4ea4\u70b9 t0\u3001t1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">t0<\/span><span style=\"color: #D4D4D4\"> = (<\/span><span style=\"color: #4FC1FF\">CLOUD_BOTTOM<\/span><span style=\"color: #D4D4D4\"> - <\/span><span style=\"color: #9CDCFE\">basePos<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">) \/ <\/span><span style=\"color: #9CDCFE\">viewVector<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">y<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">t1<\/span><span style=\"color: #D4D4D4\"> = (<\/span><span style=\"color: #4FC1FF\">CLOUD_TOP<\/span><span style=\"color: #D4D4D4\">    - <\/span><span style=\"color: #9CDCFE\">basePos<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">) \/ <\/span><span style=\"color: #9CDCFE\">viewVector<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">y<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ 3. \u751f\u6210\u91c7\u6837\u8d77\u70b9 p \u548c\u6b65\u957f stepV<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">p<\/span><span style=\"color: #D4D4D4\">     = <\/span><span style=\"color: #9CDCFE\">basePos<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #9CDCFE\">viewVector<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #9CDCFE\">t0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">pEnd<\/span><span style=\"color: #D4D4D4\">  = <\/span><span style=\"color: #9CDCFE\">basePos<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #9CDCFE\">viewVector<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #9CDCFE\">t1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">stepV<\/span><span style=\"color: #D4D4D4\"> = (<\/span><span style=\"color: #9CDCFE\">pEnd<\/span><span style=\"color: #D4D4D4\"> - <\/span><span style=\"color: #9CDCFE\">p<\/span><span style=\"color: #D4D4D4\">) \/ <\/span><span style=\"color: #9CDCFE\">samples<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">p<\/span><span style=\"color: #D4D4D4\">    += <\/span><span style=\"color: #9CDCFE\">stepV<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #9CDCFE\">dither<\/span><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ \u52a0\u5165\u5c11\u91cf\u6296\u52a8\uff0c\u51cf\u5c11\u6761\u5e26<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ 4. \u6cbf\u5c04\u7ebf\u91c7\u6837\uff0c\u7d2f\u79ef\u201c\u4e91\u539a\u5ea6\u201d cv \u548c\u201c\u9996\u6b21\u51fb\u4e2d\u6df1\u5ea6\u201d den<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">cv<\/span><span style=\"color: #D4D4D4\">       = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #6A9955\">\/\/ \u7d2f\u8ba1\u7684\u4e91\u4f53\u79ef\u5206\u91cf<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">den<\/span><span style=\"color: #D4D4D4\">      = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #6A9955\">\/\/ \u9996\u6b21\u8fdb\u5165\u4e91\u5c42\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff080\uff5e1\uff09<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">firstHit<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">totalRange<\/span><span style=\"color: #D4D4D4\"> = (<\/span><span style=\"color: #4FC1FF\">CLOUD_CENTER<\/span><span style=\"color: #D4D4D4\"> - <\/span><span style=\"color: #4FC1FF\">CLOUD_BOTTOM<\/span><span style=\"color: #D4D4D4\">) + (<\/span><span style=\"color: #4FC1FF\">CLOUD_TOP<\/span><span style=\"color: #D4D4D4\"> - <\/span><span style=\"color: #4FC1FF\">CLOUD_CENTER<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">for<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">i<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">in<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\"> .. <\/span><span style=\"color: #9CDCFE\">samples<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ 4.1 \u91c7\u6837\u566a\u58f0\uff08height field\uff09<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">noiseHi<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">sampleNoiseHeight<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">p<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">xz<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">timeOffsetHigh<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">noiseLo<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">sampleNoiseHeight<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">p<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">zx<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">timeOffsetLow<\/span><span style=\"color: #D4D4D4\">)  <\/span><span style=\"color: #6A9955\">\/\/ \u53ef\u9009\u591a\u5c42\u6df7\u5408<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">noise<\/span><span style=\"color: #D4D4D4\">   = <\/span><span style=\"color: #DCDCAA\">mixAndSmooth<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">noiseHi<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">noiseLo<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ 4.2 \u6839\u636e\u9608\u503c\u8ba1\u7b97\u4e91\u5c42\u4e0a\u4e0b\u8fb9\u754c<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">v<\/span><span style=\"color: #D4D4D4\">    = (<\/span><span style=\"color: #9CDCFE\">noise<\/span><span style=\"color: #D4D4D4\"> - <\/span><span style=\"color: #9CDCFE\">umbral<\/span><span style=\"color: #D4D4D4\">) \/ (<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\"> - <\/span><span style=\"color: #9CDCFE\">umbral<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">inf<\/span><span style=\"color: #D4D4D4\">  = <\/span><span style=\"color: #4FC1FF\">CLOUD_CENTER<\/span><span style=\"color: #D4D4D4\"> - <\/span><span style=\"color: #9CDCFE\">v<\/span><span style=\"color: #D4D4D4\"> * (<\/span><span style=\"color: #4FC1FF\">CLOUD_CENTER<\/span><span style=\"color: #D4D4D4\"> - <\/span><span style=\"color: #4FC1FF\">CLOUD_BOTTOM<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">sup<\/span><span style=\"color: #D4D4D4\">  = <\/span><span style=\"color: #4FC1FF\">CLOUD_CENTER<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #9CDCFE\">v<\/span><span style=\"color: #D4D4D4\"> * (<\/span><span style=\"color: #4FC1FF\">CLOUD_TOP<\/span><span style=\"color: #D4D4D4\">    - <\/span><span style=\"color: #4FC1FF\">CLOUD_CENTER<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ 4.3 \u5224\u65ad\u5f53\u524d\u91c7\u6837\u70b9 p.y \u662f\u5426\u5728\u4e91\u5c42\u5185\u90e8<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">inf<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #9CDCFE\">p<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #C8C8C8\">sup<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">cv<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #DCDCAA\">min<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">stepLength<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">sup<\/span><span style=\"color: #D4D4D4\"> - <\/span><span style=\"color: #9CDCFE\">inf<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C8C8C8\">firstHit<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">den<\/span><span style=\"color: #D4D4D4\">      = (<\/span><span style=\"color: #9CDCFE\">sup<\/span><span style=\"color: #D4D4D4\"> - <\/span><span style=\"color: #9CDCFE\">p<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">) \/ <\/span><span style=\"color: #9CDCFE\">totalRange<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">firstHit<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">withinSoftEdge<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">p<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">inf<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">sup<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #4FC1FF\">CLOUD_EDGE_WIDTH<\/span><span style=\"color: #D4D4D4\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #6A9955\">\/\/ \u8fb9\u7f18\u8fc7\u6e21\uff1a\u8f6f\u6dfb\u52a0\u4e00\u70b9\u79ef\u7d2f<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">cv<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #DCDCAA\">softBlendAmount<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">p<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">inf<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">sup<\/span><span style=\"color: #D4D4D4\">) <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C8C8C8\">firstHit<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">den<\/span><span style=\"color: #D4D4D4\">      = (<\/span><span style=\"color: #9CDCFE\">sup<\/span><span style=\"color: #D4D4D4\"> - <\/span><span style=\"color: #9CDCFE\">p<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">) \/ <\/span><span style=\"color: #9CDCFE\">totalRange<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">firstHit<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">false<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">p<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #9CDCFE\">stepV<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ 5. \u5f52\u4e00\u5316\u7d2f\u79ef\u503c\u548c\u6df1\u5ea6<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">opacity<\/span><span style=\"color: #D4D4D4\">   = <\/span><span style=\"color: #DCDCAA\">clamp<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">cv<\/span><span style=\"color: #D4D4D4\"> \/ (<\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #4FC1FF\">CLOUD_EDGE_WIDTH<\/span><span style=\"color: #D4D4D4\"> \/ <\/span><span style=\"color: #9CDCFE\">viewVector<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">), <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">density<\/span><span style=\"color: #D4D4D4\">   = <\/span><span style=\"color: #DCDCAA\">clamp<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">den<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0.0001<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ 6. \u6309 density \u5206\u5c42\u9009\u8272\uff1a\u4f4e\u2014\u4e2d\u2014\u9ad8<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">density<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #B5CEA8\">0.33<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">baseColor<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #4FC1FF\">COL_SH<\/span><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ \u4e91\u5e95\u8272<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">density<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #B5CEA8\">0.66<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">baseColor<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #4FC1FF\">COL_MD<\/span><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ \u4e2d\u5c42\u8272<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">baseColor<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #4FC1FF\">COL_HI<\/span><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ \u4e91\u9876\u8272<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ 7. \u89c6\u5411\u9ad8\u5149\uff1a\u53ea\u6709\u9ad8\u5bc6\u5ea6\u90e8\u5206\u624d\u989d\u5916\u63d0\u4eae<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">density<\/span><span style=\"color: #D4D4D4\"> &gt; <\/span><span style=\"color: #B5CEA8\">0.66<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">highlight<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">dot<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #DCDCAA\">computeNormal<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">density<\/span><span style=\"color: #D4D4D4\">), -<\/span><span style=\"color: #9CDCFE\">viewVector<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">baseColor<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">mix<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">baseColor<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #4FC1FF\">COL_HI<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">highlight<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #9CDCFE\">brightFactor<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ 8. \u81ea\u9634\u5f71\uff1a\u8d8a\u539a\u8d8a\u6697<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">baseColor<\/span><span style=\"color: #D4D4D4\"> *= <\/span><span style=\"color: #DCDCAA\">mix<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">1.0<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0.85<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">density<\/span><span style=\"color: #D4D4D4\">^<\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #B5CEA8\">0.5<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ 9. \u8fb9\u7f18\u63cf\u8fb9\uff1a\u6839\u636e\u6df1\u5ea6\u573a\u68af\u5ea6\u589e\u5f3a\u8f6e\u5ed3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">edgeFactor<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">computeEdgeFactor<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">opacity<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">baseColor<\/span><span style=\"color: #D4D4D4\">  = <\/span><span style=\"color: #DCDCAA\">mix<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">baseColor<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #4FC1FF\">OUTLINE_COLOR<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">edgeFactor<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #B5CEA8\">0.3<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ 10. \u6839\u636e\u5929\u7a7a\u4eae\u5ea6\u5728\u591c\u95f4\u9002\u5f53\u6697\u5316<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">nightFactor<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">computeNightFactor<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">skyColor<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">baseColor<\/span><span style=\"color: #D4D4D4\">  *= <\/span><span style=\"color: #9CDCFE\">nightFactor<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ 11. \u6700\u7ec8\u6df7\u5408\uff1a\u4e91\u5c42\u8986\u76d6\u80cc\u666f<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">alpha<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">opacity<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #DCDCAA\">clamp<\/span><span style=\"color: #D4D4D4\">((<\/span><span style=\"color: #9CDCFE\">viewVector<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\"> - <\/span><span style=\"color: #B5CEA8\">0.05<\/span><span style=\"color: #D4D4D4\">) * <\/span><span style=\"color: #B5CEA8\">5.0<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">mix<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">skyColor<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">baseColor<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">alpha<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#1E1E1E;color:#c7c7c7;font-size:12px;line-height:1;position:relative\">JavaScript<\/span><\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":2,"featured_media":2429,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[53],"tags":[],"class_list":["post-2428","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tech"],"_links":{"self":[{"href":"https:\/\/remoooo.com\/en\/wp-json\/wp\/v2\/posts\/2428","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/remoooo.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/remoooo.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/remoooo.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/remoooo.com\/en\/wp-json\/wp\/v2\/comments?post=2428"}],"version-history":[{"count":1,"href":"https:\/\/remoooo.com\/en\/wp-json\/wp\/v2\/posts\/2428\/revisions"}],"predecessor-version":[{"id":2430,"href":"https:\/\/remoooo.com\/en\/wp-json\/wp\/v2\/posts\/2428\/revisions\/2430"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/remoooo.com\/en\/wp-json\/wp\/v2\/media\/2429"}],"wp:attachment":[{"href":"https:\/\/remoooo.com\/en\/wp-json\/wp\/v2\/media?parent=2428"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/remoooo.com\/en\/wp-json\/wp\/v2\/categories?post=2428"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/remoooo.com\/en\/wp-json\/wp\/v2\/tags?post=2428"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}