@rosetears/aili-pi 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +109 -0
- package/THIRD_PARTY_NOTICES.md +64 -0
- package/extensions/index.ts +6 -0
- package/install.sh +5 -0
- package/manifests/adapter-evidence.json +45 -0
- package/manifests/capabilities.json +124 -0
- package/manifests/live-verification.json +26 -0
- package/manifests/provenance.json +71 -0
- package/manifests/roles.json +474 -0
- package/manifests/sbom.json +7797 -0
- package/manifests/skill-compatibility.json +8100 -0
- package/manifests/subagent-provenance.json +37 -0
- package/package.json +91 -0
- package/prompts/build.md +8 -0
- package/prompts/define.md +8 -0
- package/prompts/ideate.md +8 -0
- package/prompts/local-review.md +8 -0
- package/prompts/ship.md +8 -0
- package/roles/agent-evaluator.md +47 -0
- package/roles/ai-regression-scout.md +47 -0
- package/roles/browser-qa-runner.md +47 -0
- package/roles/code-reviewer.md +47 -0
- package/roles/code-scout.md +47 -0
- package/roles/convergence-reviewer.md +55 -0
- package/roles/doc-researcher.md +47 -0
- package/roles/e2e-artifact-runner.md +47 -0
- package/roles/implementer.md +47 -0
- package/roles/opensource-sanitizer.md +47 -0
- package/roles/plan-auditor.md +47 -0
- package/roles/pr-test-analyzer.md +47 -0
- package/roles/security-auditor.md +47 -0
- package/roles/silent-failure-reviewer.md +47 -0
- package/roles/spec-miner.md +47 -0
- package/roles/test-coverage-reviewer.md +47 -0
- package/roles/test-engineer.md +48 -0
- package/roles/web-performance-auditor.md +47 -0
- package/roles/web-researcher.md +47 -0
- package/scripts/apply-adapter-evidence.ts +73 -0
- package/scripts/bootstrap.sh +180 -0
- package/scripts/generate-provenance.ts +143 -0
- package/scripts/local-package-e2e.ts +51 -0
- package/scripts/sync-roles.ts +213 -0
- package/scripts/sync-skills.ts +356 -0
- package/scripts/validate-runtime.ts +11 -0
- package/skills/academic-paper-review/SKILL.md +81 -0
- package/skills/agents-md-initialization/SKILL.md +121 -0
- package/skills/agents-md-initialization/references/agents-template.md +83 -0
- package/skills/agents-md-initialization/references/agents_md.py +215 -0
- package/skills/ai-regression-scout/SKILL.md +24 -0
- package/skills/aili-delivery-flow/SKILL.md +125 -0
- package/skills/aili-delivery-flow/references/artifact-contracts.md +138 -0
- package/skills/aili-delivery-flow/references/backend-routing.md +40 -0
- package/skills/aili-delivery-flow/references/build-execution-loop.md +113 -0
- package/skills/aili-delivery-flow/references/build-goal-mode.md +3 -0
- package/skills/aili-delivery-flow/references/direct-vs-delegated-work.md +38 -0
- package/skills/aili-delivery-flow/references/implementation-packages.md +54 -0
- package/skills/aili-delivery-flow/references/lifecycle.md +127 -0
- package/skills/aili-delivery-flow/references/protocols/acceptance-test-plan.md +18 -0
- package/skills/aili-delivery-flow/references/protocols/alignment-questionnaire.md +10 -0
- package/skills/aili-delivery-flow/references/protocols/closeout-report.md +101 -0
- package/skills/aili-delivery-flow/references/protocols/compact-evidence-pack.md +46 -0
- package/skills/aili-delivery-flow/references/protocols/idea-brief.md +10 -0
- package/skills/aili-delivery-flow/references/protocols/implementation-package.md +53 -0
- package/skills/aili-delivery-flow/references/protocols/research-evidence-pack.md +19 -0
- package/skills/aili-delivery-flow/references/protocols/review-report.md +7 -0
- package/skills/aili-delivery-flow/references/protocols/spec-draft.md +12 -0
- package/skills/aili-delivery-flow/references/protocols/subagent-result.md +60 -0
- package/skills/aili-delivery-flow/references/protocols/subagent-task-packet.md +29 -0
- package/skills/aili-delivery-flow/references/protocols/worktree-context.md +109 -0
- package/skills/aili-delivery-flow/references/questionnaire-policy.md +62 -0
- package/skills/aili-delivery-flow/references/review-repair-loop.md +16 -0
- package/skills/aili-delivery-flow/references/test-document-policy.md +35 -0
- package/skills/android-native-dev/SKILL.md +722 -0
- package/skills/android-native-dev/references/accessibility.md +209 -0
- package/skills/android-native-dev/references/adaptive-screens.md +231 -0
- package/skills/android-native-dev/references/design-style-guide.md +365 -0
- package/skills/android-native-dev/references/functional-requirements.md +229 -0
- package/skills/android-native-dev/references/motion-system.md +203 -0
- package/skills/android-native-dev/references/performance-stability.md +223 -0
- package/skills/android-native-dev/references/privacy-security.md +244 -0
- package/skills/android-native-dev/references/testing.md +554 -0
- package/skills/android-native-dev/references/visual-design.md +246 -0
- package/skills/api-and-interface-design/SKILL.md +318 -0
- package/skills/browser-qa/SKILL.md +32 -0
- package/skills/browser-testing-with-devtools/SKILL.md +323 -0
- package/skills/build-failure-repair/SKILL.md +49 -0
- package/skills/chart-visualization/SKILL.md +73 -0
- package/skills/ci-cd-and-automation/SKILL.md +353 -0
- package/skills/code-review-and-quality/SKILL.md +375 -0
- package/skills/code-review-quality-gates/SKILL.md +132 -0
- package/skills/code-simplification/SKILL.md +371 -0
- package/skills/comment-accuracy-review/SKILL.md +37 -0
- package/skills/consulting-analysis/SKILL.md +69 -0
- package/skills/context-engineering/SKILL.md +375 -0
- package/skills/coverage-review/SKILL.md +24 -0
- package/skills/data-analysis/SKILL.md +74 -0
- package/skills/deprecation-and-migration/SKILL.md +222 -0
- package/skills/documentation-and-adrs/SKILL.md +330 -0
- package/skills/e2e-artifact-handling/SKILL.md +30 -0
- package/skills/evidence-scoped-retrospective/SKILL.md +156 -0
- package/skills/explain-by-allegory/SKILL.md +99 -0
- package/skills/flutter-dev/SKILL.md +162 -0
- package/skills/flutter-dev/references/animations.md +497 -0
- package/skills/flutter-dev/references/bloc-state.md +281 -0
- package/skills/flutter-dev/references/forms.md +656 -0
- package/skills/flutter-dev/references/gorouter-navigation.md +257 -0
- package/skills/flutter-dev/references/localization.md +510 -0
- package/skills/flutter-dev/references/networking.md +566 -0
- package/skills/flutter-dev/references/performance.md +305 -0
- package/skills/flutter-dev/references/platform-specific.md +417 -0
- package/skills/flutter-dev/references/project-structure.md +273 -0
- package/skills/flutter-dev/references/riverpod-state.md +232 -0
- package/skills/flutter-dev/references/testing.md +364 -0
- package/skills/flutter-dev/references/widget-patterns.md +233 -0
- package/skills/frontend-dev/SKILL.md +468 -0
- package/skills/frontend-dev/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/DMMono-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/skills/frontend-dev/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Gloock-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Italiana-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Jura-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Lora-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Outfit-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Tektur-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/skills/frontend-dev/references/asset-prompt-guide.md +43 -0
- package/skills/frontend-dev/references/env-setup.md +33 -0
- package/skills/frontend-dev/references/minimax-cli-reference.md +133 -0
- package/skills/frontend-dev/references/minimax-image-guide.md +65 -0
- package/skills/frontend-dev/references/minimax-music-guide.md +216 -0
- package/skills/frontend-dev/references/minimax-tts-guide.md +78 -0
- package/skills/frontend-dev/references/minimax-video-guide.md +82 -0
- package/skills/frontend-dev/references/minimax-voice-catalog.md +685 -0
- package/skills/frontend-dev/references/motion-recipes.md +407 -0
- package/skills/frontend-dev/references/troubleshooting.md +85 -0
- package/skills/frontend-dev/scripts/minimax_image.py +137 -0
- package/skills/frontend-dev/scripts/minimax_music.py +157 -0
- package/skills/frontend-dev/scripts/minimax_tts.py +127 -0
- package/skills/frontend-dev/scripts/minimax_video.py +187 -0
- package/skills/frontend-dev/templates/generator_template.js +223 -0
- package/skills/frontend-dev/templates/viewer.html +599 -0
- package/skills/frontend-ui-engineering/SKILL.md +367 -0
- package/skills/fullstack-dev/SKILL.md +819 -0
- package/skills/fullstack-dev/references/api-design.md +444 -0
- package/skills/fullstack-dev/references/auth-flow.md +165 -0
- package/skills/fullstack-dev/references/db-schema.md +706 -0
- package/skills/fullstack-dev/references/django-best-practices.md +466 -0
- package/skills/fullstack-dev/references/environment-management.md +78 -0
- package/skills/fullstack-dev/references/release-checklist.md +278 -0
- package/skills/fullstack-dev/references/technology-selection.md +254 -0
- package/skills/fullstack-dev/references/testing-strategy.md +404 -0
- package/skills/git-workflow-and-versioning/SKILL.md +446 -0
- package/skills/github-evidence-triage/SKILL.md +115 -0
- package/skills/harness-evolution/SKILL.md +59 -0
- package/skills/harness-evolution/references/activation-matrix.md +13 -0
- package/skills/harness-evolution/references/approval-policy.md +20 -0
- package/skills/harness-evolution/references/change-report-template.md +33 -0
- package/skills/harness-evolution/references/component-taxonomy.md +19 -0
- package/skills/harness-evolution/references/verdict-policy.md +13 -0
- package/skills/harness-issue-triage/SKILL.md +72 -0
- package/skills/harness-issue-triage/references/component-diagnosis.md +25 -0
- package/skills/harness-issue-triage/references/triage-report-template.md +34 -0
- package/skills/harness-optimization-audit/SKILL.md +125 -0
- package/skills/idea-refine/SKILL.md +191 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/LICENSE +21 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/NOTICE.md +9 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/SKILL.upstream.md +178 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/examples.md +238 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/frameworks.md +99 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/refinement-criteria.md +113 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/scripts/idea-refine.upstream.sh +15 -0
- package/skills/incremental-implementation/SKILL.md +252 -0
- package/skills/ios-application-dev/SKILL.md +212 -0
- package/skills/ios-application-dev/references/accessibility.md +259 -0
- package/skills/ios-application-dev/references/graphics-animation.md +350 -0
- package/skills/ios-application-dev/references/layout-system.md +199 -0
- package/skills/ios-application-dev/references/metal-shader.md +178 -0
- package/skills/ios-application-dev/references/navigation-patterns.md +175 -0
- package/skills/ios-application-dev/references/swift-coding-standards.md +757 -0
- package/skills/ios-application-dev/references/swiftui-design-guidelines.md +1167 -0
- package/skills/ios-application-dev/references/system-integration.md +401 -0
- package/skills/ios-application-dev/references/uikit-components.md +297 -0
- package/skills/local-review-gate/SKILL.md +207 -0
- package/skills/local-review-gate/references/addyosmani-code-review-rubric.md +33 -0
- package/skills/local-review-gate/references/codex-github-compatibility.md +26 -0
- package/skills/local-review-gate/references/ecc-code-review-adaptation.md +40 -0
- package/skills/local-review-gate/references/graphify-local-review.md +33 -0
- package/skills/local-review-gate/references/orchestration-adaptation.md +51 -0
- package/skills/local-review-gate/references/review-repair-lane-adaptation.md +46 -0
- package/skills/local-review-gate/references/upstream-provenance.md +61 -0
- package/skills/mature-project-pattern-research/SKILL.md +155 -0
- package/skills/mature-project-pattern-research/references/research-rubric.md +45 -0
- package/skills/minimax-docx/LICENSE +21 -0
- package/skills/minimax-docx/SKILL.md +273 -0
- package/skills/minimax-docx/assets/styles/academic_styles.xml +250 -0
- package/skills/minimax-docx/assets/styles/corporate_styles.xml +284 -0
- package/skills/minimax-docx/assets/styles/default_styles.xml +449 -0
- package/skills/minimax-docx/assets/xsd/aesthetic-rules.xsd +470 -0
- package/skills/minimax-docx/assets/xsd/business-rules.xsd +130 -0
- package/skills/minimax-docx/assets/xsd/common-types.xsd +159 -0
- package/skills/minimax-docx/assets/xsd/wml-subset.xsd +589 -0
- package/skills/minimax-docx/references/cjk_typography.md +357 -0
- package/skills/minimax-docx/references/cjk_university_template_guide.md +184 -0
- package/skills/minimax-docx/references/comments_guide.md +191 -0
- package/skills/minimax-docx/references/design_good_bad_examples.md +829 -0
- package/skills/minimax-docx/references/design_principles.md +819 -0
- package/skills/minimax-docx/references/openxml_element_order.md +308 -0
- package/skills/minimax-docx/references/openxml_encyclopedia_part1.md +4061 -0
- package/skills/minimax-docx/references/openxml_encyclopedia_part2.md +2820 -0
- package/skills/minimax-docx/references/openxml_encyclopedia_part3.md +3381 -0
- package/skills/minimax-docx/references/openxml_namespaces.md +82 -0
- package/skills/minimax-docx/references/openxml_units.md +72 -0
- package/skills/minimax-docx/references/scenario_a_create.md +284 -0
- package/skills/minimax-docx/references/scenario_b_edit_content.md +295 -0
- package/skills/minimax-docx/references/scenario_c_apply_template.md +456 -0
- package/skills/minimax-docx/references/track_changes_guide.md +200 -0
- package/skills/minimax-docx/references/troubleshooting.md +506 -0
- package/skills/minimax-docx/references/typography_guide.md +294 -0
- package/skills/minimax-docx/references/xsd_validation_guide.md +158 -0
- package/skills/minimax-docx/scripts/doc_to_docx.sh +40 -0
- package/skills/minimax-docx/scripts/docx_preview.sh +37 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/MiniMaxAIDocx.Cli.csproj +19 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/Program.cs +18 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/AnalyzeCommand.cs +147 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ApplyTemplateCommand.cs +322 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/CreateCommand.cs +324 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/DiffCommand.cs +155 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/EditContentCommand.cs +487 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/FixOrderCommand.cs +108 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/MergeRunsCommand.cs +122 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ValidateCommand.cs +107 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/MiniMaxAIDocx.Core.csproj +15 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/CommentSynchronizer.cs +169 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/ElementOrder.cs +80 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/NamespaceConstants.cs +42 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/RunMerger.cs +81 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/StyleAnalyzer.cs +81 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/TrackChangesHelper.cs +99 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/UnitConverter.cs +23 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples.cs +1832 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch1.cs +910 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch2.cs +999 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch3.cs +1048 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch4.cs +1038 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/CharacterFormattingSamples.cs +1020 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/DocumentCreationSamples.cs +1121 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FieldAndTocSamples.cs +624 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FootnoteAndCommentSamples.cs +675 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/HeaderFooterSamples.cs +838 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ImageSamples.cs +917 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ListAndNumberingSamples.cs +826 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ParagraphFormattingSamples.cs +1199 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/StyleSystemSamples.cs +1487 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TableSamples.cs +1163 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TrackChangesSamples.cs +595 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/CjkHelper.cs +39 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/FontDefaults.cs +24 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/PageSizes.cs +20 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/BusinessRuleValidator.cs +224 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/GateCheckValidator.cs +148 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/ValidationResult.cs +23 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/XsdValidator.cs +69 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.slnx +4 -0
- package/skills/minimax-docx/scripts/env_check.sh +196 -0
- package/skills/minimax-docx/scripts/setup.ps1 +274 -0
- package/skills/minimax-docx/scripts/setup.sh +504 -0
- package/skills/minimax-pdf/README.md +222 -0
- package/skills/minimax-pdf/SKILL.md +218 -0
- package/skills/minimax-pdf/design/design.md +381 -0
- package/skills/minimax-pdf/scripts/cover.py +1579 -0
- package/skills/minimax-pdf/scripts/fill_inspect.py +200 -0
- package/skills/minimax-pdf/scripts/fill_write.py +242 -0
- package/skills/minimax-pdf/scripts/make.sh +491 -0
- package/skills/minimax-pdf/scripts/merge.py +112 -0
- package/skills/minimax-pdf/scripts/palette.py +521 -0
- package/skills/minimax-pdf/scripts/reformat_parse.py +374 -0
- package/skills/minimax-pdf/scripts/render_body.py +1052 -0
- package/skills/minimax-pdf/scripts/render_cover.js +111 -0
- package/skills/minimax-xlsx/SKILL.md +156 -0
- package/skills/minimax-xlsx/references/create.md +691 -0
- package/skills/minimax-xlsx/references/edit.md +684 -0
- package/skills/minimax-xlsx/references/fix.md +37 -0
- package/skills/minimax-xlsx/references/format.md +768 -0
- package/skills/minimax-xlsx/references/ooxml-cheatsheet.md +231 -0
- package/skills/minimax-xlsx/references/read-analyze.md +97 -0
- package/skills/minimax-xlsx/references/validate.md +772 -0
- package/skills/minimax-xlsx/scripts/formula_check.py +422 -0
- package/skills/minimax-xlsx/scripts/libreoffice_recalc.py +248 -0
- package/skills/minimax-xlsx/scripts/shared_strings_builder.py +163 -0
- package/skills/minimax-xlsx/scripts/style_audit.py +575 -0
- package/skills/minimax-xlsx/scripts/xlsx_add_column.py +395 -0
- package/skills/minimax-xlsx/scripts/xlsx_insert_row.py +274 -0
- package/skills/minimax-xlsx/scripts/xlsx_pack.py +87 -0
- package/skills/minimax-xlsx/scripts/xlsx_reader.py +362 -0
- package/skills/minimax-xlsx/scripts/xlsx_shift_rows.py +396 -0
- package/skills/minimax-xlsx/scripts/xlsx_unpack.py +130 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/[Content_Types].xml +9 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/_rels/.rels +6 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/xl/_rels/workbook.xml.rels +19 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/xl/sharedStrings.xml +33 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/xl/styles.xml +160 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/xl/workbook.xml +30 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/xl/worksheets/sheet1.xml +70 -0
- package/skills/newsletter-generation/SKILL.md +71 -0
- package/skills/oss-release-readiness/SKILL.md +47 -0
- package/skills/parallel-subagent-dispatch/SKILL.md +58 -0
- package/skills/performance-optimization/SKILL.md +364 -0
- package/skills/planning-and-task-breakdown/SKILL.md +290 -0
- package/skills/pptx-generator/SKILL.md +275 -0
- package/skills/pptx-generator/references/design-system.md +392 -0
- package/skills/pptx-generator/references/editing.md +162 -0
- package/skills/pptx-generator/references/pitfalls.md +112 -0
- package/skills/pptx-generator/references/pptxgenjs.md +420 -0
- package/skills/pptx-generator/references/slide-types.md +413 -0
- package/skills/pr-test-analysis/SKILL.md +24 -0
- package/skills/react-native-dev/SKILL.md +180 -0
- package/skills/react-native-dev/references/animations.md +254 -0
- package/skills/react-native-dev/references/components.md +124 -0
- package/skills/react-native-dev/references/engineering.md +527 -0
- package/skills/react-native-dev/references/forms.md +300 -0
- package/skills/react-native-dev/references/native-capabilities.md +163 -0
- package/skills/react-native-dev/references/navigation.md +271 -0
- package/skills/react-native-dev/references/networking.md +346 -0
- package/skills/react-native-dev/references/performance.md +215 -0
- package/skills/react-native-dev/references/state-management.md +230 -0
- package/skills/react-native-dev/references/styling.md +117 -0
- package/skills/react-native-dev/references/testing.md +341 -0
- package/skills/requirements-grilling/SKILL.md +447 -0
- package/skills/requirements-grilling/references/ADR-FORMAT.md +46 -0
- package/skills/requirements-grilling/references/CONTEXT-FORMAT.md +41 -0
- package/skills/requirements-grilling/references/INTERVIEW-PACKET-FORMAT.md +62 -0
- package/skills/requirements-grilling/references/MIT-LICENSE-MATT-POCOCK.md +25 -0
- package/skills/requirements-grilling/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/LICENSE +21 -0
- package/skills/requirements-grilling/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/NOTICE.md +9 -0
- package/skills/requirements-grilling/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/interview-me/SKILL.upstream.md +225 -0
- package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/LICENSE +21 -0
- package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/NOTICE.md +12 -0
- package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/batch-grill-me/SKILL.upstream.md +15 -0
- package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/grill-me/SKILL.upstream.md +7 -0
- package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/grilling/SKILL.upstream.md +12 -0
- package/skills/review-pipeline/SKILL.md +38 -0
- package/skills/rose-memory/SKILL.md +210 -0
- package/skills/rose-memory/references/README.md +48 -0
- package/skills/rose-memory/references/memory_cli.py +2384 -0
- package/skills/rose-memory/references/schema.sql +315 -0
- package/skills/security-and-hardening/SKILL.md +369 -0
- package/skills/session-handoff/SKILL.md +88 -0
- package/skills/session-handoff/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/LICENSE +21 -0
- package/skills/session-handoff/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/NOTICE.md +9 -0
- package/skills/session-handoff/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/productivity/handoff/SKILL.upstream.md +16 -0
- package/skills/session-handoff/scripts/session_handoff.py +764 -0
- package/skills/shader-dev/SKILL.md +316 -0
- package/skills/shader-dev/reference/ambient-occlusion.md +382 -0
- package/skills/shader-dev/reference/analytic-ray-tracing.md +651 -0
- package/skills/shader-dev/reference/anti-aliasing.md +71 -0
- package/skills/shader-dev/reference/atmospheric-scattering.md +571 -0
- package/skills/shader-dev/reference/camera-effects.md +80 -0
- package/skills/shader-dev/reference/cellular-automata.md +635 -0
- package/skills/shader-dev/reference/color-palette.md +481 -0
- package/skills/shader-dev/reference/csg-boolean-operations.md +466 -0
- package/skills/shader-dev/reference/domain-repetition.md +436 -0
- package/skills/shader-dev/reference/domain-warping.md +419 -0
- package/skills/shader-dev/reference/fluid-simulation.md +425 -0
- package/skills/shader-dev/reference/fractal-rendering.md +525 -0
- package/skills/shader-dev/reference/lighting-model.md +639 -0
- package/skills/shader-dev/reference/matrix-transform.md +535 -0
- package/skills/shader-dev/reference/multipass-buffer.md +571 -0
- package/skills/shader-dev/reference/normal-estimation.md +418 -0
- package/skills/shader-dev/reference/particle-system.md +589 -0
- package/skills/shader-dev/reference/path-tracing-gi.md +602 -0
- package/skills/shader-dev/reference/polar-uv-manipulation.md +521 -0
- package/skills/shader-dev/reference/post-processing.md +375 -0
- package/skills/shader-dev/reference/procedural-2d-pattern.md +439 -0
- package/skills/shader-dev/reference/procedural-noise.md +551 -0
- package/skills/shader-dev/reference/ray-marching.md +396 -0
- package/skills/shader-dev/reference/sdf-2d.md +724 -0
- package/skills/shader-dev/reference/sdf-3d.md +805 -0
- package/skills/shader-dev/reference/sdf-tricks.md +63 -0
- package/skills/shader-dev/reference/shadow-techniques.md +476 -0
- package/skills/shader-dev/reference/simulation-physics.md +644 -0
- package/skills/shader-dev/reference/sound-synthesis.md +578 -0
- package/skills/shader-dev/reference/terrain-rendering.md +839 -0
- package/skills/shader-dev/reference/texture-mapping-advanced.md +87 -0
- package/skills/shader-dev/reference/texture-sampling.md +553 -0
- package/skills/shader-dev/reference/volumetric-rendering.md +608 -0
- package/skills/shader-dev/reference/voronoi-cellular-noise.md +486 -0
- package/skills/shader-dev/reference/voxel-rendering.md +701 -0
- package/skills/shader-dev/reference/water-ocean.md +445 -0
- package/skills/shader-dev/reference/webgl-pitfalls.md +41 -0
- package/skills/shader-dev/techniques/ambient-occlusion.md +364 -0
- package/skills/shader-dev/techniques/analytic-ray-tracing.md +542 -0
- package/skills/shader-dev/techniques/anti-aliasing.md +124 -0
- package/skills/shader-dev/techniques/atmospheric-scattering.md +522 -0
- package/skills/shader-dev/techniques/camera-effects.md +115 -0
- package/skills/shader-dev/techniques/cellular-automata.md +531 -0
- package/skills/shader-dev/techniques/color-palette.md +380 -0
- package/skills/shader-dev/techniques/csg-boolean-operations.md +491 -0
- package/skills/shader-dev/techniques/domain-repetition.md +333 -0
- package/skills/shader-dev/techniques/domain-warping.md +414 -0
- package/skills/shader-dev/techniques/fluid-simulation.md +1175 -0
- package/skills/shader-dev/techniques/fractal-rendering.md +436 -0
- package/skills/shader-dev/techniques/lighting-model.md +527 -0
- package/skills/shader-dev/techniques/matrix-transform.md +455 -0
- package/skills/shader-dev/techniques/multipass-buffer.md +922 -0
- package/skills/shader-dev/techniques/normal-estimation.md +318 -0
- package/skills/shader-dev/techniques/particle-system.md +1203 -0
- package/skills/shader-dev/techniques/path-tracing-gi.md +623 -0
- package/skills/shader-dev/techniques/polar-uv-manipulation.md +373 -0
- package/skills/shader-dev/techniques/post-processing.md +788 -0
- package/skills/shader-dev/techniques/procedural-2d-pattern.md +346 -0
- package/skills/shader-dev/techniques/procedural-noise.md +554 -0
- package/skills/shader-dev/techniques/ray-marching.md +467 -0
- package/skills/shader-dev/techniques/sdf-2d.md +631 -0
- package/skills/shader-dev/techniques/sdf-3d.md +589 -0
- package/skills/shader-dev/techniques/sdf-tricks.md +100 -0
- package/skills/shader-dev/techniques/shadow-techniques.md +776 -0
- package/skills/shader-dev/techniques/simulation-physics.md +1542 -0
- package/skills/shader-dev/techniques/sound-synthesis.md +490 -0
- package/skills/shader-dev/techniques/terrain-rendering.md +408 -0
- package/skills/shader-dev/techniques/texture-mapping-advanced.md +121 -0
- package/skills/shader-dev/techniques/texture-sampling.md +382 -0
- package/skills/shader-dev/techniques/volumetric-rendering.md +375 -0
- package/skills/shader-dev/techniques/voronoi-cellular-noise.md +458 -0
- package/skills/shader-dev/techniques/voxel-rendering.md +985 -0
- package/skills/shader-dev/techniques/water-ocean.md +490 -0
- package/skills/shader-dev/techniques/webgl-pitfalls.md +170 -0
- package/skills/shipping-and-launch/SKILL.md +334 -0
- package/skills/silent-failure-hunting/SKILL.md +24 -0
- package/skills/source-driven-development/SKILL.md +223 -0
- package/skills/spec-driven-development/SKILL.md +235 -0
- package/skills/spec-driven-development/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/LICENSE +21 -0
- package/skills/spec-driven-development/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/NOTICE.md +9 -0
- package/skills/spec-driven-development/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/spec-driven-development/SKILL.upstream.md +206 -0
- package/skills/strategy-stress-test/SKILL.md +185 -0
- package/skills/systematic-literature-review/SKILL.md +77 -0
- package/skills/test-document-generator/SKILL.md +152 -0
- package/skills/test-document-generator/references/test-document-template.md +45 -0
- package/skills/test-driven-development/SKILL.md +399 -0
- package/skills/write-skills/GLOSSARY.md +113 -0
- package/skills/write-skills/SKILL.md +133 -0
- package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/LICENSE +21 -0
- package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/NOTICE.md +9 -0
- package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/productivity/writing-great-skills/GLOSSARY.md +201 -0
- package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/productivity/writing-great-skills/SKILL.upstream.md +83 -0
- package/src/runtime/child-guard.ts +70 -0
- package/src/runtime/conflicts.ts +25 -0
- package/src/runtime/contracts.ts +9 -0
- package/src/runtime/doctor.ts +134 -0
- package/src/runtime/global-resources.ts +152 -0
- package/src/runtime/index.ts +23 -0
- package/src/runtime/lifecycle.ts +19 -0
- package/src/runtime/native-integrations.ts +44 -0
- package/src/runtime/path-boundaries.ts +69 -0
- package/src/runtime/registry.ts +213 -0
- package/src/runtime/roles.ts +64 -0
- package/src/runtime/rose-context.ts +24 -0
- package/src/runtime/subagents.ts +426 -0
- package/templates/APPEND_SYSTEM.md +12 -0
- package/upstream/aili-workflows.lock.json +3226 -0
|
@@ -0,0 +1,788 @@
|
|
|
1
|
+
## WebGL2 Adaptation Requirements
|
|
2
|
+
|
|
3
|
+
**IMPORTANT: Critical Warning for Standalone HTML Deployment**: Post-processing effects require an input texture to work. When generating standalone HTML, you must:
|
|
4
|
+
1. Set `#define USE_DEMO_SCENE 1` to use the built-in demo scene (recommended), or
|
|
5
|
+
2. Pass a valid input texture to the `iChannel0` channel, otherwise the screen will be completely black
|
|
6
|
+
3. **Critical**: When USE_DEMO_SCENE=1, ensure the #else branch code does not reference non-existent uniforms (e.g., iChannel0)
|
|
7
|
+
|
|
8
|
+
**IMPORTANT: GLSL Type Strictness Rules**:
|
|
9
|
+
- `vec2 = float` is illegal — must use `vec2(x, x)` or `vec2(x)`
|
|
10
|
+
- Function parameters must be defined before use; using a variable name in its own initializer is forbidden (e.g., `float w = filmicCurve(w, w)` is an error)
|
|
11
|
+
- Variables must be declared before use
|
|
12
|
+
- **#version must be the very first line of shader code**: No characters (including whitespace or comments) may precede `#version 300 es`
|
|
13
|
+
- **Code in preprocessor branches is still compiled**: Even if `#if USE_DEMO_SCENE` is true, the `#else` branch code is still compiled by the GPU — all branches must be valid GLSL code
|
|
14
|
+
|
|
15
|
+
Code templates in this document use ShaderToy GLSL style. When generating standalone HTML pages, you must adapt to WebGL2:
|
|
16
|
+
|
|
17
|
+
- Use `canvas.getContext("webgl2")`
|
|
18
|
+
- First line of shader: `#version 300 es`, add `precision highp float;` for fragment shaders
|
|
19
|
+
- Vertex shader: `attribute` → `in`, `varying` → `out`
|
|
20
|
+
- Fragment shader: `varying` → `in`, `gl_FragColor` → custom `out vec4 fragColor`, `texture2D()` → `texture()`
|
|
21
|
+
- ShaderToy's `void mainImage(out vec4 fragColor, in vec2 fragCoord)` must be adapted to standard `void main()` entry
|
|
22
|
+
- Must create Framebuffers and render to texture before post-processing
|
|
23
|
+
|
|
24
|
+
### Complete WebGL2 Standalone HTML Template
|
|
25
|
+
|
|
26
|
+
```html
|
|
27
|
+
<!DOCTYPE html>
|
|
28
|
+
<html>
|
|
29
|
+
<head>
|
|
30
|
+
<meta charset="utf-8">
|
|
31
|
+
<title>Post-Processing Shader</title>
|
|
32
|
+
<style>
|
|
33
|
+
body { margin: 0; overflow: hidden; background: #000; }
|
|
34
|
+
canvas { display: block; width: 100vw; height: 100vh; }
|
|
35
|
+
</style>
|
|
36
|
+
</head>
|
|
37
|
+
<body>
|
|
38
|
+
<canvas id="canvas"></canvas>
|
|
39
|
+
|
|
40
|
+
<!-- Vertex Shader: #version must be the first line -->
|
|
41
|
+
<script id="vs" type="x-shader/x-vertex">
|
|
42
|
+
#version 300 es
|
|
43
|
+
in vec2 a_position;
|
|
44
|
+
out vec2 v_uv;
|
|
45
|
+
void main() {
|
|
46
|
+
v_uv = a_position * 0.5 + 0.5;
|
|
47
|
+
gl_Position = vec4(a_position, 0.0, 1.0);
|
|
48
|
+
}
|
|
49
|
+
</script>
|
|
50
|
+
|
|
51
|
+
<!-- Fragment Shader: #version must be the first line, precision follows -->
|
|
52
|
+
<script id="fs" type="x-shader/x-fragment">
|
|
53
|
+
#version 300 es
|
|
54
|
+
precision highp float;
|
|
55
|
+
|
|
56
|
+
in vec2 v_uv;
|
|
57
|
+
out vec4 fragColor;
|
|
58
|
+
|
|
59
|
+
uniform float iTime;
|
|
60
|
+
uniform vec2 iResolution;
|
|
61
|
+
// Note: Do not use iChannel0 in standalone HTML unless a valid texture is bound
|
|
62
|
+
// Recommended: Use USE_DEMO_SCENE=1 for the built-in demo scene
|
|
63
|
+
|
|
64
|
+
#define USE_DEMO_SCENE 1 // Recommended: use built-in demo scene
|
|
65
|
+
|
|
66
|
+
// Demo scene function (replaces iChannel0 sampling)
|
|
67
|
+
vec3 demoScene(vec2 uv, float time) {
|
|
68
|
+
vec3 col = 0.5 + 0.5 * cos(time + uv.xyx + vec3(0.0, 2.0, 4.0));
|
|
69
|
+
float d = length(uv - 0.5) - 0.12;
|
|
70
|
+
col += vec3(3.0, 2.5, 1.8) * smoothstep(0.02, 0.0, d);
|
|
71
|
+
return col;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Tone mapping and other post-processing functions...
|
|
75
|
+
// Note: Do not reference iChannel0 in the #else branch of #if USE_DEMO_SCENE
|
|
76
|
+
// If you need iChannel0, use #ifdef or ensure the texture is bound when USE_DEMO_SCENE=0
|
|
77
|
+
|
|
78
|
+
void main() {
|
|
79
|
+
vec2 uv = v_uv;
|
|
80
|
+
vec3 color;
|
|
81
|
+
|
|
82
|
+
#if USE_DEMO_SCENE
|
|
83
|
+
color = demoScene(uv, iTime);
|
|
84
|
+
#else
|
|
85
|
+
// This branch only executes when USE_DEMO_SCENE=0 and a texture is bound
|
|
86
|
+
// Requires binding in JavaScript: gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
87
|
+
color = vec3(0.0); // fallback
|
|
88
|
+
#endif
|
|
89
|
+
|
|
90
|
+
fragColor = vec4(color, 1.0);
|
|
91
|
+
}
|
|
92
|
+
</script>
|
|
93
|
+
|
|
94
|
+
<script>
|
|
95
|
+
const canvas = document.getElementById('canvas');
|
|
96
|
+
const gl = canvas.getContext('webgl2');
|
|
97
|
+
|
|
98
|
+
// Compile shader
|
|
99
|
+
function createShader(gl, type, source) {
|
|
100
|
+
const shader = gl.createShader(type);
|
|
101
|
+
gl.shaderSource(shader, source);
|
|
102
|
+
gl.compileShader(shader);
|
|
103
|
+
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
|
|
104
|
+
console.error(gl.getShaderInfoLog(shader));
|
|
105
|
+
gl.deleteShader(shader);
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
return shader;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Create program
|
|
112
|
+
const vs = createShader(gl, gl.VERTEX_SHADER, document.getElementById('vs').textContent);
|
|
113
|
+
const fs = createShader(gl, gl.FRAGMENT_SHADER, document.getElementById('fs').textContent);
|
|
114
|
+
const program = gl.createProgram();
|
|
115
|
+
gl.attachShader(program, vs);
|
|
116
|
+
gl.attachShader(program, fs);
|
|
117
|
+
gl.linkProgram(program);
|
|
118
|
+
|
|
119
|
+
// Fullscreen quad
|
|
120
|
+
const positions = new Float32Array([-1,-1, 1,-1, -1,1, 1,1]);
|
|
121
|
+
const vao = gl.createVertexArray();
|
|
122
|
+
gl.bindVertexArray(vao);
|
|
123
|
+
const buffer = gl.createBuffer();
|
|
124
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
125
|
+
gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);
|
|
126
|
+
|
|
127
|
+
const posLoc = gl.getAttribLocation(program, 'a_position');
|
|
128
|
+
gl.enableVertexAttribArray(posLoc);
|
|
129
|
+
gl.vertexAttribPointer(posLoc, 2, gl.FLOAT, false, 0, 0);
|
|
130
|
+
|
|
131
|
+
// Uniform locations
|
|
132
|
+
const timeLoc = gl.getUniformLocation(program, 'iTime');
|
|
133
|
+
const resLoc = gl.getUniformLocation(program, 'iResolution');
|
|
134
|
+
|
|
135
|
+
// Render loop
|
|
136
|
+
function render(time) {
|
|
137
|
+
canvas.width = window.innerWidth;
|
|
138
|
+
canvas.height = window.innerHeight;
|
|
139
|
+
gl.viewport(0, 0, canvas.width, canvas.height);
|
|
140
|
+
|
|
141
|
+
gl.useProgram(program);
|
|
142
|
+
gl.uniform1f(timeLoc, time * 0.001);
|
|
143
|
+
gl.uniform2f(resLoc, canvas.width, canvas.height);
|
|
144
|
+
|
|
145
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
146
|
+
requestAnimationFrame(render);
|
|
147
|
+
}
|
|
148
|
+
requestAnimationFrame(render);
|
|
149
|
+
</script>
|
|
150
|
+
</body>
|
|
151
|
+
</html>
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Multi-Pass Post-Processing HTML Template (with FBO)
|
|
155
|
+
|
|
156
|
+
Bloom separable blur, TAA, multi-step post-processing pipelines, etc. require rendering to intermediate textures. The following skeleton demonstrates the pattern: render scene to FBO → post-processing reads FBO → output to screen:
|
|
157
|
+
|
|
158
|
+
```html
|
|
159
|
+
<!DOCTYPE html>
|
|
160
|
+
<html>
|
|
161
|
+
<head>
|
|
162
|
+
<meta charset="utf-8">
|
|
163
|
+
<title>Multi-Pass Post-Processing</title>
|
|
164
|
+
<style>
|
|
165
|
+
body { margin: 0; overflow: hidden; background: #000; }
|
|
166
|
+
canvas { display: block; width: 100vw; height: 100vh; }
|
|
167
|
+
</style>
|
|
168
|
+
</head>
|
|
169
|
+
<body>
|
|
170
|
+
<canvas id="c"></canvas>
|
|
171
|
+
<script>
|
|
172
|
+
let frameCount = 0;
|
|
173
|
+
|
|
174
|
+
const canvas = document.getElementById('c');
|
|
175
|
+
const gl = canvas.getContext('webgl2');
|
|
176
|
+
const ext = gl.getExtension('EXT_color_buffer_float');
|
|
177
|
+
|
|
178
|
+
function createShader(type, src) {
|
|
179
|
+
const s = gl.createShader(type);
|
|
180
|
+
gl.shaderSource(s, src);
|
|
181
|
+
gl.compileShader(s);
|
|
182
|
+
if (!gl.getShaderParameter(s, gl.COMPILE_STATUS))
|
|
183
|
+
console.error(gl.getShaderInfoLog(s));
|
|
184
|
+
return s;
|
|
185
|
+
}
|
|
186
|
+
function createProgram(vsSrc, fsSrc) {
|
|
187
|
+
const p = gl.createProgram();
|
|
188
|
+
gl.attachShader(p, createShader(gl.VERTEX_SHADER, vsSrc));
|
|
189
|
+
gl.attachShader(p, createShader(gl.FRAGMENT_SHADER, fsSrc));
|
|
190
|
+
gl.linkProgram(p);
|
|
191
|
+
return p;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
const vsSource = `#version 300 es
|
|
195
|
+
in vec2 pos;
|
|
196
|
+
void main(){ gl_Position=vec4(pos,0,1); }`;
|
|
197
|
+
|
|
198
|
+
// fsScene: Scene rendering shader (outputs HDR color to FBO)
|
|
199
|
+
// fsPost: Post-processing shader (samples scene texture from iChannel0, applies bloom/tonemap/etc)
|
|
200
|
+
const progScene = createProgram(vsSource, fsScene);
|
|
201
|
+
const progPost = createProgram(vsSource, fsPost);
|
|
202
|
+
|
|
203
|
+
function createFBO(w, h) {
|
|
204
|
+
const tex = gl.createTexture();
|
|
205
|
+
gl.bindTexture(gl.TEXTURE_2D, tex);
|
|
206
|
+
// IMPORTANT: Critical: Check for float texture extension, fall back to RGBA8 if unsupported
|
|
207
|
+
const fmt = ext ? gl.RGBA16F : gl.RGBA;
|
|
208
|
+
const typ = ext ? gl.FLOAT : gl.UNSIGNED_BYTE;
|
|
209
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, fmt, w, h, 0, gl.RGBA, typ, null);
|
|
210
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
|
211
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
212
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
213
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
214
|
+
const fbo = gl.createFramebuffer();
|
|
215
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
|
|
216
|
+
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0);
|
|
217
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
218
|
+
return { fbo, tex };
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
let W, H, sceneFBO;
|
|
222
|
+
|
|
223
|
+
const vao = gl.createVertexArray();
|
|
224
|
+
gl.bindVertexArray(vao);
|
|
225
|
+
const vbo = gl.createBuffer();
|
|
226
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
|
|
227
|
+
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1,-1, 1,-1, -1,1, 1,1]), gl.STATIC_DRAW);
|
|
228
|
+
gl.enableVertexAttribArray(0);
|
|
229
|
+
gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);
|
|
230
|
+
|
|
231
|
+
function resize() {
|
|
232
|
+
canvas.width = W = innerWidth;
|
|
233
|
+
canvas.height = H = innerHeight;
|
|
234
|
+
sceneFBO = createFBO(W, H);
|
|
235
|
+
}
|
|
236
|
+
addEventListener('resize', resize);
|
|
237
|
+
resize();
|
|
238
|
+
|
|
239
|
+
function render(t) {
|
|
240
|
+
t *= 0.001;
|
|
241
|
+
// Pass 1: Scene rendering → FBO
|
|
242
|
+
gl.useProgram(progScene);
|
|
243
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, sceneFBO.fbo);
|
|
244
|
+
gl.viewport(0, 0, W, H);
|
|
245
|
+
gl.uniform2f(gl.getUniformLocation(progScene, 'iResolution'), W, H);
|
|
246
|
+
gl.uniform1f(gl.getUniformLocation(progScene, 'iTime'), t);
|
|
247
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
248
|
+
|
|
249
|
+
// Pass 2: Post-processing reads scene texture → screen
|
|
250
|
+
gl.useProgram(progPost);
|
|
251
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
252
|
+
gl.viewport(0, 0, W, H);
|
|
253
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
254
|
+
gl.bindTexture(gl.TEXTURE_2D, sceneFBO.tex);
|
|
255
|
+
gl.uniform1i(gl.getUniformLocation(progPost, 'iChannel0'), 0);
|
|
256
|
+
gl.uniform2f(gl.getUniformLocation(progPost, 'iResolution'), W, H);
|
|
257
|
+
gl.uniform1f(gl.getUniformLocation(progPost, 'iTime'), t);
|
|
258
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
259
|
+
|
|
260
|
+
frameCount++;
|
|
261
|
+
requestAnimationFrame(render);
|
|
262
|
+
}
|
|
263
|
+
requestAnimationFrame(render);
|
|
264
|
+
</script>
|
|
265
|
+
</body>
|
|
266
|
+
</html>
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
# Screen-Space Post-Processing Effects
|
|
270
|
+
|
|
271
|
+
## Use Cases
|
|
272
|
+
|
|
273
|
+
Screen-space image enhancement on already-rendered scenes: Tone Mapping, Bloom, Vignette, Chromatic Aberration, Motion Blur, DoF, FXAA/TAA, Color Grading, Film Grain, Lens Flare, etc.
|
|
274
|
+
|
|
275
|
+
Typical pipeline order: Scene Rendering → AA → Bloom → Chromatic Aberration → Motion Blur/DoF → Tone Mapping → Color Grading → Contrast → Vignette → Film Grain → Gamma → Dithering.
|
|
276
|
+
|
|
277
|
+
## Core Principles
|
|
278
|
+
|
|
279
|
+
The essence of post-processing is **per-pixel transformation of an already-rendered image** — input is a framebuffer texture, output is the transformed color value.
|
|
280
|
+
|
|
281
|
+
- **Tone Mapping**: HDR [0, ∞) → LDR [0, 1]. Reinhard `c/(1+c)`, Filmic Reinhard (white point/shoulder parameters), ACES (3×3 matrix + rational polynomial), generic rational polynomial
|
|
282
|
+
- **Gaussian Blur**: 2D Gaussian kernel is separable into two 1D passes, O(n²) → O(2n)
|
|
283
|
+
- **Bloom**: Bright-pass extraction → multi-level Gaussian blur → additive blend back to original
|
|
284
|
+
- **Vignette**: Brightness falloff based on pixel distance to center. Multiplicative or radial
|
|
285
|
+
- **Chromatic Aberration**: Sample the same texture at different scales for R/G/B channels
|
|
286
|
+
|
|
287
|
+
## Implementation Steps
|
|
288
|
+
|
|
289
|
+
### Step 1: Tone Mapping
|
|
290
|
+
|
|
291
|
+
```glsl
|
|
292
|
+
// Reinhard
|
|
293
|
+
vec3 reinhard(vec3 color) { return color / (1.0 + color); }
|
|
294
|
+
|
|
295
|
+
// Filmic Reinhard (W=white point, T2=shoulder parameter)
|
|
296
|
+
// IMPORTANT: GLSL critical rule: function parameters must be defined before use; using a variable name in its own initializer is forbidden
|
|
297
|
+
const float W = 1.2, T2 = 7.5; // adjustable
|
|
298
|
+
float filmic_reinhard_curve(float x) {
|
|
299
|
+
float q = (T2 * T2 + 1.0) * x * x;
|
|
300
|
+
return q / (q + x + T2 * T2);
|
|
301
|
+
}
|
|
302
|
+
vec3 filmic_reinhard(vec3 x) {
|
|
303
|
+
float w = filmic_reinhard_curve(W); // compute w using constant W first
|
|
304
|
+
return vec3(filmic_reinhard_curve(x.r), filmic_reinhard_curve(x.g), filmic_reinhard_curve(x.b)) / w;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// ACES industry standard
|
|
308
|
+
vec3 aces_tonemap(vec3 color) {
|
|
309
|
+
mat3 m1 = mat3(0.59719,0.07600,0.02840, 0.35458,0.90834,0.13383, 0.04823,0.01566,0.83777);
|
|
310
|
+
mat3 m2 = mat3(1.60475,-0.10208,-0.00327, -0.53108,1.10813,-0.07276, -0.07367,-0.00605,1.07602);
|
|
311
|
+
vec3 v = m1 * color;
|
|
312
|
+
vec3 a = v * (v + 0.0245786) - 0.000090537;
|
|
313
|
+
vec3 b = v * (0.983729 * v + 0.4329510) + 0.238081;
|
|
314
|
+
return clamp(m2 * (a / b), 0.0, 1.0);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// Generic rational polynomial
|
|
318
|
+
vec3 rational_tonemap(vec3 x) {
|
|
319
|
+
float a=0.010, b=0.132, c=0.010, d=0.163, e=0.101; // adjustable
|
|
320
|
+
return (x * (a * x + b)) / (x * (c * x + d) + e);
|
|
321
|
+
}
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
### Step 2: Gamma Correction
|
|
325
|
+
|
|
326
|
+
```glsl
|
|
327
|
+
color = pow(color, vec3(1.0 / 2.2)); // after tone mapping; ACES already includes gamma, skip this step
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
### Step 3: Contrast Enhancement (Hermite S-Curve)
|
|
331
|
+
|
|
332
|
+
```glsl
|
|
333
|
+
color = clamp(color, 0.0, 1.0);
|
|
334
|
+
color = color * color * (3.0 - 2.0 * color);
|
|
335
|
+
// Controllable intensity: color = mix(color, color*color*(3.0-2.0*color), strength);
|
|
336
|
+
// smoothstep equivalent: color = smoothstep(-0.025, 1.0, color);
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
### Step 4: Color Grading
|
|
340
|
+
|
|
341
|
+
```glsl
|
|
342
|
+
color = color * vec3(1.11, 0.89, 0.79); // per-channel multiply (warm tone), adjustable
|
|
343
|
+
color = pow(color, vec3(1.3, 1.2, 1.0)); // pow color grading, adjustable
|
|
344
|
+
// HSV hue shift: hsv.x = fract(hsv.x + 0.05); hsv.y *= 1.1;
|
|
345
|
+
// Desaturation: color = mix(color, vec3(dot(color, vec3(0.299,0.587,0.114))), 0.2);
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
### Step 5: Vignette
|
|
349
|
+
|
|
350
|
+
```glsl
|
|
351
|
+
// Option A: Multiplicative
|
|
352
|
+
vec2 q = fragCoord / iResolution.xy;
|
|
353
|
+
float vignette = pow(16.0 * q.x * q.y * (1.0 - q.x) * (1.0 - q.y), 0.25);
|
|
354
|
+
color *= 0.5 + 0.5 * vignette;
|
|
355
|
+
|
|
356
|
+
// Option B: Radial distance
|
|
357
|
+
vec2 centered = (uv - 0.5) * vec2(iResolution.x / iResolution.y, 1.0);
|
|
358
|
+
float vig = mix(1.0, max(0.0, 1.0 - pow(length(centered)/1.414 * 0.6, 3.0)), 0.5);
|
|
359
|
+
color *= vig;
|
|
360
|
+
|
|
361
|
+
// Option C: Inverse quadratic falloff
|
|
362
|
+
vec2 p = 1.0 - 2.0 * fragCoord / iResolution.xy;
|
|
363
|
+
p.y *= iResolution.y / iResolution.x;
|
|
364
|
+
float vig2 = 1.25 / (1.1 + 1.1 * dot(p, p)); vig2 *= vig2;
|
|
365
|
+
color *= mix(1.0, smoothstep(0.1, 1.1, vig2), 0.25);
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
### Step 6: Gaussian Blur
|
|
369
|
+
|
|
370
|
+
```glsl
|
|
371
|
+
float normpdf(float x, float sigma) {
|
|
372
|
+
return 0.39894 * exp(-0.5 * x * x / (sigma * sigma)) / sigma;
|
|
373
|
+
}
|
|
374
|
+
vec3 gaussianBlur(sampler2D tex, vec2 fragCoord, vec2 resolution) {
|
|
375
|
+
const int KERNEL_SIZE = 11, HALF = 5; // adjustable: KERNEL_SIZE must be odd
|
|
376
|
+
float sigma = 7.0; // adjustable
|
|
377
|
+
float kernel[KERNEL_SIZE]; float Z = 0.0;
|
|
378
|
+
for (int j = 0; j <= HALF; ++j)
|
|
379
|
+
kernel[HALF + j] = kernel[HALF - j] = normpdf(float(j), sigma);
|
|
380
|
+
for (int j = 0; j < KERNEL_SIZE; ++j) Z += kernel[j];
|
|
381
|
+
vec3 result = vec3(0.0);
|
|
382
|
+
for (int i = -HALF; i <= HALF; ++i)
|
|
383
|
+
for (int j = -HALF; j <= HALF; ++j)
|
|
384
|
+
result += kernel[HALF+j] * kernel[HALF+i]
|
|
385
|
+
* texture(tex, (fragCoord + vec2(float(i), float(j))) / resolution).rgb;
|
|
386
|
+
return result / (Z * Z);
|
|
387
|
+
}
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
### Step 7: Bloom (Single Pass, Hardware Mipmap)
|
|
391
|
+
|
|
392
|
+
```glsl
|
|
393
|
+
vec3 simpleBloom(sampler2D tex, vec2 uv) {
|
|
394
|
+
vec3 bloom = vec3(0.0); float tw = 0.0; float maxB = 5.0; // adjustable
|
|
395
|
+
for (int x = -1; x <= 1; x++)
|
|
396
|
+
for (int y = -1; y <= 1; y++) {
|
|
397
|
+
vec2 off = vec2(float(x), float(y)) / iResolution.xy; float w = 1.0;
|
|
398
|
+
bloom += w * min(vec3(maxB), textureLod(tex, uv+off*exp2(5.0), 5.0).rgb); tw += w;
|
|
399
|
+
bloom += w * min(vec3(maxB), textureLod(tex, uv+off*exp2(6.0), 6.0).rgb); tw += w;
|
|
400
|
+
bloom += w * min(vec3(maxB), textureLod(tex, uv+off*exp2(7.0), 7.0).rgb); tw += w;
|
|
401
|
+
}
|
|
402
|
+
return pow(bloom / tw, vec3(1.5)) * 0.3; // adjustable: gamma and intensity
|
|
403
|
+
}
|
|
404
|
+
// Usage: color = color * 0.8 + simpleBloom(iChannel0, uv);
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
### Step 8: Chromatic Aberration
|
|
408
|
+
|
|
409
|
+
```glsl
|
|
410
|
+
#define CA_SAMPLES 8 // adjustable
|
|
411
|
+
#define CA_STRENGTH 0.003 // adjustable
|
|
412
|
+
vec3 chromaticAberration(sampler2D tex, vec2 uv) {
|
|
413
|
+
vec2 center = uv - 0.5; vec3 color = vec3(0.0);
|
|
414
|
+
float rf = 1.0, gf = 1.0, bf = 1.0, f = 1.0 / float(CA_SAMPLES);
|
|
415
|
+
for (int i = 0; i < CA_SAMPLES; ++i) {
|
|
416
|
+
color.r += f * texture(tex, 0.5 - 0.5 * (center * 2.0 * rf)).r;
|
|
417
|
+
color.g += f * texture(tex, 0.5 - 0.5 * (center * 2.0 * gf)).g;
|
|
418
|
+
color.b += f * texture(tex, 0.5 - 0.5 * (center * 2.0 * bf)).b;
|
|
419
|
+
rf *= 1.0 - CA_STRENGTH; gf *= 1.0 - CA_STRENGTH*0.3; bf *= 1.0 + CA_STRENGTH*0.4;
|
|
420
|
+
}
|
|
421
|
+
return clamp(color, 0.0, 1.0);
|
|
422
|
+
}
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
### Step 9: Film Grain
|
|
426
|
+
|
|
427
|
+
```glsl
|
|
428
|
+
float hash(float c) { return fract(sin(dot(c, vec2(12.9898, 78.233))) * 43758.5453); }
|
|
429
|
+
#define GRAIN_STRENGTH 0.012 // adjustable
|
|
430
|
+
color += vec3(GRAIN_STRENGTH * hash(length(fragCoord / iResolution.xy) + iTime));
|
|
431
|
+
|
|
432
|
+
// Bayer matrix ordered dithering (eliminates color banding)
|
|
433
|
+
const mat4 bayerMatrix = mat4(
|
|
434
|
+
vec4(0.,8.,2.,10.), vec4(12.,4.,14.,6.), vec4(3.,11.,1.,9.), vec4(15.,7.,13.,5.));
|
|
435
|
+
float orderedDither(vec2 fc) {
|
|
436
|
+
return (bayerMatrix[int(fc.x)&3][int(fc.y)&3] + 1.0) / 17.0;
|
|
437
|
+
}
|
|
438
|
+
color += (orderedDither(fragCoord) - 0.5) * 4.0 / 255.0;
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
### Step 10: Demo Scene (Required for Standalone HTML!)
|
|
442
|
+
|
|
443
|
+
**IMPORTANT: Critical Warning**: Standalone HTML deployment must provide an input texture, otherwise post-processing effects will output solid black.
|
|
444
|
+
|
|
445
|
+
```glsl
|
|
446
|
+
// Demo scene fallback: used when no valid input texture is available
|
|
447
|
+
vec3 demoScene(vec2 uv, float time) {
|
|
448
|
+
// Dynamic gradient background
|
|
449
|
+
vec3 col = 0.5 + 0.5 * cos(time + uv.xyx + vec3(0, 2, 4));
|
|
450
|
+
|
|
451
|
+
// Center glowing sphere (for testing bloom)
|
|
452
|
+
float d = length(uv - 0.5) - 0.15;
|
|
453
|
+
col += vec3(2.0) * smoothstep(0.02, 0.0, d); // extremely bright region
|
|
454
|
+
|
|
455
|
+
// Moving highlight bar (for testing bloom bleed)
|
|
456
|
+
float bar = step(0.48, uv.y) * step(uv.y, 0.52);
|
|
457
|
+
bar *= step(0.0, sin(uv.x * 10.0 - time * 2.0));
|
|
458
|
+
col += vec3(1.5, 0.8, 0.3) * bar;
|
|
459
|
+
|
|
460
|
+
// Colored blocks (for testing chromatic aberration and tone mapping)
|
|
461
|
+
vec2 id = floor(uv * 4.0);
|
|
462
|
+
float rand = fract(sin(dot(id, vec2(12.9898, 78.233))) * 43758.5453);
|
|
463
|
+
vec2 rect = fract(uv * 4.0);
|
|
464
|
+
float box = step(0.1, rect.x) * step(rect.x, 0.9) * step(0.1, rect.y) * step(rect.y, 0.9);
|
|
465
|
+
col += vec3(rand, 1.0 - rand, 0.5) * box * 0.5;
|
|
466
|
+
|
|
467
|
+
return col;
|
|
468
|
+
}
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
### Step 10: Motion Blur
|
|
472
|
+
|
|
473
|
+
```glsl
|
|
474
|
+
#define MB_SAMPLES 32 // adjustable
|
|
475
|
+
#define MB_STRENGTH 0.25 // adjustable
|
|
476
|
+
vec3 motionBlur(sampler2D tex, vec2 uv, vec2 velocity) {
|
|
477
|
+
vec2 dir = velocity * MB_STRENGTH; vec3 color = vec3(0.0); float tw = 0.0;
|
|
478
|
+
for (int i = 0; i < MB_SAMPLES; i++) {
|
|
479
|
+
float t = float(i) / float(MB_SAMPLES - 1), w = 1.0 - t;
|
|
480
|
+
color += w * textureLod(tex, uv + dir * t, 0.0).rgb; tw += w;
|
|
481
|
+
}
|
|
482
|
+
return color / tw;
|
|
483
|
+
}
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
### Step 11: Depth of Field
|
|
487
|
+
|
|
488
|
+
```glsl
|
|
489
|
+
#define DOF_SAMPLES 64
|
|
490
|
+
#define DOF_FOCAL_LENGTH 0.03
|
|
491
|
+
float getCoC(float depth, float focusDist) {
|
|
492
|
+
float aperture = min(1.0, focusDist * focusDist * 0.5);
|
|
493
|
+
return abs(aperture * (DOF_FOCAL_LENGTH * (depth - focusDist))
|
|
494
|
+
/ (depth * (focusDist - DOF_FOCAL_LENGTH)));
|
|
495
|
+
}
|
|
496
|
+
float goldenAngle = 3.14159265 * (3.0 - sqrt(5.0));
|
|
497
|
+
vec3 depthOfField(sampler2D tex, vec2 uv, float depth, float focusDist) {
|
|
498
|
+
float coc = getCoC(depth, focusDist);
|
|
499
|
+
vec3 result = texture(tex, uv).rgb * max(0.001, coc);
|
|
500
|
+
float tw = max(0.001, coc);
|
|
501
|
+
for (int i = 1; i < DOF_SAMPLES; i++) {
|
|
502
|
+
float fi = float(i);
|
|
503
|
+
float theta = fi * goldenAngle * float(DOF_SAMPLES);
|
|
504
|
+
float r = coc * sqrt(fi) / sqrt(float(DOF_SAMPLES));
|
|
505
|
+
vec2 tapUV = uv + vec2(sin(theta), cos(theta)) * r;
|
|
506
|
+
vec4 s = textureLod(tex, tapUV, 0.0);
|
|
507
|
+
float w = max(0.001, getCoC(s.w, focusDist));
|
|
508
|
+
result += s.rgb * w; tw += w;
|
|
509
|
+
}
|
|
510
|
+
return result / tw;
|
|
511
|
+
}
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
### Step 12: FXAA
|
|
515
|
+
|
|
516
|
+
```glsl
|
|
517
|
+
vec3 fxaa(sampler2D tex, vec2 fragCoord, vec2 resolution) {
|
|
518
|
+
vec2 pp = 1.0 / resolution;
|
|
519
|
+
vec4 color = texture(tex, fragCoord * pp);
|
|
520
|
+
vec3 luma = vec3(0.299, 0.587, 0.114);
|
|
521
|
+
float lumaNW = dot(texture(tex, (fragCoord+vec2(-1.,-1.))*pp).rgb, luma);
|
|
522
|
+
float lumaNE = dot(texture(tex, (fragCoord+vec2( 1.,-1.))*pp).rgb, luma);
|
|
523
|
+
float lumaSW = dot(texture(tex, (fragCoord+vec2(-1., 1.))*pp).rgb, luma);
|
|
524
|
+
float lumaSE = dot(texture(tex, (fragCoord+vec2( 1., 1.))*pp).rgb, luma);
|
|
525
|
+
float lumaM = dot(color.rgb, luma);
|
|
526
|
+
float lumaMin = min(lumaM, min(min(lumaNW,lumaNE), min(lumaSW,lumaSE)));
|
|
527
|
+
float lumaMax = max(lumaM, max(max(lumaNW,lumaNE), max(lumaSW,lumaSE)));
|
|
528
|
+
vec2 dir = vec2(-((lumaNW+lumaNE)-(lumaSW+lumaSE)), ((lumaNW+lumaSW)-(lumaNE+lumaSE)));
|
|
529
|
+
float dirReduce = max((lumaNW+lumaNE+lumaSW+lumaSE)*0.03125, 1.0/128.0);
|
|
530
|
+
dir = clamp(dir * 2.5/(min(abs(dir.x),abs(dir.y))+dirReduce), vec2(-8.0), vec2(8.0)) * pp;
|
|
531
|
+
vec3 rgbA = 0.5 * (texture(tex, fragCoord*pp+dir*(1./3.-0.5)).rgb
|
|
532
|
+
+ texture(tex, fragCoord*pp+dir*(2./3.-0.5)).rgb);
|
|
533
|
+
vec3 rgbB = rgbA*0.5 + 0.25*(texture(tex, fragCoord*pp+dir*-0.5).rgb
|
|
534
|
+
+ texture(tex, fragCoord*pp+dir*0.5).rgb);
|
|
535
|
+
float lumaB = dot(rgbB, luma);
|
|
536
|
+
return (lumaB < lumaMin || lumaB > lumaMax) ? rgbA : rgbB;
|
|
537
|
+
}
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
## Complete Code Template
|
|
541
|
+
|
|
542
|
+
Can be run directly in ShaderToy. `iChannel0` is the scene texture.
|
|
543
|
+
|
|
544
|
+
**IMPORTANT: Important Warning**: For standalone HTML deployment, you must:
|
|
545
|
+
1. Pass a valid input texture to iChannel0 (or uChannel0)
|
|
546
|
+
2. Or set `#define USE_DEMO_SCENE 1` to use the built-in demo scene
|
|
547
|
+
|
|
548
|
+
```glsl
|
|
549
|
+
// Post-Processing Pipeline — ShaderToy Template
|
|
550
|
+
#define ENABLE_TONEMAP 1
|
|
551
|
+
#define ENABLE_BLOOM 1
|
|
552
|
+
#define ENABLE_CA 1
|
|
553
|
+
#define ENABLE_VIGNETTE 1
|
|
554
|
+
#define ENABLE_GRAIN 1
|
|
555
|
+
#define ENABLE_CONTRAST 1
|
|
556
|
+
#define USE_DEMO_SCENE 1 // set to 1 to use built-in demo scene (required for standalone HTML)
|
|
557
|
+
#define TONEMAP_MODE 2 // 0=Reinhard, 1=Filmic, 2=ACES
|
|
558
|
+
#define BRIGHTNESS 1.0
|
|
559
|
+
#define WHITE_POINT 1.2
|
|
560
|
+
#define SHOULDER 7.5
|
|
561
|
+
#define BLOOM_STRENGTH 0.08
|
|
562
|
+
#define BLOOM_LOD_START 4.0
|
|
563
|
+
#define COLOR_TINT vec3(1.11, 0.89, 0.79)
|
|
564
|
+
#define CA_SAMPLES 8
|
|
565
|
+
#define CA_INTENSITY 0.003
|
|
566
|
+
#define VIG_POWER 0.25
|
|
567
|
+
#define GRAIN_AMOUNT 0.012
|
|
568
|
+
|
|
569
|
+
float hash11(float p) { return fract(sin(p * 12.9898) * 43758.5453); }
|
|
570
|
+
|
|
571
|
+
// Demo scene fallback: used when no input texture is available
|
|
572
|
+
vec3 demoScene(vec2 uv, float time) {
|
|
573
|
+
// Dynamic gradient background
|
|
574
|
+
vec3 col = 0.5 + 0.5 * cos(time + uv.xyx + vec3(0, 2, 4));
|
|
575
|
+
// Center glowing sphere (for testing bloom)
|
|
576
|
+
float d = length(uv - 0.5) - 0.15;
|
|
577
|
+
col += vec3(2.0) * smoothstep(0.02, 0.0, d);
|
|
578
|
+
// Moving highlight bar (for testing bloom bleed)
|
|
579
|
+
float bar = step(0.48, uv.y) * step(uv.y, 0.52);
|
|
580
|
+
bar *= step(0.0, sin(uv.x * 10.0 - time * 2.0));
|
|
581
|
+
col += vec3(1.5, 0.8, 0.3) * bar;
|
|
582
|
+
// Colored blocks (for testing chromatic aberration and tone mapping)
|
|
583
|
+
vec2 id = floor(uv * 4.0);
|
|
584
|
+
float rand = fract(sin(dot(id, vec2(12.9898, 78.233))) * 43758.5453);
|
|
585
|
+
vec2 rect = fract(uv * 4.0);
|
|
586
|
+
float box = step(0.1, rect.x) * step(rect.x, 0.9) * step(0.1, rect.y) * step(rect.y, 0.9);
|
|
587
|
+
col += vec3(rand, 1.0 - rand, 0.5) * box * 0.5;
|
|
588
|
+
return col;
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
vec3 tonemapReinhard(vec3 c) { return c / (1.0 + c); }
|
|
592
|
+
// IMPORTANT: Critical: filmicCurve takes only one parameter x; w is computed externally via WHITE_POINT
|
|
593
|
+
float filmicCurve(float x) {
|
|
594
|
+
float q = (SHOULDER*SHOULDER+1.0)*x*x; return q/(q+x+SHOULDER*SHOULDER);
|
|
595
|
+
}
|
|
596
|
+
vec3 tonemapFilmic(vec3 c) {
|
|
597
|
+
float w = filmicCurve(WHITE_POINT); // compute w using WHITE_POINT constant first
|
|
598
|
+
return vec3(filmicCurve(c.r), filmicCurve(c.g), filmicCurve(c.b)) / w;
|
|
599
|
+
}
|
|
600
|
+
vec3 tonemapACES(vec3 color) {
|
|
601
|
+
mat3 m1 = mat3(0.59719,0.07600,0.02840, 0.35458,0.90834,0.13383, 0.04823,0.01566,0.83777);
|
|
602
|
+
mat3 m2 = mat3(1.60475,-0.10208,-0.00327, -0.53108,1.10813,-0.07276, -0.07367,-0.00605,1.07602);
|
|
603
|
+
vec3 v = m1*color;
|
|
604
|
+
vec3 a = v*(v+0.0245786)-0.000090537;
|
|
605
|
+
vec3 b = v*(0.983729*v+0.4329510)+0.238081;
|
|
606
|
+
return clamp(m2*(a/b), 0.0, 1.0);
|
|
607
|
+
}
|
|
608
|
+
vec3 applyTonemap(vec3 c) {
|
|
609
|
+
c *= BRIGHTNESS;
|
|
610
|
+
#if TONEMAP_MODE == 0
|
|
611
|
+
return tonemapReinhard(c);
|
|
612
|
+
#elif TONEMAP_MODE == 1
|
|
613
|
+
return tonemapFilmic(c);
|
|
614
|
+
#else
|
|
615
|
+
return tonemapACES(c);
|
|
616
|
+
#endif
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
vec3 sampleBloom(sampler2D tex, vec2 uv) {
|
|
620
|
+
vec3 bloom = vec3(0.0); float tw = 0.0;
|
|
621
|
+
for (int x = -1; x <= 1; x++)
|
|
622
|
+
for (int y = -1; y <= 1; y++) {
|
|
623
|
+
vec2 off = vec2(float(x),float(y))/iResolution.xy; float w = 1.0;
|
|
624
|
+
bloom += w*textureLod(tex, uv+off*exp2(BLOOM_LOD_START), BLOOM_LOD_START).rgb;
|
|
625
|
+
bloom += w*textureLod(tex, uv+off*exp2(BLOOM_LOD_START+1.0), BLOOM_LOD_START+1.0).rgb;
|
|
626
|
+
bloom += w*textureLod(tex, uv+off*exp2(BLOOM_LOD_START+2.0), BLOOM_LOD_START+2.0).rgb;
|
|
627
|
+
tw += w*3.0;
|
|
628
|
+
}
|
|
629
|
+
return bloom / tw;
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
vec3 applyChromaticAberration(sampler2D tex, vec2 uv) {
|
|
633
|
+
vec2 center = 1.0 - 2.0*uv; vec3 color = vec3(0.0);
|
|
634
|
+
float rf=1.0, gf=1.0, bf=1.0, f=1.0/float(CA_SAMPLES);
|
|
635
|
+
for (int i = 0; i < CA_SAMPLES; ++i) {
|
|
636
|
+
color.r += f*texture(tex, 0.5-0.5*(center*rf)).r;
|
|
637
|
+
color.g += f*texture(tex, 0.5-0.5*(center*gf)).g;
|
|
638
|
+
color.b += f*texture(tex, 0.5-0.5*(center*bf)).b;
|
|
639
|
+
rf *= 1.0-CA_INTENSITY; gf *= 1.0-CA_INTENSITY*0.3; bf *= 1.0+CA_INTENSITY*0.4;
|
|
640
|
+
}
|
|
641
|
+
return clamp(color, 0.0, 1.0);
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
|
|
645
|
+
vec2 uv = fragCoord / iResolution.xy;
|
|
646
|
+
|
|
647
|
+
// Get input color: demo scene or input texture
|
|
648
|
+
#if USE_DEMO_SCENE
|
|
649
|
+
vec3 color = demoScene(uv, iTime);
|
|
650
|
+
#else
|
|
651
|
+
#if ENABLE_CA
|
|
652
|
+
vec3 color = applyChromaticAberration(iChannel0, uv);
|
|
653
|
+
#else
|
|
654
|
+
vec3 color = texture(iChannel0, uv).rgb;
|
|
655
|
+
#endif
|
|
656
|
+
#endif
|
|
657
|
+
|
|
658
|
+
#if ENABLE_BLOOM && !USE_DEMO_SCENE
|
|
659
|
+
color += sampleBloom(iChannel0, uv) * BLOOM_STRENGTH;
|
|
660
|
+
#else
|
|
661
|
+
// In demo scene mode, use simplified bloom sampling from itself
|
|
662
|
+
#if ENABLE_BLOOM
|
|
663
|
+
vec3 bloom = vec3(0.0); float tw = 0.0;
|
|
664
|
+
for (int x = -1; x <= 1; x++)
|
|
665
|
+
for (int y = -1; y <= 1; y++) {
|
|
666
|
+
vec2 off = vec2(float(x),float(y))/iResolution.xy * 0.02;
|
|
667
|
+
vec3 s = demoScene(uv + off, iTime);
|
|
668
|
+
float w = 1.0;
|
|
669
|
+
bloom += w * min(vec3(5.0), s); tw += w;
|
|
670
|
+
}
|
|
671
|
+
color += bloom / tw * BLOOM_STRENGTH;
|
|
672
|
+
#endif
|
|
673
|
+
#endif
|
|
674
|
+
|
|
675
|
+
color *= COLOR_TINT;
|
|
676
|
+
#if ENABLE_TONEMAP
|
|
677
|
+
#if TONEMAP_MODE == 2
|
|
678
|
+
color = applyTonemap(color);
|
|
679
|
+
#else
|
|
680
|
+
color = applyTonemap(color);
|
|
681
|
+
color = pow(color, vec3(1.0/2.2));
|
|
682
|
+
#endif
|
|
683
|
+
#else
|
|
684
|
+
color = pow(color, vec3(1.0/2.2));
|
|
685
|
+
#endif
|
|
686
|
+
#if ENABLE_CONTRAST
|
|
687
|
+
color = clamp(color, 0.0, 1.0);
|
|
688
|
+
color = color*color*(3.0-2.0*color);
|
|
689
|
+
#endif
|
|
690
|
+
#if ENABLE_VIGNETTE
|
|
691
|
+
vec2 q = fragCoord/iResolution.xy;
|
|
692
|
+
color *= 0.5 + 0.5*pow(16.0*q.x*q.y*(1.0-q.x)*(1.0-q.y), VIG_POWER);
|
|
693
|
+
#endif
|
|
694
|
+
#if ENABLE_GRAIN
|
|
695
|
+
color += GRAIN_AMOUNT * hash11(dot(uv, vec2(12.9898,78.233)) + iTime);
|
|
696
|
+
#endif
|
|
697
|
+
fragColor = vec4(clamp(color, 0.0, 1.0), 1.0);
|
|
698
|
+
}
|
|
699
|
+
```
|
|
700
|
+
|
|
701
|
+
## Common Variants
|
|
702
|
+
|
|
703
|
+
### Variant 1: Multi-Pass Separable Bloom
|
|
704
|
+
|
|
705
|
+
```glsl
|
|
706
|
+
// Buffer A: Horizontal Gaussian blur + bright-pass
|
|
707
|
+
#define BLOOM_THRESHOLD vec3(0.2)
|
|
708
|
+
#define BLOOM_DOWNSAMPLE 3
|
|
709
|
+
#define BLUR_RADIUS 16
|
|
710
|
+
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
|
|
711
|
+
ivec2 xy = ivec2(fragCoord);
|
|
712
|
+
if (xy.x >= int(iResolution.x)/BLOOM_DOWNSAMPLE) { fragColor = vec4(0); return; }
|
|
713
|
+
vec3 sum = vec3(0.0); float tw = 0.0;
|
|
714
|
+
for (int k = -BLUR_RADIUS; k <= BLUR_RADIUS; ++k) {
|
|
715
|
+
vec3 texel = max(vec3(0.0), texelFetch(iChannel0, (xy+ivec2(k,0))*BLOOM_DOWNSAMPLE, 0).rgb - BLOOM_THRESHOLD);
|
|
716
|
+
float w = exp(-8.0 * pow(abs(float(k))/float(BLUR_RADIUS), 2.0));
|
|
717
|
+
sum += texel*w; tw += w;
|
|
718
|
+
}
|
|
719
|
+
fragColor = vec4(sum/tw, 1.0);
|
|
720
|
+
}
|
|
721
|
+
// Buffer B: Vertical blur, same as above but with direction changed to ivec2(0, k)
|
|
722
|
+
```
|
|
723
|
+
|
|
724
|
+
### Variant 2: ACES + Full Color Pipeline (with Built-in Gamma)
|
|
725
|
+
|
|
726
|
+
```glsl
|
|
727
|
+
vec3 aces_tonemap(vec3 color) {
|
|
728
|
+
mat3 m1 = mat3(0.59719,0.07600,0.02840, 0.35458,0.90834,0.13383, 0.04823,0.01566,0.83777);
|
|
729
|
+
mat3 m2 = mat3(1.60475,-0.10208,-0.00327, -0.53108,1.10813,-0.07276, -0.07367,-0.00605,1.07602);
|
|
730
|
+
vec3 v = m1*color;
|
|
731
|
+
vec3 a = v*(v+0.0245786)-0.000090537;
|
|
732
|
+
vec3 b = v*(0.983729*v+0.4329510)+0.238081;
|
|
733
|
+
return pow(clamp(m2*(a/b), 0.0, 1.0), vec3(1.0/2.2));
|
|
734
|
+
}
|
|
735
|
+
```
|
|
736
|
+
|
|
737
|
+
### Variant 3: DoF + Motion Blur Combination
|
|
738
|
+
|
|
739
|
+
```glsl
|
|
740
|
+
for (int i = 1; i < BLUR_TAPS; i++) {
|
|
741
|
+
float t = float(i)/float(BLUR_TAPS);
|
|
742
|
+
float randomT = hash(iTime + t + uv.x + uv.y*12.345);
|
|
743
|
+
vec2 tapUV = mix(currentUV, prevFrameUV, (randomT-0.5)*shutterAngle); // motion blur
|
|
744
|
+
float theta = t*goldenAngle*float(BLUR_TAPS);
|
|
745
|
+
float r = coc*sqrt(t*float(BLUR_TAPS))/sqrt(float(BLUR_TAPS));
|
|
746
|
+
tapUV += vec2(sin(theta), cos(theta))*r; // DoF
|
|
747
|
+
vec4 tap = textureLod(sceneTex, tapUV, 0.0);
|
|
748
|
+
float w = max(0.001, getCoC(decodeDepth(tap.w), focusDistance));
|
|
749
|
+
result += tap.rgb*w; totalWeight += w;
|
|
750
|
+
}
|
|
751
|
+
```
|
|
752
|
+
|
|
753
|
+
### Variant 4: TAA Temporal Anti-Aliasing
|
|
754
|
+
|
|
755
|
+
```glsl
|
|
756
|
+
vec4 current = textureLod(currentFrame, uv - jitterOffset/iResolution.xy, 0.0);
|
|
757
|
+
vec3 vMin = vec3(1e5), vMax = vec3(-1e5);
|
|
758
|
+
for (int iy = -1; iy <= 1; iy++)
|
|
759
|
+
for (int ix = -1; ix <= 1; ix++) {
|
|
760
|
+
vec3 s = texelFetch(currentFrame, ivec2(fragCoord)+ivec2(ix,iy), 0).rgb;
|
|
761
|
+
vMin = min(vMin, s); vMax = max(vMax, s);
|
|
762
|
+
}
|
|
763
|
+
vec4 history = textureLod(historyBuffer, reprojectToPrevFrame(worldPos, prevViewProjMatrix), 0.0);
|
|
764
|
+
float blend = (all(greaterThanEqual(history.rgb, vMin)) && all(lessThanEqual(history.rgb, vMax))) ? 0.9 : 0.0;
|
|
765
|
+
color = mix(current.rgb, history.rgb, blend);
|
|
766
|
+
```
|
|
767
|
+
|
|
768
|
+
### Variant 5: Lens Flare + Starburst
|
|
769
|
+
|
|
770
|
+
```glsl
|
|
771
|
+
#define NUM_APERTURE_BLADES 8.0
|
|
772
|
+
vec2 toSun = normalize(sunScreenPos - uv);
|
|
773
|
+
float angle = atan(toSun.y, toSun.x);
|
|
774
|
+
float starburst = pow(0.5+0.5*cos(1.5*3.14159+angle*NUM_APERTURE_BLADES),
|
|
775
|
+
max(1.0, 500.0-sunDist*sunDist*501.0));
|
|
776
|
+
float ghost = smoothstep(0.015, 0.0, length(ghostCenter-uv)-ghostRadius);
|
|
777
|
+
totalFlare += wavelengthToRGB(300.0+fract((length(ghostCenter-uv)-ghostRadius)*5.0)*500.0) * ghost * 0.25;
|
|
778
|
+
```
|
|
779
|
+
|
|
780
|
+
## Performance & Composition
|
|
781
|
+
|
|
782
|
+
**Performance**: Separable blur 121→22 samples | `textureLod` hardware mipmap for free downsampling | Downsample 2-4x before blurring | Sample counts: MB 16-32, DoF 32-64, CA 4-8 | Inter-texel sampling = free bilinear | `#define` switches have zero cost | Use `mix`/`step`/`smoothstep` instead of branches
|
|
783
|
+
|
|
784
|
+
**Composition**: Bloom+ToneMap (compute bloom in HDR space then tonemap, not reversible) | TAA+MB+DoF (shared sampling loop) | CA+Vignette+Grain (lens trio) | ColorGrading+ToneMap+Contrast (grade in linear space → HDR compression → gamma-space S-curve) | Bloom+LensFlare (shared bright-pass) | Multi-pass pipeline: BufA scene → BufB/C Bloom H/V → BufD TAA → Image compositing
|
|
785
|
+
|
|
786
|
+
## Further Reading
|
|
787
|
+
|
|
788
|
+
For complete step-by-step tutorials, mathematical derivations, and advanced usage, see [reference](../reference/post-processing.md)
|