declare const VERTEX_SHADER = "\n// \u7C92\u5B50\u521D\u59CB\u5C5E\u6027\nattribute vec3 initialVelocity;\nattribute vec3 acceleration;\nattribute float birthTime;\nattribute float lifeTime;\nattribute float initialSize;\nattribute float sizeGrowth;\nattribute vec3 initialColor;\nattribute float initialOpacity;\nattribute float initialAngle;\nattribute float angleVelocity;\nattribute float particleIndex;\n\n// \u5168\u5C40uniform\u53C2\u6570\nuniform float uTime;\n\n// \u4F20\u9012\u7ED9fragment shader\u7684\u53D8\u91CF\nvarying vec4 vColor;\nvarying float vAngle;\n\n// \u7B80\u5355\u566A\u58F0\u51FD\u6570\nfloat random(vec2 st) {\n return fract(sin(dot(st.xy, vec2(12.9898,78.233))) * 43758.5453123);\n}\n\n// HSL\u8F6CRGB\u51FD\u6570\nvec3 hsl2rgb(vec3 c) {\n vec3 rgb = clamp(abs(mod(c.x*6.0+vec3(0.0,4.0,2.0), 6.0)-3.0)-1.0, 0.0, 1.0);\n return c.z + c.y * (rgb-0.5)*(1.0-abs(2.0*c.z-1.0));\n}\n\nvoid main() {\n // \u8BA1\u7B97\u7C92\u5B50\u7684\u5B9E\u9645\u5E74\u9F84\uFF0C\u8003\u8651\u5FAA\u73AF\u91CD\u751F\n float totalCycleTime = lifeTime;\n float adjustedTime = uTime + birthTime;\n float cycleTime = mod(adjustedTime, totalCycleTime);\n float age = cycleTime;\n float normalizedAge = clamp(age / lifeTime, 0.0, 1.0);\n \n // \u5982\u679C\u7C92\u5B50\u5E74\u9F84\u8D85\u8FC7\u751F\u547D\u5468\u671F\uFF0C\u8BA9\u5B83\u91CD\u65B0\u5F00\u59CB\n if (age > lifeTime) {\n age = 0.0;\n normalizedAge = 0.0;\n }\n \n // \u8BA1\u7B97\u5F53\u524D\u4F4D\u7F6E\uFF08\u7269\u7406\u6A21\u62DF\uFF09\n vec3 currentVelocity = initialVelocity + acceleration * age;\n \n vec3 currentPosition = position + currentVelocity * age;\n \n // \u8BA1\u7B97\u5F53\u524D\u5927\u5C0F\uFF08\u968F\u65F6\u95F4\u53D8\u5316\uFF09\n float currentSize = initialSize + sizeGrowth * normalizedAge;\n \n // \u8BA1\u7B97\u5F53\u524D\u89D2\u5EA6\n vAngle = initialAngle + angleVelocity * age;\n \n // \u8BA1\u7B97\u5F53\u524D\u989C\u8272\u548C\u900F\u660E\u5EA6\uFF08\u751F\u547D\u5468\u671F\u6E10\u53D8\uFF09\n vec3 currentColor = initialColor;\n float currentOpacity = initialOpacity;\n \n // \u751F\u547D\u5468\u671F\u900F\u660E\u5EA6\u6E10\u53D8\uFF08\u51FA\u751F\u548C\u6B7B\u4EA1\u65F6\u6E10\u53D8\uFF09\n if (normalizedAge < 0.1) {\n currentOpacity *= normalizedAge / 0.1; // \u6DE1\u5165\n } else if (normalizedAge > 0.8) {\n currentOpacity *= (1.0 - normalizedAge) / 0.2; // \u6DE1\u51FA\n }\n \n // \u5C06HSL\u989C\u8272\u8F6C\u6362\u4E3ARGB\n vec3 rgbColor = hsl2rgb(currentColor);\n vColor = vec4(rgbColor, currentOpacity);\n \n // \u8BA1\u7B97\u6700\u7EC8\u4F4D\u7F6E\u548C\u5927\u5C0F\n vec4 mvPosition = modelViewMatrix * vec4(currentPosition, 1.0);\n gl_PointSize = currentSize * (300.0 / length(mvPosition.xyz));\n gl_Position = projectionMatrix * mvPosition;\n}\n"; export { VERTEX_SHADER };