From d0a5131041253c5ad2dc626add82b1b6b1be3f21 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 16 Dec 2023 07:00:19 +0000 Subject: [PATCH] deploy: 68cbfb887f832c660d370b65a82dd36bdde9ae7a --- 404.html | 2 +- About/index.html | 4 +-- Airbrush/index.html | 4 +-- Appendix/Vector-fill/index.html | 4 +-- Basics/Basics/index.html | 31 +++++++++--------- Basics/Stamp/index.html | 4 +-- Basics/Vanilla/index.html | 6 ++-- Introduction/index.html | 15 +++++---- Tessellation/index.html | 4 +-- ...ushes-f893bdac91be521b7e82bfdeb7d737eb.jpg | Bin 0 -> 43292 bytes ...mpare-794971aa073734471a630369491f11bf.png | Bin 0 -> 393534 bytes ...adius-518fd985dc63e3ee0627e79762f60882.png | Bin 23230 -> 0 bytes assets/js/26251b8b.6fd2a627.js | 1 - assets/js/26251b8b.b79fd33c.js | 1 + assets/js/6858f5cd.38283fa2.js | 1 - assets/js/6858f5cd.989f493c.js | 1 + assets/js/6ae0415c.9dffb487.js | 1 + assets/js/6ae0415c.b5896ee6.js | 1 - assets/js/935f2afb.d6c8afee.js | 1 + assets/js/935f2afb.e9e1f595.js | 1 - assets/js/ac092286.46380a79.js | 1 - assets/js/ac092286.788807fc.js | 1 + assets/js/bc662926.7a47c573.js | 1 + assets/js/bc662926.e139a372.js | 1 - ...c89f1.ecc88b7c.js => d50c89f1.d592ad16.js} | 2 +- assets/js/runtime~main.13891849.js | 1 + assets/js/runtime~main.2b8d7fdf.js | 1 - category/appendix/index.html | 4 +-- category/basics/index.html | 4 +-- index.html | 18 +++++----- 30 files changed, 59 insertions(+), 57 deletions(-) create mode 100644 assets/images/brushes-f893bdac91be521b7e82bfdeb7d737eb.jpg create mode 100644 assets/images/bunny-compare-794971aa073734471a630369491f11bf.png delete mode 100644 assets/images/variable-radius-518fd985dc63e3ee0627e79762f60882.png delete mode 100644 assets/js/26251b8b.6fd2a627.js create mode 100644 assets/js/26251b8b.b79fd33c.js delete mode 100644 assets/js/6858f5cd.38283fa2.js create mode 100644 assets/js/6858f5cd.989f493c.js create mode 100644 assets/js/6ae0415c.9dffb487.js delete mode 100644 assets/js/6ae0415c.b5896ee6.js create mode 100644 assets/js/935f2afb.d6c8afee.js delete mode 100644 assets/js/935f2afb.e9e1f595.js delete mode 100644 assets/js/ac092286.46380a79.js create mode 100644 assets/js/ac092286.788807fc.js create mode 100644 assets/js/bc662926.7a47c573.js delete mode 100644 assets/js/bc662926.e139a372.js rename assets/js/{d50c89f1.ecc88b7c.js => d50c89f1.d592ad16.js} (57%) create mode 100644 assets/js/runtime~main.13891849.js delete mode 100644 assets/js/runtime~main.2b8d7fdf.js diff --git a/404.html b/404.html index b6f06e4..36a7584 100644 --- a/404.html +++ b/404.html @@ -4,7 +4,7 @@ Brush Rendering Tutorial - + diff --git a/About/index.html b/About/index.html index 46fa419..9e09313 100644 --- a/About/index.html +++ b/About/index.html @@ -4,11 +4,11 @@ About | Brush Rendering Tutorial - + -
Skip to main content

About

Applying for Ph.D.

+

About

Applying for Ph.D.

I'm looking for PhD opportunities in top US schools to continue my research. If your lab conducts research in the related topics like Sketching, Digital Painting, HCI or NPR, and has an available PhD position, contact me with my email address 1500013714 (at) pku (dot) edu (dot) cn.

diff --git a/Airbrush/index.html b/Airbrush/index.html index 07e69a0..6aa2bef 100644 --- a/Airbrush/index.html +++ b/Airbrush/index.html @@ -4,11 +4,11 @@ Airbrush | Brush Rendering Tutorial - + -

Airbrush

toairbrush0

+

Airbrush

toairbrush0

An airbrush stroke looks like a solid vanilla stroke. The main difference is its transparency gradient from middle axis to rim.

Technologically, traditional airbrush is a special type of stamp brush whose footprint is a transparent dot. diff --git a/Appendix/Vector-fill/index.html b/Appendix/Vector-fill/index.html index 3d6c6fc..9b5277d 100644 --- a/Appendix/Vector-fill/index.html +++ b/Appendix/Vector-fill/index.html @@ -4,11 +4,11 @@ Pre-introduction to Vector Fill | Brush Rendering Tutorial - + -

Pre-introduction to Vector Fill

You may have learned how to render brush strokes on polyline curves. +

Pre-introduction to Vector Fill

You may have learned how to render brush strokes on polyline curves. If you want to develop a basic paint program like what I did, the next logical step is to learn how to fill color.

VectorFill

Vector fill demo

diff --git a/Basics/Basics/index.html b/Basics/Basics/index.html index da5300b..a9caafc 100644 --- a/Basics/Basics/index.html +++ b/Basics/Basics/index.html @@ -3,36 +3,37 @@ -Basics | Brush Rendering Tutorial - +Problem Statement | Brush Rendering Tutorial + -

Basics

Brush strokes

+

Problem Statement

Brush strokes

krita

Open-source brush presets by Raghavendra in Krita.

In graphics design software such as Photoshop and Krita, you can use a wide range of brushes within the paint tool. Learning how to render these stylized strokes with GPU is valuable. However, there are over thousands of brushes available in Photoshop, which can be overwhelming to explore. Luckily, more than 90% of the brushes are designed under the "stamp model", and we call them "stamp brushes".

-

In the upcoming Stamp section, I will introduce the stamp model and how to implement it in a shader program. -But for your better understanding, I will introduce the basic solid stroke called "vanilla" first. +

In the upcoming Stamp section, I will introduce the basic solid stroke called "vanilla" first, +then the stamp model and how to implement it in a shader program. The vanilla and stamp strokes share the exact same vertex placement method. -It's much easier to start with the vanilla stroke, later the stamp stroke. -Maybe the stamp strokes with various styles don't interest you, feel free to ignore it and learn the vanilla stroke only. -It's very useful when drawing UIs or debugging your 3D scenes.

-

While you may recognize a brush stroke by its stylization, another crucial property could be ignored: the "variable radius" along the stroke. -(I also ignored it in my paper.) -The radii are typically generated from the pressure values as a stylus presses and moves on a tablet. +For your better understanding, avoid jumping right into the stamp part.

+

Maybe the stamp strokes with various styles don't interest you, feel free to ignore it and learn the vanilla stroke only. +Knowing how to render a line is very handy when drawing UIs or debugging your 3D scenes.

+

While you may recognize a brush stroke by its stylization, another crucial property could be ignored: +the "variable width" along the stroke. The property is critical for experienced artists drawing professional illustrations or animations. +For instance, you can tell the difference from the figure below. +The one with variable width on the right has much better appearance.

+

bunny

+

The width values are typically generated from the pressure values as a stylus presses and moves on a tablet. After the artists install a new painting program, one of the highest priorities is to configure the mapping function from pen pressure to brush radius.

In case you don't know about tablets and styluses

Digital artists paint with dedicated devices: Tablet and Stylus. If you're unfamiliar with tablets and styluses, you can watch the video below for more information:

Tablet

-

variable radius

-

Variable radius along a stroke.

Geometric data

-

To store the variable radius in brush stroke, we will render a unique type of vector curve: +

To store the variable radius in brush stroke, we will render an uncommon type of vector curve: An ordered list of points (polyline) with radius values assigned to each point. As a user presses a stylus on a tablet and moves, a paint program generates a sequence of points to record the trace of movement. Meanwhile, the pen pressure is transformed into the radius value assigned to each point. @@ -46,7 +47,7 @@

Geometric dat
Loading...
-

Blender Grease Pencil team has developed a lot of novel tools to edit this polyline with radius representation. +

Blender Grease Pencil team has developed a lot of novel tools to edit polylines. Remember to check out if you were a researcher and want to develop novel techniques for digital painting.

\ No newline at end of file diff --git a/Basics/Stamp/index.html b/Basics/Stamp/index.html index a748126..98c2d5f 100644 --- a/Basics/Stamp/index.html +++ b/Basics/Stamp/index.html @@ -4,11 +4,11 @@ Stamp | Brush Rendering Tutorial - + -

Stamp

Intro

+

Stamp

Intro

The basic stamp stroke rendering is pretty intuitive. We are given a texture called stamp texture or footprint. While a user paints on a canvas, we render the texture onto the canvas equidistantly along the drawing trace. diff --git a/Basics/Vanilla/index.html b/Basics/Vanilla/index.html index 1a4fcb6..9a8c27e 100644 --- a/Basics/Vanilla/index.html +++ b/Basics/Vanilla/index.html @@ -4,11 +4,11 @@ Vanilla | Brush Rendering Tutorial - + -

Vanilla

Uni radius

+ +But it is common in 3D, I will introduce the solution together with 3D stroke rendering.

\ No newline at end of file diff --git a/Introduction/index.html b/Introduction/index.html index ea89291..bf3e3f4 100644 --- a/Introduction/index.html +++ b/Introduction/index.html @@ -4,11 +4,11 @@ Introduction | Brush Rendering Tutorial - + -

Introduction

Loading...
Vanilla
Loading...
Pencil
+

Introduction

Loading...
Vanilla
Loading...
Pencil

note

When hovering your mouse on the canvas you can:

  • Pan: Left-click and drag the mouse.
  • @@ -23,10 +23,11 @@

    Prerequisites

    Decent experience in one of the GPU graphics APIs like OpenGL and D3D is required. If you were relatively new to computer graphics, you should at least have rendered your first 3D scene and practiced instanced rendering.

    -

    It's totally fine if you never heard about LINES, LINE_STRIP, and LINE_LOOP GPU primitives. -We won't use them directly in this tutorial series. -If you're interested in learning about their drawbacks, you can check out mattdesl's article titled "Drawing Lines is Hard" here. -While reading it isn't a prerequisite, I still recommend it.

    +

    GPU apis have built-in line rendering functionalities. +It's totally fine if you never heard about LINES, LINE_STRIP, and LINE_LOOP GPU primitives. +We won't use the functionalities in this tutorial series. +If you're interested in learning about their drawbacks, you can check out mattdesl's article titled Drawing Lines is Hard. +Reading it isn't a prerequisite, I still recommend it.

    Though I create all the demos in the web environment, you don't have to know about WebGL or WebGPU. We will concentrate on high-level techniques rather than the implementation details. No matter which GPU API you are familiar with, utilizing them to render a stroke will be easy after this series.

    @@ -35,7 +36,7 @@

    ContentBasic section covers the basics of the rendering and stylization methods. Articles in the Basic part are organized in a progressive fashion. You may miss something important if skip one of them. -After learning all stuffs in the Basic section, you can freely select your favorite topics to learn. +After learning the Basic section, you can freely select your favorite topics. I will list extra prerequisites at the very beginning of each article.

    Live coding

    You will find live code editors similar to the one displayed below, inspired by The Book of Shader. diff --git a/Tessellation/index.html b/Tessellation/index.html index 70ce705..b013740 100644 --- a/Tessellation/index.html +++ b/Tessellation/index.html @@ -4,11 +4,11 @@ Tessellation-based Rendering | Brush Rendering Tutorial - + -

    There were works trying to tessellate a stroke and render it with GPU. +

    There were works trying to tessellate a stroke and render it with GPU. You can find them in several papers and online articles.

    Paper and article list
    • Polar Stroking: New Theory and Methods for Stroking Paths (Very Hard)
    • diff --git a/assets/images/brushes-f893bdac91be521b7e82bfdeb7d737eb.jpg b/assets/images/brushes-f893bdac91be521b7e82bfdeb7d737eb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1556f6b2fed506c430aca361d0caa04811550da8 GIT binary patch literal 43292 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 literal 0 HcmV?d00001 diff --git a/assets/images/bunny-compare-794971aa073734471a630369491f11bf.png b/assets/images/bunny-compare-794971aa073734471a630369491f11bf.png new file mode 100644 index 0000000000000000000000000000000000000000..9dbacf0b10107b567fc5bea70e49d87925b4d287 GIT binary patch literal 393534 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�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�Yb*1SsRT= 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 z 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%0D$nIg@VjxF$T521m^Vt@0WGzVxIo<2Oyb_uI?pJ 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.r(t),i.d(t,{assets:()=>o,contentTitle:()=>a,default:()=>c,frontMatter:()=>r,metadata:()=>l,toc:()=>d});var s=i(5893),n=i(1151);const r={sidebar_position:5,sidebar_label:"Tessellation",title:"Tessellation-based Rendering"},a="WIP",l={id:"Tessellation/Tessellation",title:"Tessellation-based Rendering",description:"There were works trying to tessellate a stroke and render it with GPU.",source:"@site/docs/Tessellation/Tessellation.mdx",sourceDirName:"Tessellation",slug:"/Tessellation/",permalink:"/brush-rendering-tutorial/Tessellation/",draft:!1,unlisted:!1,editUrl:"https://github.com/ShenCiao/brush-rendering-tutorial/tree/main/docs/Tessellation/Tessellation.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{sidebar_position:5,sidebar_label:"Tessellation",title:"Tessellation-based Rendering"},sidebar:"tutorialSidebar",previous:{title:"Airbrush",permalink:"/brush-rendering-tutorial/Airbrush/"},next:{title:"Appendix",permalink:"/brush-rendering-tutorial/category/appendix"}},o={},d=[];function h(e){const t={a:"a",admonition:"admonition",h1:"h1",li:"li",p:"p",ul:"ul",...(0,n.a)(),...e.components},{Details:i}=t;return i||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"There were works trying to tessellate a stroke and render it with GPU.\nYou can find them in several papers and online articles."}),"\n",(0,s.jsxs)(i,{children:[(0,s.jsx)("summary",{children:"Paper and article list"}),(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://dl.acm.org/doi/abs/10.1145/3386569.3392458",children:"Polar Stroking: New Theory and Methods for Stroking Paths"})," (Very Hard)"]}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://mattdesl.svbtle.com/drawing-lines-is-hard",children:"Drawing Lines is Hard"})}),"\n",(0,s.jsxs)(t.li,{children:["Instanced Line Rendering: ",(0,s.jsx)(t.a,{href:"https://wwwtyro.net/2019/11/18/instanced-lines.html",children:"part1"})," | ",(0,s.jsx)(t.a,{href:"https://wwwtyro.net/2021/10/01/instanced-lines-part-2.html",children:"part2"})]}),"\n",(0,s.jsxs)(t.li,{children:["... Tell me more tutorials in the ",(0,s.jsx)(t.a,{href:"https://github.com/ShenCiao/brush-rendering-tutorial/discussions/2",children:"discussion"})]}),"\n"]})]}),"\n",(0,s.jsxs)(t.p,{children:["They may inspire some approaches to optimize the performance of the articulated algorithms in the future.\nTo learn about them, I would recommend starting with Rye Terrell's ",(0,s.jsx)(t.a,{href:"https://wwwtyro.net/2019/11/18/instanced-lines.html",children:"Instanced Line Rendering"}),",\nwhose methods are simple enough to learn."]}),"\n",(0,s.jsx)(t.p,{children:"As for this article, I will compare the tessellation-based algorithms with articulated algorithms in detail."}),"\n",(0,s.jsx)(t.h1,{id:"wip",children:"WIP"}),"\n",(0,s.jsx)(t.admonition,{title:"spoiler",type:"note",children:(0,s.jsx)(t.p,{children:"The key benefit of the articulated is its self-overlapping in acute angle, which is critical for brush strokes and digital painting."})})]})}function c(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/assets/js/26251b8b.b79fd33c.js b/assets/js/26251b8b.b79fd33c.js new file mode 100644 index 0000000..c6ca02c --- /dev/null +++ b/assets/js/26251b8b.b79fd33c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkbrush_stroke_tutorial=self.webpackChunkbrush_stroke_tutorial||[]).push([[147],{1599:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>o,contentTitle:()=>a,default:()=>c,frontMatter:()=>r,metadata:()=>l,toc:()=>d});var n=i(5893),s=i(1151);const r={sidebar_position:5,sidebar_label:"Tessellation",title:"Tessellation-based Rendering",hidden:!0},a="WIP",l={id:"Tessellation/Tessellation",title:"Tessellation-based Rendering",description:"There were works trying to tessellate a stroke and render it with GPU.",source:"@site/docs/Tessellation/Tessellation.mdx",sourceDirName:"Tessellation",slug:"/Tessellation/",permalink:"/brush-rendering-tutorial/Tessellation/",draft:!1,unlisted:!1,editUrl:"https://github.com/ShenCiao/brush-rendering-tutorial/tree/main/docs/Tessellation/Tessellation.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{sidebar_position:5,sidebar_label:"Tessellation",title:"Tessellation-based Rendering",hidden:!0},sidebar:"tutorialSidebar",previous:{title:"Airbrush",permalink:"/brush-rendering-tutorial/Airbrush/"},next:{title:"Appendix",permalink:"/brush-rendering-tutorial/category/appendix"}},o={},d=[];function h(e){const t={a:"a",admonition:"admonition",h1:"h1",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components},{Details:i}=t;return i||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"There were works trying to tessellate a stroke and render it with GPU.\nYou can find them in several papers and online articles."}),"\n",(0,n.jsxs)(i,{children:[(0,n.jsx)("summary",{children:"Paper and article list"}),(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"https://dl.acm.org/doi/abs/10.1145/3386569.3392458",children:"Polar Stroking: New Theory and Methods for Stroking Paths"})," (Very Hard)"]}),"\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://mattdesl.svbtle.com/drawing-lines-is-hard",children:"Drawing Lines is Hard"})}),"\n",(0,n.jsxs)(t.li,{children:["Instanced Line Rendering: ",(0,n.jsx)(t.a,{href:"https://wwwtyro.net/2019/11/18/instanced-lines.html",children:"part1"})," | ",(0,n.jsx)(t.a,{href:"https://wwwtyro.net/2021/10/01/instanced-lines-part-2.html",children:"part2"})]}),"\n",(0,n.jsxs)(t.li,{children:["... Tell me more tutorials in the ",(0,n.jsx)(t.a,{href:"https://github.com/ShenCiao/brush-rendering-tutorial/discussions/2",children:"discussion"})]}),"\n"]})]}),"\n",(0,n.jsxs)(t.p,{children:["They may inspire some approaches to optimize the performance of the articulated algorithms in the future.\nTo learn about them, I would recommend starting with Rye Terrell's ",(0,n.jsx)(t.a,{href:"https://wwwtyro.net/2019/11/18/instanced-lines.html",children:"Instanced Line Rendering"}),",\nwhose methods are simple enough to learn."]}),"\n",(0,n.jsx)(t.p,{children:"As for this article, I will compare the tessellation-based algorithms with articulated algorithms in detail."}),"\n",(0,n.jsx)(t.h1,{id:"wip",children:"WIP"}),"\n",(0,n.jsx)(t.admonition,{title:"spoiler",type:"note",children:(0,n.jsx)(t.p,{children:"The key benefit of the articulated is its self-overlapping in acute angle, which is critical for brush strokes and digital painting."})})]})}function c(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/assets/js/6858f5cd.38283fa2.js b/assets/js/6858f5cd.38283fa2.js deleted file mode 100644 index 0ec9a07..0000000 --- a/assets/js/6858f5cd.38283fa2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkbrush_stroke_tutorial=self.webpackChunkbrush_stroke_tutorial||[]).push([[915],{7985:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>d});var a=t(5893),r=t(1151),o=t(5632);const i={sidebar_position:0},s=void 0,l={id:"Basics/Basics/Basics",title:"Basics",description:"Brush strokes",source:"@site/docs/Basics/Basics/Basics.mdx",sourceDirName:"Basics/Basics",slug:"/Basics/Basics/",permalink:"/brush-rendering-tutorial/Basics/Basics/",draft:!1,unlisted:!1,editUrl:"https://github.com/ShenCiao/brush-rendering-tutorial/tree/main/docs/Basics/Basics/Basics.mdx",tags:[],version:"current",sidebarPosition:0,frontMatter:{sidebar_position:0},sidebar:"tutorialSidebar",previous:{title:"Basics",permalink:"/brush-rendering-tutorial/category/basics"},next:{title:"Vanilla",permalink:"/brush-rendering-tutorial/Basics/Vanilla/"}},c={},d=[{value:"Brush strokes",id:"brush-strokes",level:2},{value:"Geometric data",id:"geometric-data",level:2}];function u(e){const n={a:"a",code:"code",em:"em",h2:"h2",img:"img",p:"p",...(0,r.a)(),...e.components},{Details:i}=n;return i||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h2,{id:"brush-strokes",children:"Brush strokes"}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{src:"https://gitlab.com/raghukamath/krita-brush-presets/-/raw/master/preview.png",alt:"krita"})}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsxs)(n.em,{children:["Open-source ",(0,a.jsx)(n.a,{href:"https://gitlab.com/raghukamath/krita-brush-presets",children:"brush presets by Raghavendra"})," in Krita."]})}),"\n",(0,a.jsx)(n.p,{children:'In graphics design software such as Photoshop and Krita, you can use a wide range of brushes within the paint tool.\nLearning how to render these stylized strokes with GPU is valuable.\nHowever, there are over thousands of brushes available in Photoshop, which can be overwhelming to explore.\nLuckily, more than 90% of the brushes are designed under the "stamp model", and we call them "stamp brushes".'}),"\n",(0,a.jsx)(n.p,{children:"In the upcoming Stamp section, I will introduce the stamp model and how to implement it in a shader program.\nBut for your better understanding, I will introduce the basic solid stroke called \"vanilla\" first.\nThe vanilla and stamp strokes share the exact same vertex placement method.\nIt's much easier to start with the vanilla stroke, later the stamp stroke.\nMaybe the stamp strokes with various styles don't interest you, feel free to ignore it and learn the vanilla stroke only.\nIt's very useful when drawing UIs or debugging your 3D scenes."}),"\n",(0,a.jsx)(n.p,{children:'While you may recognize a brush stroke by its stylization, another crucial property could be ignored: the "variable radius" along the stroke.\n(I also ignored it in my paper.)\nThe radii are typically generated from the pressure values as a stylus presses and moves on a tablet.\nThe property is critical for experienced artists drawing professional illustrations or animations.\nAfter the artists install a new painting program,\none of the highest priorities is to configure the mapping function from pen pressure to brush radius.'}),"\n",(0,a.jsxs)(i,{children:[(0,a.jsx)("summary",{children:"In case you don't know about tablets and styluses"}),(0,a.jsx)(n.p,{children:"Digital artists paint with dedicated devices: Tablet and Stylus.\nIf you're unfamiliar with tablets and styluses, you can watch the video below for more information:"}),(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{href:"https://www.youtube.com/watch?app=desktop&v=83BRMfjJXIk",children:(0,a.jsx)(n.img,{src:"https://img.youtube.com/vi/83BRMfjJXIk/maxresdefault.jpg",alt:"Tablet"})})})]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{alt:"variable radius",src:t(4788).Z+"",width:"1625",height:"526"})}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.em,{children:"Variable radius along a stroke."})}),"\n",(0,a.jsx)(n.h2,{id:"geometric-data",children:"Geometric data"}),"\n",(0,a.jsx)(n.p,{children:"To store the variable radius in brush stroke, we will render a unique type of vector curve:\nAn ordered list of points (polyline) with radius values assigned to each point.\nAs a user presses a stylus on a tablet and moves, a paint program generates a sequence of points to record the trace of movement.\nMeanwhile, the pen pressure is transformed into the radius value assigned to each point.\nAfter rendering the stroke on the polyline, the user feels like drawing on canvas."}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.img,{alt:"Monkey",src:t(9863).Z+"",width:"1243",height:"931"}),"\n",(0,a.jsx)(n.em,{children:"The monkey Suzanne in Blender (Grease Pencil), the orange dots on the right side show polylines' points (vertices)."})]}),"\n",(0,a.jsxs)(n.p,{children:["We can approximate any type of curve by increasing the number of points in a polyline, whether freehand-drawn or mathematically defined.\nTry to change the ",(0,a.jsx)(n.code,{children:"maxRadius"})," and ",(0,a.jsx)(n.code,{children:"segmentCount"})," values in the code editor below to see how the vanilla stroke changes.\nI will elaborate on how to render this stroke in the next section.\nFeel free to change any other parts of the code as long as the function returns the ",(0,a.jsx)(n.code,{children:"position"})," and ",(0,a.jsx)(n.code,{children:"radius"})," array correctly."]}),"\n","\n","\n",(0,a.jsx)(o.ij,{showEditor:[!0,!1,!1]}),"\n",(0,a.jsx)(n.p,{children:"Blender Grease Pencil team has developed a lot of novel tools to edit this polyline with radius representation.\nRemember to check out if you were a researcher and want to develop novel techniques for digital painting."})]})}function p(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(u,{...e})}):u(e)}},5632:(e,n,t)=>{t.d(n,{ij:()=>g,en:()=>k,Sw:()=>j,rL:()=>T,PQ:()=>w});var a=t(7294),r=t(9477),o=t(5452),i=t(4866),s=t(5162),l=t(3764),c=t(5034),d=t(9279);const u="precision mediump float;\nprecision mediump int;\n\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\n\nin vec2 position0;\nin float radius0;\nin float summedLength0;\nin vec2 position1;\nin float radius1;\nin float summedLength1;\n\nout vec2 p; // position of the current pixel\nflat out vec2 p0;\nflat out float r0;\nflat out float l0;\nflat out vec2 p1;\nflat out float r1;\nflat out float l1;\n\nvoid main()\t{\n r0 = radius0;\n r1 = radius1;\n p0 = position0;\n p1 = position1;\n l0 = summedLength0;\n l1 = summedLength1;\n\n vec2 tangent = normalize(position1 - position0);\n vec2 normal = vec2(-tangent.y, tangent.x);\n float cosTheta = (r0 - r1)/distance(p0, p1);\n // the vertex1 with radius is fully inside the vertex0.\n if(abs(cosTheta) >= 1.0) return;\n\n // Each instance is a trapzoid, whose vertices' positions are determined here.\n // Use gl_VertexID {0, 1, 2, 3} to index and get the desired parameters.\n // Be careful with the backface culling! We are ignoring it here.\n vec2 offsetSign = vec2[](\n vec2(-1.0,-1.0),\n vec2(-1.0, 1.0),\n vec2( 1.0, 1.0),\n vec2( 1.0,-1.0)\n )[gl_VertexID];\n vec2 position = vec2[](position0, position0, position1, position1)[gl_VertexID];\n float radius = vec4(radius0, radius0, radius1, radius1)[gl_VertexID];\n\n float tanHalfTheta = sqrt((1.0+cosTheta) / (1.0-cosTheta));\n float cotHalfTheta = 1.0 / tanHalfTheta;\n float normalTanValue = vec4(tanHalfTheta, tanHalfTheta, cotHalfTheta, cotHalfTheta)[gl_VertexID];\n if(normalTanValue > 10.0 || normalTanValue < 0.1) return;\n\n vec2 trapzoidVertexPosition = position +\n offsetSign.x * radius * tangent +\n offsetSign.y * radius * normal * normalTanValue;\n p = trapzoidVertexPosition;\n\n gl_Position = projectionMatrix * modelViewMatrix * vec4(trapzoidVertexPosition, 0.0, 1.0);\n}\n",p="precision mediump float;\nprecision mediump int;\n\nin vec2 p;\nflat in vec2 p0;\nflat in float r0;\nflat in float l0;\nflat in vec2 p1;\nflat in float r1;\nflat in float l1;\n\n// Common\nuniform int type;\nconst int Vanilla = 0, Stamp = 1, Airbrush = 2;\nuniform vec4 color;\n// Stamp\nuniform mediump sampler2D footprint;\nuniform float stampIntervalRatio;\nuniform float noiseFactor;\nuniform float rotationFactor;\nfloat x2n(float x); // from distance to stamp index.\nfloat n2x(float n); // from stamp index to distance.\nmat2 rotate(float angle);\n// Airbrush\nuniform mediump sampler2D gradient;\nfloat sampleGraident(float distance){ return texture(gradient, vec2(distance, 0.0)).r; }\n\n// Noise helper functions from _The Book of Shader_.\nfloat random (in vec2 st);\nfloat noise (in vec2 st);\nfloat fbm (in vec2 st);\n\nout vec4 outColor;\n\nvoid main() {\n vec2 tangent = normalize(p1 - p0);\n vec2 normal = vec2(-tangent.y, tangent.x);\n\n // The local coordinate orgin at p0, x axis along the tangent direct.\n float len = distance(p1, p0);\n vec2 pLocal = vec2(dot(p-p0, tangent), dot(p-p0, normal));\n vec2 p0Local = vec2(0, 0);\n vec2 p1Local = vec2(len, 0);\n\n float cosTheta = (r0 - r1)/len;\n float d0 = distance(p, p0);\n float d0cos = pLocal.x / d0;\n float d1 = distance(p, p1);\n float d1cos = (pLocal.x - len) / d1;\n\n // Remove corners\n if(d0cos < cosTheta && d0 > r0) discard;\n if(d1cos > cosTheta && d1 > r1) discard;\n\n if(type == Vanilla){\n if(d0 < r0 && d1 < r1) discard;\n float A = (d0 < r0 || d1 < r1) ? 1.0 - sqrt(1.0 - color.a) : color.a;\n outColor = vec4(color.rgb, A);\n return;\n }\n\n if(type == Stamp){\n // The method here is not published yet, it should be explained in a 10min video.\n // The footprint is a disk instead of a square.\n // We set a quadratic polynomial to calculate the effect range, the range on polyline edge footprint can touch the current pixel.\n // Two roots of the quadratic polynomial are the effectRangeFront and effectRangeBack.\n // Formulas from SIGGRAPH 2022 Talk - A Fast & Robust Solution for Cubic & Higher-Order Polynomials\n float a, b, c, delta;\n a = 1.0 - pow(cosTheta, 2.0);\n b = 2.0 * (r0 * cosTheta - pLocal.x);\n c = pow(pLocal.x, 2.0) + pow(pLocal.y, 2.0) - pow(r0, 2.0);\n delta = pow(b, 2.0) - 4.0*a*c;\n if(delta <= 0.0) discard; // This should never happen.\n\n float tempMathBlock = b + sign(b) * sqrt(delta);\n float x1 = -2.0 * c / tempMathBlock;\n float x2 = -tempMathBlock / (2.0*a);\n float effectRangeFront = x1 <= x2 ? x1 : x2;\n float effectRangeBack = x1 > x2 ? x1 : x2;\n\n // We stamp on polyline every time the stamp index comes to an integer.\n float index0 = l0/stampIntervalRatio; // The stamp index of vertex0.\n float startIndex, endIndex;\n if (effectRangeFront <= 0.0){\n startIndex = ceil(index0);\n }\n else{\n startIndex = ceil(index0 + x2n(effectRangeFront));\n }\n float index1 = l1/stampIntervalRatio;\n float backIndex = x2n(effectRangeBack) + index0;\n endIndex = index1 < backIndex ? index1 : backIndex;\n if(startIndex > endIndex) discard;\n\n // The main loop to sample and blend color from the footprint.\n int MAX_i = 128; float currIndex = startIndex;\n float A = 0.0;\n for(int i = 0; i < MAX_i; i++){\n float currStampLocalX = n2x(currIndex - index0);\n // Apply roation and sample the footprint.\n vec2 pToCurrStamp = pLocal - vec2(currStampLocalX, 0.0);\n float currStampRadius = r0 - cosTheta * currStampLocalX;\n float angle = rotationFactor*radians(360.0*fract(sin(currIndex)*1.0));\n pToCurrStamp *= rotate(angle);\n vec2 textureCoordinate = (pToCurrStamp/currStampRadius + 1.0)/2.0;\n float opacity = texture(footprint, textureCoordinate).a;\n // Blend opacity.\n float opacityNoise = noiseFactor*fbm(textureCoordinate*50.0);\n opacity = clamp(opacity - opacityNoise, 0.0, 1.0) * color.a;\n A = A * (1.0-opacity) + opacity;\n\n currIndex += 1.0;\n if(currIndex > endIndex) break;\n }\n if(A < 1e-4) discard;\n outColor = vec4(color.rgb, A);\n return;\n }\n\n if(type == Airbrush){\n // The method here is not published yet. Shen is not fully satisfied with the current solution.\n float tanTheta = sqrt(1.0 - cosTheta*cosTheta)/cosTheta;\n float mid = pLocal.x - abs(pLocal.y)/tanTheta;\n float A = color.a;\n float transparency0 = d0 > r0 ? 1.0:sqrt(1.0 - A*sampleGraident(d0/r0));\n float transparency1 = d1 > r1 ? 1.0:sqrt(1.0 - A*sampleGraident(d1/r1));\n float transparency;\n\n // A bunch of math derived with the continuous form of airbrush here.\n if(mid <= 0.0){\n transparency = transparency0/transparency1;\n }\n if(mid > 0.0 && mid < len){\n float r = (mid * r1 + (len - mid) * r0)/len;\n float dr = distance(pLocal, vec2(mid, 0))/r;\n transparency = (1.0 - A*sampleGraident(dr))/transparency0/transparency1;\n }\n if(mid >= len){\n transparency = transparency1/transparency0;\n }\n\n outColor = vec4(color.rgb, 1.0 - transparency);\n }\n}\n\nfloat x2n(float x){\n float L = distance(p0, p1);\n if(r0 == r1) return x/(stampIntervalRatio*r0);\n else return -L / stampIntervalRatio / (r0 - r1) * log(1.0 - (1.0 - r1/r0)/L * x);\n}\n\nfloat n2x(float n){\n float L = distance(p0, p1);\n if(r0 == r1) return n * stampIntervalRatio * r0;\n else return L * (1.0-exp(-(r0-r1)*n*stampIntervalRatio/L)) / (1.0-r1/r0);\n}\n\n// Helper functions----------------------------------------------------------------------------------\nmat2 rotate(float angle){\n return mat2(cos(angle), -sin(angle), sin(angle), cos(angle));\n}\n\nfloat random (in vec2 st) {\n return fract(sin(dot(st.xy,\n vec2(12.9898,78.233)))*\n 43758.5453123);\n}\n\nfloat noise (in vec2 st) {\n vec2 i = floor(st);\n vec2 f = fract(st);\n\n // Four corners in 2D of a tile\n float a = random(i);\n float b = random(i + vec2(1.0, 0.0));\n float c = random(i + vec2(0.0, 1.0));\n float d = random(i + vec2(1.0, 1.0));\n\n vec2 u = f * f * (3.0 - 2.0 * f);\n\n return mix(a, b, u.x) +\n (c - a)* u.y * (1.0 - u.x) +\n (d - b) * u.x * u.y;\n}\n\n#define OCTAVES 6\nfloat fbm (in vec2 st) {\n // Initial values\n float value = 0.0;\n float amplitude = .5;\n float frequency = 0.;\n //\n // Loop of octaves\n for (int i = 0; i < OCTAVES; i++) {\n value += amplitude * noise(st);\n st *= 2.;\n amplitude *= .5;\n }\n return value;\n}\n";var h=t(9501),f=t(412),m=t(5893);let v=function(e){return e[e.Vanilla=0]="Vanilla",e[e.Stamp=1]="Stamp",e[e.Airbrush=2]="Airbrush",e}({});function g(e){let{uniforms:n=null,showEditor:t=null}=e;const h=(0,a.useRef)(),f=(0,a.useRef)(),g=(0,a.useRef)();function x(e,n,t){const a=[...n],o=[...n.slice(2)],i=[...t],s=[...t.slice(1)],l=[];let c=0;for(let p=0;p{const e=(1+Math.sqrt(5))/2,t=h.current.clientWidth,a=t*(.5/e),i=4*e,s=i*(.5/e),l=new r.iKG(i/-2,i/2,s/2,s/-2,-1e3,1e3);l.position.z=5;const c=new r.CP7({antialias:!0,alpha:!0,premultipliedAlpha:!1,powerPreference:"high-performance"});function m(){const n=h.current.clientWidth,t=.5*n/e;c.setSize(n,t)}c.setClearColor(new r.Ilk(1,1,1),0),c.setSize(t,a),window.addEventListener("resize",m),h.current.appendChild(c.domElement);const y=new r.xsS,w=new o.o(l,c.domElement);w.enableRotate=!1,w.enableDamping=!1,w.screenSpacePanning=!0,w.addEventListener("change",(()=>{c.render(y,l)})),f.current=()=>c.render(y,l),window.addEventListener("TextureLoaded",f.current);const b=new r.u9r;b.setIndex([0,1,2,2,3,0]);const k=new Function(d.Z),[j,T]=k();x(b,j,T);const I={type:{value:v.Vanilla},color:{value:[0,0,0,1]},footprint:{value:new r.xEZ},stampIntervalRatio:{value:1},noiseFactor:{value:0},rotationFactor:{value:0},gradient:{value:new r.IEO}},A=new r.FIo({uniforms:n||I,vertexShader:u,fragmentShader:p,side:r.ehD,transparent:!0,glslVersion:r.LSk});return g.current=new r.SPe(b,A,T.length-1),g.current.frustumCulled=!1,y.add(g.current),f.current(),()=>{c.dispose(),window.removeEventListener("resize",m),window.removeEventListener("TextureLoaded",f.current)}}),[]);const w=(0,a.useCallback)(((e,n)=>{let t=[],a=[];try{const n=new Function(e);[t,a]=n()}catch(o){return void console.log(o.toString())}function r(e){if(Array.isArray(e)){for(let n=0;n{y(e,"")}})}),T&&(0,m.jsx)(s.Z,{value:"fragment.glsl",children:(0,m.jsx)(c.r,{height:b,defaultValue:p,onChange:e=>{y("",e)}})})]})}),(0,m.jsx)("div",{ref:h,style:{width:"100%"},onMouseDown:e=>e.preventDefault()})]})}let x=new r.xEZ;f.Z.canUseDOM&&(x=(new r.dpR).load(`/${h.Z.projectName}/img/stamp2.png`,(e=>{window.dispatchEvent(new CustomEvent("TextureLoaded"))}),void 0,void 0));let y=new r.xEZ;f.Z.canUseDOM&&(y=(new r.dpR).load(`/${h.Z.projectName}/img/dot.png`,(e=>{window.dispatchEvent(new CustomEvent("TextureLoaded"))}),void 0,void 0));const w={type:{value:v.Stamp},color:{value:[0,0,0,1]},footprint:{value:x},stampIntervalRatio:{value:.4},noiseFactor:{value:1.2},rotationFactor:{value:.75}},b=((e,n)=>{let t=new r.AXT(new r.FM8(0,1),e,n,new r.FM8(1,0));const a=256,o=new Uint8Array(1024),i=t.getPoints(512);for(let r=0;r=t.x&&e<=a.x){let n=(t.y*(a.x-e)+a.y*(e-t.x))/(a.x-t.x);o[4*r]=Math.floor(255*n)}}}const s=new r.IEO(o,a,1);return s.needsUpdate=!0,s})(new r.FM8(.33,1),new r.FM8(.66,0)),k={type:{value:v.Airbrush},color:{value:[0,0,0,1]},gradient:{value:b}},j={type:{value:v.Stamp},color:{value:[0,0,0,.5]},footprint:{value:y},stampIntervalRatio:{value:2},noiseFactor:{value:0},rotationFactor:{value:0}},T={type:{value:v.Stamp},color:{value:[0,0,0,.5]},footprint:{value:y},stampIntervalRatio:{value:1},noiseFactor:{value:0},rotationFactor:{value:0}}},9863:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/monkey-218688e42a5da691e375e0bfea2ea753.png"},4788:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/variable-radius-518fd985dc63e3ee0627e79762f60882.png"}}]); \ No newline at end of file diff --git a/assets/js/6858f5cd.989f493c.js b/assets/js/6858f5cd.989f493c.js new file mode 100644 index 0000000..a5be900 --- /dev/null +++ b/assets/js/6858f5cd.989f493c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkbrush_stroke_tutorial=self.webpackChunkbrush_stroke_tutorial||[]).push([[915],{7985:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>d});var a=t(5893),r=t(1151),o=t(5632);const i={sidebar_position:0,title:"Problem Statement"},s=void 0,l={id:"Basics/Basics/Basics",title:"Problem Statement",description:"Brush strokes",source:"@site/docs/Basics/Basics/Basics.mdx",sourceDirName:"Basics/Basics",slug:"/Basics/Basics/",permalink:"/brush-rendering-tutorial/Basics/Basics/",draft:!1,unlisted:!1,editUrl:"https://github.com/ShenCiao/brush-rendering-tutorial/tree/main/docs/Basics/Basics/Basics.mdx",tags:[],version:"current",sidebarPosition:0,frontMatter:{sidebar_position:0,title:"Problem Statement"},sidebar:"tutorialSidebar",previous:{title:"Basics",permalink:"/brush-rendering-tutorial/category/basics"},next:{title:"Vanilla",permalink:"/brush-rendering-tutorial/Basics/Vanilla/"}},c={},d=[{value:"Brush strokes",id:"brush-strokes",level:2},{value:"Geometric data",id:"geometric-data",level:2}];function u(e){const n={a:"a",code:"code",em:"em",h2:"h2",img:"img",p:"p",...(0,r.a)(),...e.components},{Details:i}=n;return i||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h2,{id:"brush-strokes",children:"Brush strokes"}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{src:"https://gitlab.com/raghukamath/krita-brush-presets/-/raw/master/preview.png",alt:"krita"})}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsxs)(n.em,{children:["Open-source ",(0,a.jsx)(n.a,{href:"https://gitlab.com/raghukamath/krita-brush-presets",children:"brush presets by Raghavendra"})," in Krita."]})}),"\n",(0,a.jsx)(n.p,{children:'In graphics design software such as Photoshop and Krita, you can use a wide range of brushes within the paint tool.\nLearning how to render these stylized strokes with GPU is valuable.\nHowever, there are over thousands of brushes available in Photoshop, which can be overwhelming to explore.\nLuckily, more than 90% of the brushes are designed under the "stamp model", and we call them "stamp brushes".'}),"\n",(0,a.jsx)(n.p,{children:'In the upcoming Stamp section, I will introduce the basic solid stroke called "vanilla" first,\nthen the stamp model and how to implement it in a shader program.\nThe vanilla and stamp strokes share the exact same vertex placement method.\nFor your better understanding, avoid jumping right into the stamp part.'}),"\n",(0,a.jsx)(n.p,{children:"Maybe the stamp strokes with various styles don't interest you, feel free to ignore it and learn the vanilla stroke only.\nKnowing how to render a line is very handy when drawing UIs or debugging your 3D scenes."}),"\n",(0,a.jsx)(n.p,{children:'While you may recognize a brush stroke by its stylization, another crucial property could be ignored:\nthe "variable width" along the stroke.\nThe property is critical for experienced artists drawing professional illustrations or animations.\nFor instance, you can tell the difference from the figure below.\nThe one with variable width on the right has much better appearance.'}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{alt:"bunny",src:t(9277).Z+"",width:"1366",height:"768"})}),"\n",(0,a.jsx)(n.p,{children:"The width values are typically generated from the pressure values as a stylus presses and moves on a tablet.\nAfter the artists install a new painting program,\none of the highest priorities is to configure the mapping function from pen pressure to brush radius."}),"\n",(0,a.jsxs)(i,{children:[(0,a.jsx)("summary",{children:"In case you don't know about tablets and styluses"}),(0,a.jsx)(n.p,{children:"Digital artists paint with dedicated devices: Tablet and Stylus.\nIf you're unfamiliar with tablets and styluses, you can watch the video below for more information:"}),(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{href:"https://www.youtube.com/watch?app=desktop&v=83BRMfjJXIk",children:(0,a.jsx)(n.img,{src:"https://img.youtube.com/vi/83BRMfjJXIk/maxresdefault.jpg",alt:"Tablet"})})})]}),"\n",(0,a.jsx)(n.h2,{id:"geometric-data",children:"Geometric data"}),"\n",(0,a.jsx)(n.p,{children:"To store the variable radius in brush stroke, we will render an uncommon type of vector curve:\nAn ordered list of points (polyline) with radius values assigned to each point.\nAs a user presses a stylus on a tablet and moves, a paint program generates a sequence of points to record the trace of movement.\nMeanwhile, the pen pressure is transformed into the radius value assigned to each point.\nAfter rendering the stroke on the polyline, the user feels like drawing on canvas."}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.img,{alt:"Monkey",src:t(9863).Z+"",width:"1243",height:"931"}),"\n",(0,a.jsx)(n.em,{children:"The monkey Suzanne in Blender (Grease Pencil), the orange dots on the right side show polylines' points (vertices)."})]}),"\n",(0,a.jsxs)(n.p,{children:["We can approximate any type of curve by increasing the number of points in a polyline, whether freehand-drawn or mathematically defined.\nTry to change the ",(0,a.jsx)(n.code,{children:"maxRadius"})," and ",(0,a.jsx)(n.code,{children:"segmentCount"})," values in the code editor below to see how the vanilla stroke changes.\nI will elaborate on how to render this stroke in the next section.\nFeel free to change any other parts of the code as long as the function returns the ",(0,a.jsx)(n.code,{children:"position"})," and ",(0,a.jsx)(n.code,{children:"radius"})," array correctly."]}),"\n","\n","\n",(0,a.jsx)(o.ij,{showEditor:[!0,!1,!1]}),"\n",(0,a.jsx)(n.p,{children:"Blender Grease Pencil team has developed a lot of novel tools to edit polylines.\nRemember to check out if you were a researcher and want to develop novel techniques for digital painting."})]})}function p(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(u,{...e})}):u(e)}},5632:(e,n,t)=>{t.d(n,{ij:()=>g,Sw:()=>b,rL:()=>k,PQ:()=>y});var a=t(7294),r=t(9477),o=t(5452),i=t(4866),s=t(5162),l=t(3764),c=t(5034),d=t(9279);const u="precision mediump float;\nprecision mediump int;\n\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\n\nin vec2 position0;\nin float radius0;\nin float summedLength0;\nin vec2 position1;\nin float radius1;\nin float summedLength1;\n\nout vec2 p; // position of the current pixel\nflat out vec2 p0;\nflat out float r0;\nflat out float l0;\nflat out vec2 p1;\nflat out float r1;\nflat out float l1;\n\nvoid main()\t{\n r0 = radius0;\n r1 = radius1;\n p0 = position0;\n p1 = position1;\n l0 = summedLength0;\n l1 = summedLength1;\n\n vec2 tangent = normalize(position1 - position0);\n vec2 normal = vec2(-tangent.y, tangent.x);\n float cosTheta = (r0 - r1)/distance(p0, p1);\n // the vertex1 with radius is fully inside the vertex0.\n if(abs(cosTheta) >= 1.0) return;\n\n // Each instance is a trapzoid, whose vertices' positions are determined here.\n // Use gl_VertexID {0, 1, 2, 3} to index and get the desired parameters.\n // Be careful with the backface culling! We are ignoring it here.\n vec2 offsetSign = vec2[](\n vec2(-1.0,-1.0),\n vec2(-1.0, 1.0),\n vec2( 1.0, 1.0),\n vec2( 1.0,-1.0)\n )[gl_VertexID];\n vec2 position = vec2[](position0, position0, position1, position1)[gl_VertexID];\n float radius = vec4(radius0, radius0, radius1, radius1)[gl_VertexID];\n\n float tanHalfTheta = sqrt((1.0+cosTheta) / (1.0-cosTheta));\n float cotHalfTheta = 1.0 / tanHalfTheta;\n float normalTanValue = vec4(tanHalfTheta, tanHalfTheta, cotHalfTheta, cotHalfTheta)[gl_VertexID];\n if(normalTanValue > 10.0 || normalTanValue < 0.1) return;\n\n vec2 trapzoidVertexPosition = position +\n offsetSign.x * radius * tangent +\n offsetSign.y * radius * normal * normalTanValue;\n p = trapzoidVertexPosition;\n\n gl_Position = projectionMatrix * modelViewMatrix * vec4(trapzoidVertexPosition, 0.0, 1.0);\n}\n",p="precision mediump float;\nprecision mediump int;\n\nin vec2 p;\nflat in vec2 p0;\nflat in float r0;\nflat in float l0;\nflat in vec2 p1;\nflat in float r1;\nflat in float l1;\n\n// Common\nuniform int type;\nconst int Vanilla = 0, Stamp = 1, Airbrush = 2;\nuniform vec4 color;\n// Stamp\nuniform mediump sampler2D footprint;\nuniform float stampIntervalRatio;\nuniform float noiseFactor;\nuniform float rotationFactor;\nfloat x2n(float x); // from distance to stamp index.\nfloat n2x(float n); // from stamp index to distance.\nmat2 rotate(float angle);\n// Airbrush\nuniform mediump sampler2D gradient;\nfloat sampleGraident(float distance){ return texture(gradient, vec2(distance, 0.0)).r; }\n\n// Noise helper functions from _The Book of Shader_.\nfloat random (in vec2 st);\nfloat noise (in vec2 st);\nfloat fbm (in vec2 st);\n\nout vec4 outColor;\n\nvoid main() {\n vec2 tangent = normalize(p1 - p0);\n vec2 normal = vec2(-tangent.y, tangent.x);\n\n // The local coordinate orgin at p0, x axis along the tangent direct.\n float len = distance(p1, p0);\n vec2 pLocal = vec2(dot(p-p0, tangent), dot(p-p0, normal));\n vec2 p0Local = vec2(0, 0);\n vec2 p1Local = vec2(len, 0);\n\n float cosTheta = (r0 - r1)/len;\n float d0 = distance(p, p0);\n float d0cos = pLocal.x / d0;\n float d1 = distance(p, p1);\n float d1cos = (pLocal.x - len) / d1;\n\n // Remove corners\n if(d0cos < cosTheta && d0 > r0) discard;\n if(d1cos > cosTheta && d1 > r1) discard;\n\n if(type == Vanilla){\n if(d0 < r0 && d1 < r1) discard;\n float A = (d0 < r0 || d1 < r1) ? 1.0 - sqrt(1.0 - color.a) : color.a;\n outColor = vec4(color.rgb, A);\n return;\n }\n\n if(type == Stamp){\n // The method here is not published yet, it should be explained in a 10min video.\n // The footprint is a disk instead of a square.\n // We set a quadratic polynomial to calculate the effect range, the range on polyline edge footprint can touch the current pixel.\n // Two roots of the quadratic polynomial are the effectRangeFront and effectRangeBack.\n // Formulas from SIGGRAPH 2022 Talk - A Fast & Robust Solution for Cubic & Higher-Order Polynomials\n float a, b, c, delta;\n a = 1.0 - pow(cosTheta, 2.0);\n b = 2.0 * (r0 * cosTheta - pLocal.x);\n c = pow(pLocal.x, 2.0) + pow(pLocal.y, 2.0) - pow(r0, 2.0);\n delta = pow(b, 2.0) - 4.0*a*c;\n if(delta <= 0.0) discard; // This should never happen.\n\n float tempMathBlock = b + sign(b) * sqrt(delta);\n float x1 = -2.0 * c / tempMathBlock;\n float x2 = -tempMathBlock / (2.0*a);\n float effectRangeFront = x1 <= x2 ? x1 : x2;\n float effectRangeBack = x1 > x2 ? x1 : x2;\n\n // We stamp on polyline every time the stamp index comes to an integer.\n float index0 = l0/stampIntervalRatio; // The stamp index of vertex0.\n float startIndex, endIndex;\n if (effectRangeFront <= 0.0){\n startIndex = ceil(index0);\n }\n else{\n startIndex = ceil(index0 + x2n(effectRangeFront));\n }\n float index1 = l1/stampIntervalRatio;\n float backIndex = x2n(effectRangeBack) + index0;\n endIndex = index1 < backIndex ? index1 : backIndex;\n if(startIndex > endIndex) discard;\n\n // The main loop to sample and blend color from the footprint.\n int MAX_i = 128; float currIndex = startIndex;\n float A = 0.0;\n for(int i = 0; i < MAX_i; i++){\n float currStampLocalX = n2x(currIndex - index0);\n // Apply roation and sample the footprint.\n vec2 pToCurrStamp = pLocal - vec2(currStampLocalX, 0.0);\n float currStampRadius = r0 - cosTheta * currStampLocalX;\n float angle = rotationFactor*radians(360.0*fract(sin(currIndex)*1.0));\n pToCurrStamp *= rotate(angle);\n vec2 textureCoordinate = (pToCurrStamp/currStampRadius + 1.0)/2.0;\n float opacity = texture(footprint, textureCoordinate).a;\n // Blend opacity.\n float opacityNoise = noiseFactor*fbm(textureCoordinate*50.0);\n opacity = clamp(opacity - opacityNoise, 0.0, 1.0) * color.a;\n A = A * (1.0-opacity) + opacity;\n\n currIndex += 1.0;\n if(currIndex > endIndex) break;\n }\n if(A < 1e-4) discard;\n outColor = vec4(color.rgb, A);\n return;\n }\n\n if(type == Airbrush){\n // The method here is not published yet. Shen is not fully satisfied with the current solution.\n float tanTheta = sqrt(1.0 - cosTheta*cosTheta)/cosTheta;\n float mid = pLocal.x - abs(pLocal.y)/tanTheta;\n float A = color.a;\n float transparency0 = d0 > r0 ? 1.0:sqrt(1.0 - A*sampleGraident(d0/r0));\n float transparency1 = d1 > r1 ? 1.0:sqrt(1.0 - A*sampleGraident(d1/r1));\n float transparency;\n\n // A bunch of math derived with the continuous form of airbrush here.\n if(mid <= 0.0){\n transparency = transparency0/transparency1;\n }\n if(mid > 0.0 && mid < len){\n float r = (mid * r1 + (len - mid) * r0)/len;\n float dr = distance(pLocal, vec2(mid, 0))/r;\n transparency = (1.0 - A*sampleGraident(dr))/transparency0/transparency1;\n }\n if(mid >= len){\n transparency = transparency1/transparency0;\n }\n\n outColor = vec4(color.rgb, 1.0 - transparency);\n }\n}\n\nfloat x2n(float x){\n float L = distance(p0, p1);\n if(r0 == r1) return x/(stampIntervalRatio*r0);\n else return -L / stampIntervalRatio / (r0 - r1) * log(1.0 - (1.0 - r1/r0)/L * x);\n}\n\nfloat n2x(float n){\n float L = distance(p0, p1);\n if(r0 == r1) return n * stampIntervalRatio * r0;\n else return L * (1.0-exp(-(r0-r1)*n*stampIntervalRatio/L)) / (1.0-r1/r0);\n}\n\n// Helper functions----------------------------------------------------------------------------------\nmat2 rotate(float angle){\n return mat2(cos(angle), -sin(angle), sin(angle), cos(angle));\n}\n\nfloat random (in vec2 st) {\n return fract(sin(dot(st.xy,\n vec2(12.9898,78.233)))*\n 43758.5453123);\n}\n\nfloat noise (in vec2 st) {\n vec2 i = floor(st);\n vec2 f = fract(st);\n\n // Four corners in 2D of a tile\n float a = random(i);\n float b = random(i + vec2(1.0, 0.0));\n float c = random(i + vec2(0.0, 1.0));\n float d = random(i + vec2(1.0, 1.0));\n\n vec2 u = f * f * (3.0 - 2.0 * f);\n\n return mix(a, b, u.x) +\n (c - a)* u.y * (1.0 - u.x) +\n (d - b) * u.x * u.y;\n}\n\n#define OCTAVES 6\nfloat fbm (in vec2 st) {\n // Initial values\n float value = 0.0;\n float amplitude = .5;\n float frequency = 0.;\n //\n // Loop of octaves\n for (int i = 0; i < OCTAVES; i++) {\n value += amplitude * noise(st);\n st *= 2.;\n amplitude *= .5;\n }\n return value;\n}\n";var h=t(9501),f=t(412),m=t(5893);let v=function(e){return e[e.Vanilla=0]="Vanilla",e[e.Stamp=1]="Stamp",e[e.Airbrush=2]="Airbrush",e}({});function g(e){let{uniforms:n=null,showEditor:t=null}=e;const h=(0,a.useRef)(),f=(0,a.useRef)(),g=(0,a.useRef)();function x(e,n,t){const a=[...n],o=[...n.slice(2)],i=[...t],s=[...t.slice(1)],l=[];let c=0;for(let p=0;p{const e=(1+Math.sqrt(5))/2,t=h.current.clientWidth,a=t*(.5/e),i=4*e,s=i*(.5/e),l=new r.iKG(i/-2,i/2,s/2,s/-2,-1e3,1e3);l.position.z=5;const c=new r.CP7({antialias:!0,alpha:!0,premultipliedAlpha:!1,powerPreference:"high-performance"});function m(){const n=h.current.clientWidth,t=.5*n/e;c.setSize(n,t)}c.setClearColor(new r.Ilk(1,1,1),0),c.setSize(t,a),window.addEventListener("resize",m),h.current.appendChild(c.domElement);const w=new r.xsS,y=new o.o(l,c.domElement);y.enableRotate=!1,y.enableDamping=!1,y.screenSpacePanning=!0,y.addEventListener("change",(()=>{c.render(w,l)})),f.current=()=>c.render(w,l),window.addEventListener("TextureLoaded",f.current);const b=new r.u9r;b.setIndex([0,1,2,2,3,0]);const k=new Function(d.Z),[j,T]=k();x(b,j,T);const I={type:{value:v.Vanilla},color:{value:[0,0,0,1]},footprint:{value:new r.xEZ},stampIntervalRatio:{value:1},noiseFactor:{value:0},rotationFactor:{value:0},gradient:{value:new r.IEO}},A=new r.FIo({uniforms:n||I,vertexShader:u,fragmentShader:p,side:r.ehD,transparent:!0,glslVersion:r.LSk});return g.current=new r.SPe(b,A,T.length-1),g.current.frustumCulled=!1,w.add(g.current),f.current(),()=>{c.dispose(),window.removeEventListener("resize",m),window.removeEventListener("TextureLoaded",f.current)}}),[]);const y=(0,a.useCallback)(((e,n)=>{let t=[],a=[];try{const n=new Function(e);[t,a]=n()}catch(o){return void console.log(o.toString())}function r(e){if(Array.isArray(e)){for(let n=0;n{w(e,"")}})}),T&&(0,m.jsx)(s.Z,{value:"fragment.glsl",children:(0,m.jsx)(c.r,{height:b,defaultValue:p,onChange:e=>{w("",e)}})})]})}),(0,m.jsx)("div",{ref:h,style:{width:"100%"},onMouseDown:e=>e.preventDefault()})]})}let x=new r.xEZ;f.Z.canUseDOM&&(x=(new r.dpR).load(`/${h.Z.projectName}/img/stamp2.png`,(e=>{window.dispatchEvent(new CustomEvent("TextureLoaded"))}),void 0,void 0));let w=new r.xEZ;f.Z.canUseDOM&&(w=(new r.dpR).load(`/${h.Z.projectName}/img/dot.png`,(e=>{window.dispatchEvent(new CustomEvent("TextureLoaded"))}),void 0,void 0));const y={type:{value:v.Stamp},color:{value:[0,0,0,1]},footprint:{value:x},stampIntervalRatio:{value:.4},noiseFactor:{value:1.2},rotationFactor:{value:.75}},b=(((e,n)=>{let t=new r.AXT(new r.FM8(0,1),e,n,new r.FM8(1,0));const a=256,o=new Uint8Array(1024),i=t.getPoints(512);for(let r=0;r=t.x&&e<=a.x){let n=(t.y*(a.x-e)+a.y*(e-t.x))/(a.x-t.x);o[4*r]=Math.floor(255*n)}}}const s=new r.IEO(o,a,1);s.needsUpdate=!0})(new r.FM8(.33,1),new r.FM8(.66,0)),v.Airbrush,{type:{value:v.Stamp},color:{value:[0,0,0,.5]},footprint:{value:w},stampIntervalRatio:{value:2},noiseFactor:{value:0},rotationFactor:{value:0}}),k={type:{value:v.Stamp},color:{value:[0,0,0,.5]},footprint:{value:w},stampIntervalRatio:{value:1},noiseFactor:{value:0},rotationFactor:{value:0}}},9277:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/bunny-compare-794971aa073734471a630369491f11bf.png"},9863:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/monkey-218688e42a5da691e375e0bfea2ea753.png"}}]); \ No newline at end of file diff --git a/assets/js/6ae0415c.9dffb487.js b/assets/js/6ae0415c.9dffb487.js new file mode 100644 index 0000000..2b62d44 --- /dev/null +++ b/assets/js/6ae0415c.9dffb487.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkbrush_stroke_tutorial=self.webpackChunkbrush_stroke_tutorial||[]).push([[613],{5663:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>p,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var a=t(5893),r=t(1151),o=t(5632);const i={title:"Table of Contents",hide_title:!0,sidebar_position:1,slug:"/"},l=void 0,s={id:"toc",title:"Table of Contents",description:"eye-catcher",source:"@site/docs/toc.mdx",sourceDirName:".",slug:"/",permalink:"/brush-rendering-tutorial/",draft:!1,unlisted:!1,editUrl:"https://github.com/ShenCiao/brush-rendering-tutorial/tree/main/docs/toc.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Table of Contents",hide_title:!0,sidebar_position:1,slug:"/"},sidebar:"tutorialSidebar",next:{title:"Introduction",permalink:"/brush-rendering-tutorial/Introduction/"}},c={},d=[{value:"Table of Contents",id:"table-of-contents",level:2}];function u(e){const n={a:"a",h2:"h2",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.a)(),...e.components},{Details:i}=n;return i||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{alt:"eye-catcher",src:t(3014).Z+"",width:"736",height:"519"})}),"\n",(0,a.jsxs)(n.p,{children:["This tutorial series will teach you how to render brush strokes with the modern GPU graphics pipeline.\nIf you like this series, please star the ",(0,a.jsx)(n.a,{href:"https://github.com/ShenCiao/brush-rendering-tutorial",children:"code repository"})," instead of bookmark this website since the domain might be changed."]}),"\n",(0,a.jsx)(n.h2,{id:"table-of-contents",children:"Table of Contents"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"./introduction",children:"Introduction"})}),"\n",(0,a.jsxs)(n.li,{children:["Basics","\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"./Basics/Basics",children:"Problem Statement"})}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"./Basics/Vanilla",children:"Vanilla"})}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"./Basics/Stamp",children:"Stamp"})}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"./Airbrush",children:"Airbrush"})}),"\n"]}),"\n",(0,a.jsxs)(i,{children:[(0,a.jsx)("summary",{children:"Future Contents"}),(0,a.jsx)(n.p,{children:(0,a.jsx)(n.strong,{children:'Stamp density and "ratio-distance"'})}),(0,a.jsxs)("div",{className:"row row--no-gutters margin-left--xs",children:[(0,a.jsxs)("div",{className:"col col--6",children:[(0,a.jsx)(o.ij,{uniforms:o.Sw}),(0,a.jsx)("center",{children:(0,a.jsx)("em",{children:" Adjacent dots "})})]}),(0,a.jsxs)("div",{className:"col col--6",children:[(0,a.jsx)(o.ij,{uniforms:o.rL}),(0,a.jsx)("center",{children:(0,a.jsx)("em",{children:" Adjacent with one dot interleaved "})})]})]}),(0,a.jsx)("br",{}),(0,a.jsx)(n.p,{children:"You can see dots are adjacent to each other instead of equidistantly distributed.\nThe pattern is achieved by setting the intervals between dots proportional to their radii.\nYou will learn how to freely control stamp density along a stamp\nstroke. Very important for a serious project."}),(0,a.jsx)(n.p,{children:(0,a.jsx)(n.strong,{children:"3D stroke"})}),(0,a.jsx)(n.p,{children:"Learn how to extend the algorithms to 3D space."}),(0,a.jsx)(n.p,{children:"I'm integrating it into the Blender Grease Pencil:"}),(0,a.jsx)("iframe",{width:"100%",height:"500",src:"https://www.youtube.com/embed/Q7_3IhgHOZM?start=30",title:"Blender Grease Pencil Stamp Brush Demo",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0})]})]})}function p(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(u,{...e})}):u(e)}},5632:(e,n,t)=>{t.d(n,{ij:()=>v,Sw:()=>y,rL:()=>j,PQ:()=>w});var a=t(7294),r=t(9477),o=t(5452),i=t(4866),l=t(5162),s=t(3764),c=t(5034),d=t(9279);const u="precision mediump float;\nprecision mediump int;\n\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\n\nin vec2 position0;\nin float radius0;\nin float summedLength0;\nin vec2 position1;\nin float radius1;\nin float summedLength1;\n\nout vec2 p; // position of the current pixel\nflat out vec2 p0;\nflat out float r0;\nflat out float l0;\nflat out vec2 p1;\nflat out float r1;\nflat out float l1;\n\nvoid main()\t{\n r0 = radius0;\n r1 = radius1;\n p0 = position0;\n p1 = position1;\n l0 = summedLength0;\n l1 = summedLength1;\n\n vec2 tangent = normalize(position1 - position0);\n vec2 normal = vec2(-tangent.y, tangent.x);\n float cosTheta = (r0 - r1)/distance(p0, p1);\n // the vertex1 with radius is fully inside the vertex0.\n if(abs(cosTheta) >= 1.0) return;\n\n // Each instance is a trapzoid, whose vertices' positions are determined here.\n // Use gl_VertexID {0, 1, 2, 3} to index and get the desired parameters.\n // Be careful with the backface culling! We are ignoring it here.\n vec2 offsetSign = vec2[](\n vec2(-1.0,-1.0),\n vec2(-1.0, 1.0),\n vec2( 1.0, 1.0),\n vec2( 1.0,-1.0)\n )[gl_VertexID];\n vec2 position = vec2[](position0, position0, position1, position1)[gl_VertexID];\n float radius = vec4(radius0, radius0, radius1, radius1)[gl_VertexID];\n\n float tanHalfTheta = sqrt((1.0+cosTheta) / (1.0-cosTheta));\n float cotHalfTheta = 1.0 / tanHalfTheta;\n float normalTanValue = vec4(tanHalfTheta, tanHalfTheta, cotHalfTheta, cotHalfTheta)[gl_VertexID];\n if(normalTanValue > 10.0 || normalTanValue < 0.1) return;\n\n vec2 trapzoidVertexPosition = position +\n offsetSign.x * radius * tangent +\n offsetSign.y * radius * normal * normalTanValue;\n p = trapzoidVertexPosition;\n\n gl_Position = projectionMatrix * modelViewMatrix * vec4(trapzoidVertexPosition, 0.0, 1.0);\n}\n",p="precision mediump float;\nprecision mediump int;\n\nin vec2 p;\nflat in vec2 p0;\nflat in float r0;\nflat in float l0;\nflat in vec2 p1;\nflat in float r1;\nflat in float l1;\n\n// Common\nuniform int type;\nconst int Vanilla = 0, Stamp = 1, Airbrush = 2;\nuniform vec4 color;\n// Stamp\nuniform mediump sampler2D footprint;\nuniform float stampIntervalRatio;\nuniform float noiseFactor;\nuniform float rotationFactor;\nfloat x2n(float x); // from distance to stamp index.\nfloat n2x(float n); // from stamp index to distance.\nmat2 rotate(float angle);\n// Airbrush\nuniform mediump sampler2D gradient;\nfloat sampleGraident(float distance){ return texture(gradient, vec2(distance, 0.0)).r; }\n\n// Noise helper functions from _The Book of Shader_.\nfloat random (in vec2 st);\nfloat noise (in vec2 st);\nfloat fbm (in vec2 st);\n\nout vec4 outColor;\n\nvoid main() {\n vec2 tangent = normalize(p1 - p0);\n vec2 normal = vec2(-tangent.y, tangent.x);\n\n // The local coordinate orgin at p0, x axis along the tangent direct.\n float len = distance(p1, p0);\n vec2 pLocal = vec2(dot(p-p0, tangent), dot(p-p0, normal));\n vec2 p0Local = vec2(0, 0);\n vec2 p1Local = vec2(len, 0);\n\n float cosTheta = (r0 - r1)/len;\n float d0 = distance(p, p0);\n float d0cos = pLocal.x / d0;\n float d1 = distance(p, p1);\n float d1cos = (pLocal.x - len) / d1;\n\n // Remove corners\n if(d0cos < cosTheta && d0 > r0) discard;\n if(d1cos > cosTheta && d1 > r1) discard;\n\n if(type == Vanilla){\n if(d0 < r0 && d1 < r1) discard;\n float A = (d0 < r0 || d1 < r1) ? 1.0 - sqrt(1.0 - color.a) : color.a;\n outColor = vec4(color.rgb, A);\n return;\n }\n\n if(type == Stamp){\n // The method here is not published yet, it should be explained in a 10min video.\n // The footprint is a disk instead of a square.\n // We set a quadratic polynomial to calculate the effect range, the range on polyline edge footprint can touch the current pixel.\n // Two roots of the quadratic polynomial are the effectRangeFront and effectRangeBack.\n // Formulas from SIGGRAPH 2022 Talk - A Fast & Robust Solution for Cubic & Higher-Order Polynomials\n float a, b, c, delta;\n a = 1.0 - pow(cosTheta, 2.0);\n b = 2.0 * (r0 * cosTheta - pLocal.x);\n c = pow(pLocal.x, 2.0) + pow(pLocal.y, 2.0) - pow(r0, 2.0);\n delta = pow(b, 2.0) - 4.0*a*c;\n if(delta <= 0.0) discard; // This should never happen.\n\n float tempMathBlock = b + sign(b) * sqrt(delta);\n float x1 = -2.0 * c / tempMathBlock;\n float x2 = -tempMathBlock / (2.0*a);\n float effectRangeFront = x1 <= x2 ? x1 : x2;\n float effectRangeBack = x1 > x2 ? x1 : x2;\n\n // We stamp on polyline every time the stamp index comes to an integer.\n float index0 = l0/stampIntervalRatio; // The stamp index of vertex0.\n float startIndex, endIndex;\n if (effectRangeFront <= 0.0){\n startIndex = ceil(index0);\n }\n else{\n startIndex = ceil(index0 + x2n(effectRangeFront));\n }\n float index1 = l1/stampIntervalRatio;\n float backIndex = x2n(effectRangeBack) + index0;\n endIndex = index1 < backIndex ? index1 : backIndex;\n if(startIndex > endIndex) discard;\n\n // The main loop to sample and blend color from the footprint.\n int MAX_i = 128; float currIndex = startIndex;\n float A = 0.0;\n for(int i = 0; i < MAX_i; i++){\n float currStampLocalX = n2x(currIndex - index0);\n // Apply roation and sample the footprint.\n vec2 pToCurrStamp = pLocal - vec2(currStampLocalX, 0.0);\n float currStampRadius = r0 - cosTheta * currStampLocalX;\n float angle = rotationFactor*radians(360.0*fract(sin(currIndex)*1.0));\n pToCurrStamp *= rotate(angle);\n vec2 textureCoordinate = (pToCurrStamp/currStampRadius + 1.0)/2.0;\n float opacity = texture(footprint, textureCoordinate).a;\n // Blend opacity.\n float opacityNoise = noiseFactor*fbm(textureCoordinate*50.0);\n opacity = clamp(opacity - opacityNoise, 0.0, 1.0) * color.a;\n A = A * (1.0-opacity) + opacity;\n\n currIndex += 1.0;\n if(currIndex > endIndex) break;\n }\n if(A < 1e-4) discard;\n outColor = vec4(color.rgb, A);\n return;\n }\n\n if(type == Airbrush){\n // The method here is not published yet. Shen is not fully satisfied with the current solution.\n float tanTheta = sqrt(1.0 - cosTheta*cosTheta)/cosTheta;\n float mid = pLocal.x - abs(pLocal.y)/tanTheta;\n float A = color.a;\n float transparency0 = d0 > r0 ? 1.0:sqrt(1.0 - A*sampleGraident(d0/r0));\n float transparency1 = d1 > r1 ? 1.0:sqrt(1.0 - A*sampleGraident(d1/r1));\n float transparency;\n\n // A bunch of math derived with the continuous form of airbrush here.\n if(mid <= 0.0){\n transparency = transparency0/transparency1;\n }\n if(mid > 0.0 && mid < len){\n float r = (mid * r1 + (len - mid) * r0)/len;\n float dr = distance(pLocal, vec2(mid, 0))/r;\n transparency = (1.0 - A*sampleGraident(dr))/transparency0/transparency1;\n }\n if(mid >= len){\n transparency = transparency1/transparency0;\n }\n\n outColor = vec4(color.rgb, 1.0 - transparency);\n }\n}\n\nfloat x2n(float x){\n float L = distance(p0, p1);\n if(r0 == r1) return x/(stampIntervalRatio*r0);\n else return -L / stampIntervalRatio / (r0 - r1) * log(1.0 - (1.0 - r1/r0)/L * x);\n}\n\nfloat n2x(float n){\n float L = distance(p0, p1);\n if(r0 == r1) return n * stampIntervalRatio * r0;\n else return L * (1.0-exp(-(r0-r1)*n*stampIntervalRatio/L)) / (1.0-r1/r0);\n}\n\n// Helper functions----------------------------------------------------------------------------------\nmat2 rotate(float angle){\n return mat2(cos(angle), -sin(angle), sin(angle), cos(angle));\n}\n\nfloat random (in vec2 st) {\n return fract(sin(dot(st.xy,\n vec2(12.9898,78.233)))*\n 43758.5453123);\n}\n\nfloat noise (in vec2 st) {\n vec2 i = floor(st);\n vec2 f = fract(st);\n\n // Four corners in 2D of a tile\n float a = random(i);\n float b = random(i + vec2(1.0, 0.0));\n float c = random(i + vec2(0.0, 1.0));\n float d = random(i + vec2(1.0, 1.0));\n\n vec2 u = f * f * (3.0 - 2.0 * f);\n\n return mix(a, b, u.x) +\n (c - a)* u.y * (1.0 - u.x) +\n (d - b) * u.x * u.y;\n}\n\n#define OCTAVES 6\nfloat fbm (in vec2 st) {\n // Initial values\n float value = 0.0;\n float amplitude = .5;\n float frequency = 0.;\n //\n // Loop of octaves\n for (int i = 0; i < OCTAVES; i++) {\n value += amplitude * noise(st);\n st *= 2.;\n amplitude *= .5;\n }\n return value;\n}\n";var f=t(9501),h=t(412),m=t(5893);let x=function(e){return e[e.Vanilla=0]="Vanilla",e[e.Stamp=1]="Stamp",e[e.Airbrush=2]="Airbrush",e}({});function v(e){let{uniforms:n=null,showEditor:t=null}=e;const f=(0,a.useRef)(),h=(0,a.useRef)(),v=(0,a.useRef)();function g(e,n,t){const a=[...n],o=[...n.slice(2)],i=[...t],l=[...t.slice(1)],s=[];let c=0;for(let p=0;p{const e=(1+Math.sqrt(5))/2,t=f.current.clientWidth,a=t*(.5/e),i=4*e,l=i*(.5/e),s=new r.iKG(i/-2,i/2,l/2,l/-2,-1e3,1e3);s.position.z=5;const c=new r.CP7({antialias:!0,alpha:!0,premultipliedAlpha:!1,powerPreference:"high-performance"});function m(){const n=f.current.clientWidth,t=.5*n/e;c.setSize(n,t)}c.setClearColor(new r.Ilk(1,1,1),0),c.setSize(t,a),window.addEventListener("resize",m),f.current.appendChild(c.domElement);const b=new r.xsS,w=new o.o(s,c.domElement);w.enableRotate=!1,w.enableDamping=!1,w.screenSpacePanning=!0,w.addEventListener("change",(()=>{c.render(b,s)})),h.current=()=>c.render(b,s),window.addEventListener("TextureLoaded",h.current);const y=new r.u9r;y.setIndex([0,1,2,2,3,0]);const j=new Function(d.Z),[T,A]=j();g(y,T,A);const S={type:{value:x.Vanilla},color:{value:[0,0,0,1]},footprint:{value:new r.xEZ},stampIntervalRatio:{value:1},noiseFactor:{value:0},rotationFactor:{value:0},gradient:{value:new r.IEO}},I=new r.FIo({uniforms:n||S,vertexShader:u,fragmentShader:p,side:r.ehD,transparent:!0,glslVersion:r.LSk});return v.current=new r.SPe(y,I,A.length-1),v.current.frustumCulled=!1,b.add(v.current),h.current(),()=>{c.dispose(),window.removeEventListener("resize",m),window.removeEventListener("TextureLoaded",h.current)}}),[]);const w=(0,a.useCallback)(((e,n)=>{let t=[],a=[];try{const n=new Function(e);[t,a]=n()}catch(o){return void console.log(o.toString())}function r(e){if(Array.isArray(e)){for(let n=0;n{b(e,"")}})}),A&&(0,m.jsx)(l.Z,{value:"fragment.glsl",children:(0,m.jsx)(c.r,{height:y,defaultValue:p,onChange:e=>{b("",e)}})})]})}),(0,m.jsx)("div",{ref:f,style:{width:"100%"},onMouseDown:e=>e.preventDefault()})]})}let g=new r.xEZ;h.Z.canUseDOM&&(g=(new r.dpR).load(`/${f.Z.projectName}/img/stamp2.png`,(e=>{window.dispatchEvent(new CustomEvent("TextureLoaded"))}),void 0,void 0));let b=new r.xEZ;h.Z.canUseDOM&&(b=(new r.dpR).load(`/${f.Z.projectName}/img/dot.png`,(e=>{window.dispatchEvent(new CustomEvent("TextureLoaded"))}),void 0,void 0));const w={type:{value:x.Stamp},color:{value:[0,0,0,1]},footprint:{value:g},stampIntervalRatio:{value:.4},noiseFactor:{value:1.2},rotationFactor:{value:.75}},y=(((e,n)=>{let t=new r.AXT(new r.FM8(0,1),e,n,new r.FM8(1,0));const a=256,o=new Uint8Array(1024),i=t.getPoints(512);for(let r=0;r=t.x&&e<=a.x){let n=(t.y*(a.x-e)+a.y*(e-t.x))/(a.x-t.x);o[4*r]=Math.floor(255*n)}}}const l=new r.IEO(o,a,1);l.needsUpdate=!0})(new r.FM8(.33,1),new r.FM8(.66,0)),x.Airbrush,{type:{value:x.Stamp},color:{value:[0,0,0,.5]},footprint:{value:b},stampIntervalRatio:{value:2},noiseFactor:{value:0},rotationFactor:{value:0}}),j={type:{value:x.Stamp},color:{value:[0,0,0,.5]},footprint:{value:b},stampIntervalRatio:{value:1},noiseFactor:{value:0},rotationFactor:{value:0}}},3014:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/brushes-f893bdac91be521b7e82bfdeb7d737eb.jpg"}}]); \ No newline at end of file diff --git a/assets/js/6ae0415c.b5896ee6.js b/assets/js/6ae0415c.b5896ee6.js deleted file mode 100644 index e05adb2..0000000 --- a/assets/js/6ae0415c.b5896ee6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkbrush_stroke_tutorial=self.webpackChunkbrush_stroke_tutorial||[]).push([[613],{5663:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>p,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var a=t(5893),r=t(1151),o=t(5632);const i={title:"Table of Contents",hide_title:!0,sidebar_position:1,slug:"/"},l=void 0,s={id:"toc",title:"Table of Contents",description:"This tutorial series will teach you how to render brush strokes with the modern GPU graphics pipeline.",source:"@site/docs/toc.mdx",sourceDirName:".",slug:"/",permalink:"/brush-rendering-tutorial/",draft:!1,unlisted:!1,editUrl:"https://github.com/ShenCiao/brush-rendering-tutorial/tree/main/docs/toc.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Table of Contents",hide_title:!0,sidebar_position:1,slug:"/"},sidebar:"tutorialSidebar",next:{title:"Introduction",permalink:"/brush-rendering-tutorial/Introduction/"}},c={},d=[{value:"Table of Contents",id:"table-of-contents",level:2},{value:"Airbrush",id:"airbrush",level:3},{value:"Stamp density and "ratio-distance"",id:"stamp-density-and-ratio-distance",level:3},{value:"3D stroke",id:"3d-stroke",level:3}];function u(e){const n={a:"a",h2:"h2",h3:"h3",li:"li",p:"p",ul:"ul",...(0,r.a)(),...e.components},{Details:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.p,{children:"This tutorial series will teach you how to render brush strokes with the modern GPU graphics pipeline."}),"\n",(0,a.jsxs)(n.p,{children:["If you like this series, please star the ",(0,a.jsx)(n.a,{href:"https://github.com/ShenCiao/brush-rendering-tutorial",children:"code repository"})," instead of bookmark this website since the domain might be changed."]}),"\n",(0,a.jsx)(n.h2,{id:"table-of-contents",children:"Table of Contents"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"./introduction",children:"Introduction"})}),"\n",(0,a.jsxs)(n.li,{children:["Basics","\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"./Basics/Basics",children:"Basics"})}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"./Basics/Vanilla",children:"Vanilla"})}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"./Basics/Stamp",children:"Stamp"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t,{children:[(0,a.jsx)("summary",{children:"Future Contents"}),(0,a.jsx)(n.h3,{id:"airbrush",children:"Airbrush"}),(0,a.jsx)(o.ij,{uniforms:o.en}),(0,a.jsx)(n.p,{children:'Airbrush is a special type of stamp brush.\nHere I\'m demonstrating a "continuous airbrush", which is mathematically continuous and needs a little bit of calculus to develop.\nYou will learn how to generalize a stamp brush into its continuous form.'}),(0,a.jsx)(n.h3,{id:"stamp-density-and-ratio-distance",children:'Stamp density and "ratio-distance"'}),(0,a.jsxs)("div",{className:"row row--no-gutters margin-left--xs",children:[(0,a.jsxs)("div",{className:"col col--6",children:[(0,a.jsx)(o.ij,{uniforms:o.Sw}),(0,a.jsx)("center",{children:(0,a.jsx)("em",{children:" Adjacent dots "})})]}),(0,a.jsxs)("div",{className:"col col--6",children:[(0,a.jsx)(o.ij,{uniforms:o.rL}),(0,a.jsx)("center",{children:(0,a.jsx)("em",{children:" Adjacent with one dot interleaved "})})]})]}),(0,a.jsx)("br",{}),(0,a.jsx)(n.p,{children:"You can see dots are adjacent to each other instead of equidistantly distributed.\nThe pattern is achieved by setting the intervals between dots proportional to their radii.\nYou will learn how to freely control stamp density along a stamp\nstroke. Very important for a serious project."}),(0,a.jsx)(n.h3,{id:"3d-stroke",children:"3D stroke"}),(0,a.jsx)(n.p,{children:"Learn how to extend the algorithms to 3D space."}),(0,a.jsx)(n.p,{children:"I'm integrating it into the Blender Grease Pencil:"}),(0,a.jsx)("iframe",{width:"100%",height:"500",src:"https://www.youtube.com/embed/Q7_3IhgHOZM?start=30",title:"Blender Grease Pencil Stamp Brush Demo",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0})]})]})}function p(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(u,{...e})}):u(e)}},5632:(e,n,t)=>{t.d(n,{ij:()=>v,en:()=>j,Sw:()=>T,rL:()=>A,PQ:()=>b});var a=t(7294),r=t(9477),o=t(5452),i=t(4866),l=t(5162),s=t(3764),c=t(5034),d=t(9279);const u="precision mediump float;\nprecision mediump int;\n\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\n\nin vec2 position0;\nin float radius0;\nin float summedLength0;\nin vec2 position1;\nin float radius1;\nin float summedLength1;\n\nout vec2 p; // position of the current pixel\nflat out vec2 p0;\nflat out float r0;\nflat out float l0;\nflat out vec2 p1;\nflat out float r1;\nflat out float l1;\n\nvoid main()\t{\n r0 = radius0;\n r1 = radius1;\n p0 = position0;\n p1 = position1;\n l0 = summedLength0;\n l1 = summedLength1;\n\n vec2 tangent = normalize(position1 - position0);\n vec2 normal = vec2(-tangent.y, tangent.x);\n float cosTheta = (r0 - r1)/distance(p0, p1);\n // the vertex1 with radius is fully inside the vertex0.\n if(abs(cosTheta) >= 1.0) return;\n\n // Each instance is a trapzoid, whose vertices' positions are determined here.\n // Use gl_VertexID {0, 1, 2, 3} to index and get the desired parameters.\n // Be careful with the backface culling! We are ignoring it here.\n vec2 offsetSign = vec2[](\n vec2(-1.0,-1.0),\n vec2(-1.0, 1.0),\n vec2( 1.0, 1.0),\n vec2( 1.0,-1.0)\n )[gl_VertexID];\n vec2 position = vec2[](position0, position0, position1, position1)[gl_VertexID];\n float radius = vec4(radius0, radius0, radius1, radius1)[gl_VertexID];\n\n float tanHalfTheta = sqrt((1.0+cosTheta) / (1.0-cosTheta));\n float cotHalfTheta = 1.0 / tanHalfTheta;\n float normalTanValue = vec4(tanHalfTheta, tanHalfTheta, cotHalfTheta, cotHalfTheta)[gl_VertexID];\n if(normalTanValue > 10.0 || normalTanValue < 0.1) return;\n\n vec2 trapzoidVertexPosition = position +\n offsetSign.x * radius * tangent +\n offsetSign.y * radius * normal * normalTanValue;\n p = trapzoidVertexPosition;\n\n gl_Position = projectionMatrix * modelViewMatrix * vec4(trapzoidVertexPosition, 0.0, 1.0);\n}\n",p="precision mediump float;\nprecision mediump int;\n\nin vec2 p;\nflat in vec2 p0;\nflat in float r0;\nflat in float l0;\nflat in vec2 p1;\nflat in float r1;\nflat in float l1;\n\n// Common\nuniform int type;\nconst int Vanilla = 0, Stamp = 1, Airbrush = 2;\nuniform vec4 color;\n// Stamp\nuniform mediump sampler2D footprint;\nuniform float stampIntervalRatio;\nuniform float noiseFactor;\nuniform float rotationFactor;\nfloat x2n(float x); // from distance to stamp index.\nfloat n2x(float n); // from stamp index to distance.\nmat2 rotate(float angle);\n// Airbrush\nuniform mediump sampler2D gradient;\nfloat sampleGraident(float distance){ return texture(gradient, vec2(distance, 0.0)).r; }\n\n// Noise helper functions from _The Book of Shader_.\nfloat random (in vec2 st);\nfloat noise (in vec2 st);\nfloat fbm (in vec2 st);\n\nout vec4 outColor;\n\nvoid main() {\n vec2 tangent = normalize(p1 - p0);\n vec2 normal = vec2(-tangent.y, tangent.x);\n\n // The local coordinate orgin at p0, x axis along the tangent direct.\n float len = distance(p1, p0);\n vec2 pLocal = vec2(dot(p-p0, tangent), dot(p-p0, normal));\n vec2 p0Local = vec2(0, 0);\n vec2 p1Local = vec2(len, 0);\n\n float cosTheta = (r0 - r1)/len;\n float d0 = distance(p, p0);\n float d0cos = pLocal.x / d0;\n float d1 = distance(p, p1);\n float d1cos = (pLocal.x - len) / d1;\n\n // Remove corners\n if(d0cos < cosTheta && d0 > r0) discard;\n if(d1cos > cosTheta && d1 > r1) discard;\n\n if(type == Vanilla){\n if(d0 < r0 && d1 < r1) discard;\n float A = (d0 < r0 || d1 < r1) ? 1.0 - sqrt(1.0 - color.a) : color.a;\n outColor = vec4(color.rgb, A);\n return;\n }\n\n if(type == Stamp){\n // The method here is not published yet, it should be explained in a 10min video.\n // The footprint is a disk instead of a square.\n // We set a quadratic polynomial to calculate the effect range, the range on polyline edge footprint can touch the current pixel.\n // Two roots of the quadratic polynomial are the effectRangeFront and effectRangeBack.\n // Formulas from SIGGRAPH 2022 Talk - A Fast & Robust Solution for Cubic & Higher-Order Polynomials\n float a, b, c, delta;\n a = 1.0 - pow(cosTheta, 2.0);\n b = 2.0 * (r0 * cosTheta - pLocal.x);\n c = pow(pLocal.x, 2.0) + pow(pLocal.y, 2.0) - pow(r0, 2.0);\n delta = pow(b, 2.0) - 4.0*a*c;\n if(delta <= 0.0) discard; // This should never happen.\n\n float tempMathBlock = b + sign(b) * sqrt(delta);\n float x1 = -2.0 * c / tempMathBlock;\n float x2 = -tempMathBlock / (2.0*a);\n float effectRangeFront = x1 <= x2 ? x1 : x2;\n float effectRangeBack = x1 > x2 ? x1 : x2;\n\n // We stamp on polyline every time the stamp index comes to an integer.\n float index0 = l0/stampIntervalRatio; // The stamp index of vertex0.\n float startIndex, endIndex;\n if (effectRangeFront <= 0.0){\n startIndex = ceil(index0);\n }\n else{\n startIndex = ceil(index0 + x2n(effectRangeFront));\n }\n float index1 = l1/stampIntervalRatio;\n float backIndex = x2n(effectRangeBack) + index0;\n endIndex = index1 < backIndex ? index1 : backIndex;\n if(startIndex > endIndex) discard;\n\n // The main loop to sample and blend color from the footprint.\n int MAX_i = 128; float currIndex = startIndex;\n float A = 0.0;\n for(int i = 0; i < MAX_i; i++){\n float currStampLocalX = n2x(currIndex - index0);\n // Apply roation and sample the footprint.\n vec2 pToCurrStamp = pLocal - vec2(currStampLocalX, 0.0);\n float currStampRadius = r0 - cosTheta * currStampLocalX;\n float angle = rotationFactor*radians(360.0*fract(sin(currIndex)*1.0));\n pToCurrStamp *= rotate(angle);\n vec2 textureCoordinate = (pToCurrStamp/currStampRadius + 1.0)/2.0;\n float opacity = texture(footprint, textureCoordinate).a;\n // Blend opacity.\n float opacityNoise = noiseFactor*fbm(textureCoordinate*50.0);\n opacity = clamp(opacity - opacityNoise, 0.0, 1.0) * color.a;\n A = A * (1.0-opacity) + opacity;\n\n currIndex += 1.0;\n if(currIndex > endIndex) break;\n }\n if(A < 1e-4) discard;\n outColor = vec4(color.rgb, A);\n return;\n }\n\n if(type == Airbrush){\n // The method here is not published yet. Shen is not fully satisfied with the current solution.\n float tanTheta = sqrt(1.0 - cosTheta*cosTheta)/cosTheta;\n float mid = pLocal.x - abs(pLocal.y)/tanTheta;\n float A = color.a;\n float transparency0 = d0 > r0 ? 1.0:sqrt(1.0 - A*sampleGraident(d0/r0));\n float transparency1 = d1 > r1 ? 1.0:sqrt(1.0 - A*sampleGraident(d1/r1));\n float transparency;\n\n // A bunch of math derived with the continuous form of airbrush here.\n if(mid <= 0.0){\n transparency = transparency0/transparency1;\n }\n if(mid > 0.0 && mid < len){\n float r = (mid * r1 + (len - mid) * r0)/len;\n float dr = distance(pLocal, vec2(mid, 0))/r;\n transparency = (1.0 - A*sampleGraident(dr))/transparency0/transparency1;\n }\n if(mid >= len){\n transparency = transparency1/transparency0;\n }\n\n outColor = vec4(color.rgb, 1.0 - transparency);\n }\n}\n\nfloat x2n(float x){\n float L = distance(p0, p1);\n if(r0 == r1) return x/(stampIntervalRatio*r0);\n else return -L / stampIntervalRatio / (r0 - r1) * log(1.0 - (1.0 - r1/r0)/L * x);\n}\n\nfloat n2x(float n){\n float L = distance(p0, p1);\n if(r0 == r1) return n * stampIntervalRatio * r0;\n else return L * (1.0-exp(-(r0-r1)*n*stampIntervalRatio/L)) / (1.0-r1/r0);\n}\n\n// Helper functions----------------------------------------------------------------------------------\nmat2 rotate(float angle){\n return mat2(cos(angle), -sin(angle), sin(angle), cos(angle));\n}\n\nfloat random (in vec2 st) {\n return fract(sin(dot(st.xy,\n vec2(12.9898,78.233)))*\n 43758.5453123);\n}\n\nfloat noise (in vec2 st) {\n vec2 i = floor(st);\n vec2 f = fract(st);\n\n // Four corners in 2D of a tile\n float a = random(i);\n float b = random(i + vec2(1.0, 0.0));\n float c = random(i + vec2(0.0, 1.0));\n float d = random(i + vec2(1.0, 1.0));\n\n vec2 u = f * f * (3.0 - 2.0 * f);\n\n return mix(a, b, u.x) +\n (c - a)* u.y * (1.0 - u.x) +\n (d - b) * u.x * u.y;\n}\n\n#define OCTAVES 6\nfloat fbm (in vec2 st) {\n // Initial values\n float value = 0.0;\n float amplitude = .5;\n float frequency = 0.;\n //\n // Loop of octaves\n for (int i = 0; i < OCTAVES; i++) {\n value += amplitude * noise(st);\n st *= 2.;\n amplitude *= .5;\n }\n return value;\n}\n";var f=t(9501),h=t(412),m=t(5893);let x=function(e){return e[e.Vanilla=0]="Vanilla",e[e.Stamp=1]="Stamp",e[e.Airbrush=2]="Airbrush",e}({});function v(e){let{uniforms:n=null,showEditor:t=null}=e;const f=(0,a.useRef)(),h=(0,a.useRef)(),v=(0,a.useRef)();function g(e,n,t){const a=[...n],o=[...n.slice(2)],i=[...t],l=[...t.slice(1)],s=[];let c=0;for(let p=0;p{const e=(1+Math.sqrt(5))/2,t=f.current.clientWidth,a=t*(.5/e),i=4*e,l=i*(.5/e),s=new r.iKG(i/-2,i/2,l/2,l/-2,-1e3,1e3);s.position.z=5;const c=new r.CP7({antialias:!0,alpha:!0,premultipliedAlpha:!1,powerPreference:"high-performance"});function m(){const n=f.current.clientWidth,t=.5*n/e;c.setSize(n,t)}c.setClearColor(new r.Ilk(1,1,1),0),c.setSize(t,a),window.addEventListener("resize",m),f.current.appendChild(c.domElement);const w=new r.xsS,b=new o.o(s,c.domElement);b.enableRotate=!1,b.enableDamping=!1,b.screenSpacePanning=!0,b.addEventListener("change",(()=>{c.render(w,s)})),h.current=()=>c.render(w,s),window.addEventListener("TextureLoaded",h.current);const y=new r.u9r;y.setIndex([0,1,2,2,3,0]);const j=new Function(d.Z),[T,A]=j();g(y,T,A);const I={type:{value:x.Vanilla},color:{value:[0,0,0,1]},footprint:{value:new r.xEZ},stampIntervalRatio:{value:1},noiseFactor:{value:0},rotationFactor:{value:0},gradient:{value:new r.IEO}},S=new r.FIo({uniforms:n||I,vertexShader:u,fragmentShader:p,side:r.ehD,transparent:!0,glslVersion:r.LSk});return v.current=new r.SPe(y,S,A.length-1),v.current.frustumCulled=!1,w.add(v.current),h.current(),()=>{c.dispose(),window.removeEventListener("resize",m),window.removeEventListener("TextureLoaded",h.current)}}),[]);const b=(0,a.useCallback)(((e,n)=>{let t=[],a=[];try{const n=new Function(e);[t,a]=n()}catch(o){return void console.log(o.toString())}function r(e){if(Array.isArray(e)){for(let n=0;n{w(e,"")}})}),A&&(0,m.jsx)(l.Z,{value:"fragment.glsl",children:(0,m.jsx)(c.r,{height:y,defaultValue:p,onChange:e=>{w("",e)}})})]})}),(0,m.jsx)("div",{ref:f,style:{width:"100%"},onMouseDown:e=>e.preventDefault()})]})}let g=new r.xEZ;h.Z.canUseDOM&&(g=(new r.dpR).load(`/${f.Z.projectName}/img/stamp2.png`,(e=>{window.dispatchEvent(new CustomEvent("TextureLoaded"))}),void 0,void 0));let w=new r.xEZ;h.Z.canUseDOM&&(w=(new r.dpR).load(`/${f.Z.projectName}/img/dot.png`,(e=>{window.dispatchEvent(new CustomEvent("TextureLoaded"))}),void 0,void 0));const b={type:{value:x.Stamp},color:{value:[0,0,0,1]},footprint:{value:g},stampIntervalRatio:{value:.4},noiseFactor:{value:1.2},rotationFactor:{value:.75}},y=((e,n)=>{let t=new r.AXT(new r.FM8(0,1),e,n,new r.FM8(1,0));const a=256,o=new Uint8Array(1024),i=t.getPoints(512);for(let r=0;r=t.x&&e<=a.x){let n=(t.y*(a.x-e)+a.y*(e-t.x))/(a.x-t.x);o[4*r]=Math.floor(255*n)}}}const l=new r.IEO(o,a,1);return l.needsUpdate=!0,l})(new r.FM8(.33,1),new r.FM8(.66,0)),j={type:{value:x.Airbrush},color:{value:[0,0,0,1]},gradient:{value:y}},T={type:{value:x.Stamp},color:{value:[0,0,0,.5]},footprint:{value:w},stampIntervalRatio:{value:2},noiseFactor:{value:0},rotationFactor:{value:0}},A={type:{value:x.Stamp},color:{value:[0,0,0,.5]},footprint:{value:w},stampIntervalRatio:{value:1},noiseFactor:{value:0},rotationFactor:{value:0}}}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.d6c8afee.js b/assets/js/935f2afb.d6c8afee.js new file mode 100644 index 0000000..8eb6a86 --- /dev/null +++ b/assets/js/935f2afb.d6c8afee.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkbrush_stroke_tutorial=self.webpackChunkbrush_stroke_tutorial||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Table of Contents","href":"/brush-rendering-tutorial/","docId":"toc","unlisted":false},{"type":"link","label":"Introduction","href":"/brush-rendering-tutorial/Introduction/","docId":"Introduction/Introduction","unlisted":false},{"type":"category","label":"Basics","collapsible":false,"collapsed":false,"customProps":{"description":"This description can be used in the swizzled DocCard"},"className":"red","items":[{"type":"link","label":"Problem Statement","href":"/brush-rendering-tutorial/Basics/Basics/","docId":"Basics/Basics/Basics","unlisted":false},{"type":"link","label":"Vanilla","href":"/brush-rendering-tutorial/Basics/Vanilla/","docId":"Basics/Vanilla/Vanilla","unlisted":false},{"type":"link","label":"Stamp","href":"/brush-rendering-tutorial/Basics/Stamp/","docId":"Basics/Stamp/Stamp","unlisted":false}],"href":"/brush-rendering-tutorial/category/basics"},{"type":"link","label":"Airbrush","href":"/brush-rendering-tutorial/Airbrush/","docId":"Airbrush/Airbrush","unlisted":false},{"type":"link","label":"Tessellation","href":"/brush-rendering-tutorial/Tessellation/","docId":"Tessellation/Tessellation","unlisted":false},{"type":"category","label":"Appendix","collapsible":true,"collapsed":true,"customProps":{"description":"This description can be used in the swizzled DocCard"},"items":[{"type":"link","label":"Vector Fill","href":"/brush-rendering-tutorial/Appendix/Vector-fill/","docId":"Appendix/Vector-fill/Vector-fill","unlisted":false}],"href":"/brush-rendering-tutorial/category/appendix"},{"type":"link","label":"\u2192 I\'m applying for a PhD","href":"/brush-rendering-tutorial/About/","docId":"About/About","unlisted":false}]},"docs":{"About/About":{"id":"About/About","title":"About","description":"Applying for Ph.D.","sidebar":"tutorialSidebar"},"Airbrush/Airbrush":{"id":"Airbrush/Airbrush","title":"Airbrush","description":"toairbrush0","sidebar":"tutorialSidebar"},"Appendix/Vector-fill/Vector-fill":{"id":"Appendix/Vector-fill/Vector-fill","title":"Pre-introduction to Vector Fill","description":"You may have learned how to render brush strokes on polyline curves.","sidebar":"tutorialSidebar"},"Basics/Basics/Basics":{"id":"Basics/Basics/Basics","title":"Problem Statement","description":"Brush strokes","sidebar":"tutorialSidebar"},"Basics/Stamp/Stamp":{"id":"Basics/Stamp/Stamp","title":"Stamp","description":"Intro","sidebar":"tutorialSidebar"},"Basics/Vanilla/Vanilla":{"id":"Basics/Vanilla/Vanilla","title":"Vanilla","description":"Uni radius","sidebar":"tutorialSidebar"},"Introduction/Introduction":{"id":"Introduction/Introduction","title":"Introduction","description":"Vanilla","sidebar":"tutorialSidebar"},"Tessellation/Tessellation":{"id":"Tessellation/Tessellation","title":"Tessellation-based Rendering","description":"There were works trying to tessellate a stroke and render it with GPU.","sidebar":"tutorialSidebar"},"toc":{"id":"toc","title":"Table of Contents","description":"eye-catcher","sidebar":"tutorialSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.e9e1f595.js b/assets/js/935f2afb.e9e1f595.js deleted file mode 100644 index bb81d83..0000000 --- a/assets/js/935f2afb.e9e1f595.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkbrush_stroke_tutorial=self.webpackChunkbrush_stroke_tutorial||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Table of Contents","href":"/brush-rendering-tutorial/","docId":"toc","unlisted":false},{"type":"link","label":"Introduction","href":"/brush-rendering-tutorial/Introduction/","docId":"Introduction/Introduction","unlisted":false},{"type":"category","label":"Basics","collapsible":false,"collapsed":false,"customProps":{"description":"This description can be used in the swizzled DocCard"},"className":"red","items":[{"type":"link","label":"Basics","href":"/brush-rendering-tutorial/Basics/Basics/","docId":"Basics/Basics/Basics","unlisted":false},{"type":"link","label":"Vanilla","href":"/brush-rendering-tutorial/Basics/Vanilla/","docId":"Basics/Vanilla/Vanilla","unlisted":false},{"type":"link","label":"Stamp","href":"/brush-rendering-tutorial/Basics/Stamp/","docId":"Basics/Stamp/Stamp","unlisted":false}],"href":"/brush-rendering-tutorial/category/basics"},{"type":"link","label":"Airbrush","href":"/brush-rendering-tutorial/Airbrush/","docId":"Airbrush/Airbrush","unlisted":false},{"type":"link","label":"Tessellation","href":"/brush-rendering-tutorial/Tessellation/","docId":"Tessellation/Tessellation","unlisted":false},{"type":"category","label":"Appendix","collapsible":true,"collapsed":true,"customProps":{"description":"This description can be used in the swizzled DocCard"},"items":[{"type":"link","label":"Vector Fill","href":"/brush-rendering-tutorial/Appendix/Vector-fill/","docId":"Appendix/Vector-fill/Vector-fill","unlisted":false}],"href":"/brush-rendering-tutorial/category/appendix"},{"type":"link","label":"\u2192 I\'m applying for a PhD","href":"/brush-rendering-tutorial/About/","docId":"About/About","unlisted":false}]},"docs":{"About/About":{"id":"About/About","title":"About","description":"Applying for Ph.D.","sidebar":"tutorialSidebar"},"Airbrush/Airbrush":{"id":"Airbrush/Airbrush","title":"Airbrush","description":"toairbrush0","sidebar":"tutorialSidebar"},"Appendix/Vector-fill/Vector-fill":{"id":"Appendix/Vector-fill/Vector-fill","title":"Pre-introduction to Vector Fill","description":"You may have learned how to render brush strokes on polyline curves.","sidebar":"tutorialSidebar"},"Basics/Basics/Basics":{"id":"Basics/Basics/Basics","title":"Basics","description":"Brush strokes","sidebar":"tutorialSidebar"},"Basics/Stamp/Stamp":{"id":"Basics/Stamp/Stamp","title":"Stamp","description":"Intro","sidebar":"tutorialSidebar"},"Basics/Vanilla/Vanilla":{"id":"Basics/Vanilla/Vanilla","title":"Vanilla","description":"Uni radius","sidebar":"tutorialSidebar"},"Introduction/Introduction":{"id":"Introduction/Introduction","title":"Introduction","description":"Vanilla","sidebar":"tutorialSidebar"},"Tessellation/Tessellation":{"id":"Tessellation/Tessellation","title":"Tessellation-based Rendering","description":"There were works trying to tessellate a stroke and render it with GPU.","sidebar":"tutorialSidebar"},"toc":{"id":"toc","title":"Table of Contents","description":"This tutorial series will teach you how to render brush strokes with the modern GPU graphics pipeline.","sidebar":"tutorialSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/ac092286.46380a79.js b/assets/js/ac092286.46380a79.js deleted file mode 100644 index b0c1c24..0000000 --- a/assets/js/ac092286.46380a79.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkbrush_stroke_tutorial=self.webpackChunkbrush_stroke_tutorial||[]).push([[364],{5923:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var r=t(5893),a=t(1151),o=t(5632);const i={title:"Introduction",sidebar_position:2},l=void 0,s={id:"Introduction/Introduction",title:"Introduction",description:"Vanilla",source:"@site/docs/Introduction/Introduction.mdx",sourceDirName:"Introduction",slug:"/Introduction/",permalink:"/brush-rendering-tutorial/Introduction/",draft:!1,unlisted:!1,editUrl:"https://github.com/ShenCiao/brush-rendering-tutorial/tree/main/docs/Introduction/Introduction.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Introduction",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Table of Contents",permalink:"/brush-rendering-tutorial/"},next:{title:"Basics",permalink:"/brush-rendering-tutorial/category/basics"}},c={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Structure",id:"structure",level:2},{value:"Content",id:"content",level:3},{value:"Live coding",id:"live-coding",level:3},{value:"Supplementary contents",id:"supplementary-contents",level:3},{value:"Citation",id:"citation",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.a)(),...e.components},{Details:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("div",{className:"row row--no-gutters margin-left--xs",children:[(0,r.jsxs)("div",{className:"col col--6",children:[(0,r.jsx)(o.ij,{}),(0,r.jsx)("center",{children:(0,r.jsx)("em",{children:" Vanilla "})})]}),(0,r.jsxs)("div",{className:"col col--6",children:[(0,r.jsx)(o.ij,{uniforms:o.PQ}),(0,r.jsx)("center",{children:(0,r.jsx)("em",{children:" Pencil "})})]})]}),"\n",(0,r.jsx)("br",{}),"\n",(0,r.jsxs)(n.admonition,{type:"note",children:[(0,r.jsx)(n.p,{children:"When hovering your mouse on the canvas you can:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Pan"}),": Left-click and drag the mouse."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Zoom"}),": Scroll or drag the mouse wheel."]}),"\n"]})]}),"\n",(0,r.jsxs)(n.p,{children:["This tutorial series will teach you how to use the modern GPU graphics pipeline to render brush strokes,\ncommonly seen with a paint tool in graphics design software like Photoshop.\nThe contents mainly come from my research work ",(0,r.jsx)(n.a,{href:"https://github.com/ShenCiao/Ciallo",children:"Ciallo: The next generation vector paint program"}),',\nand a textbook "Image and Video-Based Artistic Stylisation" by Stephen DiVerdi, which introduce brush stroke rendering in its second chapter.\nSince there will be more research work on GPU brush stroke rendering,\nI will continuously update this tutorial series to teach you related techniques in (potentially) influential research works.']}),"\n",(0,r.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsx)(n.p,{children:"Decent experience in one of the GPU graphics APIs like OpenGL and D3D is required.\nIf you were relatively new to computer graphics, you should at least have rendered your first 3D scene and practiced instanced rendering."}),"\n",(0,r.jsxs)(n.p,{children:["It's totally fine if you never heard about ",(0,r.jsx)(n.code,{children:"LINES"}),", ",(0,r.jsx)(n.code,{children:"LINE_STRIP"}),", and ",(0,r.jsx)(n.code,{children:"LINE_LOOP"})," GPU primitives.\nWe won't use them directly in this tutorial series.\nIf you're interested in learning about their drawbacks, you can check out mattdesl's article titled \"Drawing Lines is Hard\" ",(0,r.jsx)(n.a,{href:"https://mattdesl.svbtle.com/drawing-lines-is-hard",children:"here"}),".\nWhile reading it isn't a prerequisite, I still recommend it."]}),"\n",(0,r.jsx)(n.p,{children:"Though I create all the demos in the web environment, you don't have to know about WebGL or WebGPU.\nWe will concentrate on high-level techniques rather than the implementation details.\nNo matter which GPU API you are familiar with, utilizing them to render a stroke will be easy after this series."}),"\n",(0,r.jsx)(n.h2,{id:"structure",children:"Structure"}),"\n",(0,r.jsx)(n.h3,{id:"content",children:"Content"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.a,{href:"../category/basics/",children:"Basic"})," section covers the basics of the rendering and stylization methods.\nArticles in the Basic part are organized in a progressive fashion.\nYou may miss something important if skip one of them.\nAfter learning all stuffs in the Basic section, you can freely select your favorite topics to learn.\nI will list extra prerequisites at the very beginning of each article."]}),"\n",(0,r.jsx)(n.h3,{id:"live-coding",children:"Live coding"}),"\n",(0,r.jsxs)(n.p,{children:["You will find live code editors similar to the one displayed below, inspired by ",(0,r.jsx)(n.a,{href:"https://thebookofshaders.com/",children:(0,r.jsx)(n.em,{children:"The Book of Shader"})}),".\nThe rendering result is updated in real-time after modifying the code.\nGive it a try by altering the values of ",(0,r.jsx)(n.code,{children:"maxRadius"}),", and watch how the canvas below changes."]}),"\n",(0,r.jsx)(o.ij,{showEditor:[!0,!1,!1]}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["If there are bugs for common usages in the code editors or canvases, tell me at the ",(0,r.jsx)(n.a,{href:"https://github.com/ShenCiao/brush-rendering-tutorial/issues",children:"issue"})," page."]})}),"\n",(0,r.jsx)(n.p,{children:'Only geometry generation code "geometry.js" is demonstrated here.\nYou will find "vertex.glsl" and "fragment.glsl" for vertex and fragment shader code.\nWhether they are hidden or shown will depend on the context.'}),"\n",(0,r.jsx)(n.h3,{id:"supplementary-contents",children:"Supplementary contents"}),"\n",(0,r.jsx)(t,{open:!0,children:(0,r.jsxs)(n.p,{children:[(0,r.jsx)("summary",{children:"Dropdown tab"}),"\nSome contents are hidden inside a dropdown tab like this.\nThey are complementary to the main contents.\nFeel free to skip them."]})}),"\n",(0,r.jsx)(n.h2,{id:"citation",children:"Citation"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"@inproceedings{Ciallo2023,\n author = {Ciao, Shen and Wei, Li-Yi},\n title = {Ciallo: The next-Generation Vector Paint Program},\n year = {2023},\n isbn = {9798400701436},\n publisher = {Association for Computing Machinery},\n address = {New York, NY, USA},\n url = {https://doi.org/10.1145/3587421.3595418},\n doi = {10.1145/3587421.3595418},\n booktitle = {ACM SIGGRAPH 2023 Talks},\n articleno = {67},\n numpages = {2},\n keywords = {Digital painting, stylized stroke, arrangement, vector graphics. coloring, graphics processing unit (GPU)},\n location = {Los Angeles, CA, USA},\n series = {SIGGRAPH '23}\n}\n"})}),"\n",(0,r.jsxs)(n.admonition,{title:"Research Tip",type:"note",children:[(0,r.jsx)(n.p,{children:"To demonstrate your research work about brush rendering, select vector drawings have variable radius or pen pressure data.\nRegular vector drawing datasets don't contain them."}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Zeyu Wang's work: ",(0,r.jsx)(n.a,{href:"https://dl.acm.org/doi/10.1145/3450626.3459819",children:"Paper"})," | ",(0,r.jsx)(n.a,{href:"https://github.com/zachzeyuwang/tracing-vs-freehand",children:"Dataset"})]}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://cloud.blender.org/p/gallery/5b642e25bf419c1042056fc6",children:"Blender Grease Pencil"})}),"\n",(0,r.jsxs)(n.li,{children:["... Tell me more in the ",(0,r.jsx)(n.a,{href:"https://github.com/ShenCiao/brush-rendering-tutorial/discussions/1",children:"discussion"}),"."]}),"\n"]})]})]})}function h(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},5632:(e,n,t)=>{t.d(n,{ij:()=>v,en:()=>j,Sw:()=>I,rL:()=>T,PQ:()=>w});var r=t(7294),a=t(9477),o=t(5452),i=t(4866),l=t(5162),s=t(3764),c=t(5034),d=t(9279);const u="precision mediump float;\nprecision mediump int;\n\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\n\nin vec2 position0;\nin float radius0;\nin float summedLength0;\nin vec2 position1;\nin float radius1;\nin float summedLength1;\n\nout vec2 p; // position of the current pixel\nflat out vec2 p0;\nflat out float r0;\nflat out float l0;\nflat out vec2 p1;\nflat out float r1;\nflat out float l1;\n\nvoid main()\t{\n r0 = radius0;\n r1 = radius1;\n p0 = position0;\n p1 = position1;\n l0 = summedLength0;\n l1 = summedLength1;\n\n vec2 tangent = normalize(position1 - position0);\n vec2 normal = vec2(-tangent.y, tangent.x);\n float cosTheta = (r0 - r1)/distance(p0, p1);\n // the vertex1 with radius is fully inside the vertex0.\n if(abs(cosTheta) >= 1.0) return;\n\n // Each instance is a trapzoid, whose vertices' positions are determined here.\n // Use gl_VertexID {0, 1, 2, 3} to index and get the desired parameters.\n // Be careful with the backface culling! We are ignoring it here.\n vec2 offsetSign = vec2[](\n vec2(-1.0,-1.0),\n vec2(-1.0, 1.0),\n vec2( 1.0, 1.0),\n vec2( 1.0,-1.0)\n )[gl_VertexID];\n vec2 position = vec2[](position0, position0, position1, position1)[gl_VertexID];\n float radius = vec4(radius0, radius0, radius1, radius1)[gl_VertexID];\n\n float tanHalfTheta = sqrt((1.0+cosTheta) / (1.0-cosTheta));\n float cotHalfTheta = 1.0 / tanHalfTheta;\n float normalTanValue = vec4(tanHalfTheta, tanHalfTheta, cotHalfTheta, cotHalfTheta)[gl_VertexID];\n if(normalTanValue > 10.0 || normalTanValue < 0.1) return;\n\n vec2 trapzoidVertexPosition = position +\n offsetSign.x * radius * tangent +\n offsetSign.y * radius * normal * normalTanValue;\n p = trapzoidVertexPosition;\n\n gl_Position = projectionMatrix * modelViewMatrix * vec4(trapzoidVertexPosition, 0.0, 1.0);\n}\n",h="precision mediump float;\nprecision mediump int;\n\nin vec2 p;\nflat in vec2 p0;\nflat in float r0;\nflat in float l0;\nflat in vec2 p1;\nflat in float r1;\nflat in float l1;\n\n// Common\nuniform int type;\nconst int Vanilla = 0, Stamp = 1, Airbrush = 2;\nuniform vec4 color;\n// Stamp\nuniform mediump sampler2D footprint;\nuniform float stampIntervalRatio;\nuniform float noiseFactor;\nuniform float rotationFactor;\nfloat x2n(float x); // from distance to stamp index.\nfloat n2x(float n); // from stamp index to distance.\nmat2 rotate(float angle);\n// Airbrush\nuniform mediump sampler2D gradient;\nfloat sampleGraident(float distance){ return texture(gradient, vec2(distance, 0.0)).r; }\n\n// Noise helper functions from _The Book of Shader_.\nfloat random (in vec2 st);\nfloat noise (in vec2 st);\nfloat fbm (in vec2 st);\n\nout vec4 outColor;\n\nvoid main() {\n vec2 tangent = normalize(p1 - p0);\n vec2 normal = vec2(-tangent.y, tangent.x);\n\n // The local coordinate orgin at p0, x axis along the tangent direct.\n float len = distance(p1, p0);\n vec2 pLocal = vec2(dot(p-p0, tangent), dot(p-p0, normal));\n vec2 p0Local = vec2(0, 0);\n vec2 p1Local = vec2(len, 0);\n\n float cosTheta = (r0 - r1)/len;\n float d0 = distance(p, p0);\n float d0cos = pLocal.x / d0;\n float d1 = distance(p, p1);\n float d1cos = (pLocal.x - len) / d1;\n\n // Remove corners\n if(d0cos < cosTheta && d0 > r0) discard;\n if(d1cos > cosTheta && d1 > r1) discard;\n\n if(type == Vanilla){\n if(d0 < r0 && d1 < r1) discard;\n float A = (d0 < r0 || d1 < r1) ? 1.0 - sqrt(1.0 - color.a) : color.a;\n outColor = vec4(color.rgb, A);\n return;\n }\n\n if(type == Stamp){\n // The method here is not published yet, it should be explained in a 10min video.\n // The footprint is a disk instead of a square.\n // We set a quadratic polynomial to calculate the effect range, the range on polyline edge footprint can touch the current pixel.\n // Two roots of the quadratic polynomial are the effectRangeFront and effectRangeBack.\n // Formulas from SIGGRAPH 2022 Talk - A Fast & Robust Solution for Cubic & Higher-Order Polynomials\n float a, b, c, delta;\n a = 1.0 - pow(cosTheta, 2.0);\n b = 2.0 * (r0 * cosTheta - pLocal.x);\n c = pow(pLocal.x, 2.0) + pow(pLocal.y, 2.0) - pow(r0, 2.0);\n delta = pow(b, 2.0) - 4.0*a*c;\n if(delta <= 0.0) discard; // This should never happen.\n\n float tempMathBlock = b + sign(b) * sqrt(delta);\n float x1 = -2.0 * c / tempMathBlock;\n float x2 = -tempMathBlock / (2.0*a);\n float effectRangeFront = x1 <= x2 ? x1 : x2;\n float effectRangeBack = x1 > x2 ? x1 : x2;\n\n // We stamp on polyline every time the stamp index comes to an integer.\n float index0 = l0/stampIntervalRatio; // The stamp index of vertex0.\n float startIndex, endIndex;\n if (effectRangeFront <= 0.0){\n startIndex = ceil(index0);\n }\n else{\n startIndex = ceil(index0 + x2n(effectRangeFront));\n }\n float index1 = l1/stampIntervalRatio;\n float backIndex = x2n(effectRangeBack) + index0;\n endIndex = index1 < backIndex ? index1 : backIndex;\n if(startIndex > endIndex) discard;\n\n // The main loop to sample and blend color from the footprint.\n int MAX_i = 128; float currIndex = startIndex;\n float A = 0.0;\n for(int i = 0; i < MAX_i; i++){\n float currStampLocalX = n2x(currIndex - index0);\n // Apply roation and sample the footprint.\n vec2 pToCurrStamp = pLocal - vec2(currStampLocalX, 0.0);\n float currStampRadius = r0 - cosTheta * currStampLocalX;\n float angle = rotationFactor*radians(360.0*fract(sin(currIndex)*1.0));\n pToCurrStamp *= rotate(angle);\n vec2 textureCoordinate = (pToCurrStamp/currStampRadius + 1.0)/2.0;\n float opacity = texture(footprint, textureCoordinate).a;\n // Blend opacity.\n float opacityNoise = noiseFactor*fbm(textureCoordinate*50.0);\n opacity = clamp(opacity - opacityNoise, 0.0, 1.0) * color.a;\n A = A * (1.0-opacity) + opacity;\n\n currIndex += 1.0;\n if(currIndex > endIndex) break;\n }\n if(A < 1e-4) discard;\n outColor = vec4(color.rgb, A);\n return;\n }\n\n if(type == Airbrush){\n // The method here is not published yet. Shen is not fully satisfied with the current solution.\n float tanTheta = sqrt(1.0 - cosTheta*cosTheta)/cosTheta;\n float mid = pLocal.x - abs(pLocal.y)/tanTheta;\n float A = color.a;\n float transparency0 = d0 > r0 ? 1.0:sqrt(1.0 - A*sampleGraident(d0/r0));\n float transparency1 = d1 > r1 ? 1.0:sqrt(1.0 - A*sampleGraident(d1/r1));\n float transparency;\n\n // A bunch of math derived with the continuous form of airbrush here.\n if(mid <= 0.0){\n transparency = transparency0/transparency1;\n }\n if(mid > 0.0 && mid < len){\n float r = (mid * r1 + (len - mid) * r0)/len;\n float dr = distance(pLocal, vec2(mid, 0))/r;\n transparency = (1.0 - A*sampleGraident(dr))/transparency0/transparency1;\n }\n if(mid >= len){\n transparency = transparency1/transparency0;\n }\n\n outColor = vec4(color.rgb, 1.0 - transparency);\n }\n}\n\nfloat x2n(float x){\n float L = distance(p0, p1);\n if(r0 == r1) return x/(stampIntervalRatio*r0);\n else return -L / stampIntervalRatio / (r0 - r1) * log(1.0 - (1.0 - r1/r0)/L * x);\n}\n\nfloat n2x(float n){\n float L = distance(p0, p1);\n if(r0 == r1) return n * stampIntervalRatio * r0;\n else return L * (1.0-exp(-(r0-r1)*n*stampIntervalRatio/L)) / (1.0-r1/r0);\n}\n\n// Helper functions----------------------------------------------------------------------------------\nmat2 rotate(float angle){\n return mat2(cos(angle), -sin(angle), sin(angle), cos(angle));\n}\n\nfloat random (in vec2 st) {\n return fract(sin(dot(st.xy,\n vec2(12.9898,78.233)))*\n 43758.5453123);\n}\n\nfloat noise (in vec2 st) {\n vec2 i = floor(st);\n vec2 f = fract(st);\n\n // Four corners in 2D of a tile\n float a = random(i);\n float b = random(i + vec2(1.0, 0.0));\n float c = random(i + vec2(0.0, 1.0));\n float d = random(i + vec2(1.0, 1.0));\n\n vec2 u = f * f * (3.0 - 2.0 * f);\n\n return mix(a, b, u.x) +\n (c - a)* u.y * (1.0 - u.x) +\n (d - b) * u.x * u.y;\n}\n\n#define OCTAVES 6\nfloat fbm (in vec2 st) {\n // Initial values\n float value = 0.0;\n float amplitude = .5;\n float frequency = 0.;\n //\n // Loop of octaves\n for (int i = 0; i < OCTAVES; i++) {\n value += amplitude * noise(st);\n st *= 2.;\n amplitude *= .5;\n }\n return value;\n}\n";var p=t(9501),f=t(412),m=t(5893);let x=function(e){return e[e.Vanilla=0]="Vanilla",e[e.Stamp=1]="Stamp",e[e.Airbrush=2]="Airbrush",e}({});function v(e){let{uniforms:n=null,showEditor:t=null}=e;const p=(0,r.useRef)(),f=(0,r.useRef)(),v=(0,r.useRef)();function g(e,n,t){const r=[...n],o=[...n.slice(2)],i=[...t],l=[...t.slice(1)],s=[];let c=0;for(let h=0;h{const e=(1+Math.sqrt(5))/2,t=p.current.clientWidth,r=t*(.5/e),i=4*e,l=i*(.5/e),s=new a.iKG(i/-2,i/2,l/2,l/-2,-1e3,1e3);s.position.z=5;const c=new a.CP7({antialias:!0,alpha:!0,premultipliedAlpha:!1,powerPreference:"high-performance"});function m(){const n=p.current.clientWidth,t=.5*n/e;c.setSize(n,t)}c.setClearColor(new a.Ilk(1,1,1),0),c.setSize(t,r),window.addEventListener("resize",m),p.current.appendChild(c.domElement);const y=new a.xsS,w=new o.o(s,c.domElement);w.enableRotate=!1,w.enableDamping=!1,w.screenSpacePanning=!0,w.addEventListener("change",(()=>{c.render(y,s)})),f.current=()=>c.render(y,s),window.addEventListener("TextureLoaded",f.current);const b=new a.u9r;b.setIndex([0,1,2,2,3,0]);const j=new Function(d.Z),[I,T]=j();g(b,I,T);const S={type:{value:x.Vanilla},color:{value:[0,0,0,1]},footprint:{value:new a.xEZ},stampIntervalRatio:{value:1},noiseFactor:{value:0},rotationFactor:{value:0},gradient:{value:new a.IEO}},A=new a.FIo({uniforms:n||S,vertexShader:u,fragmentShader:h,side:a.ehD,transparent:!0,glslVersion:a.LSk});return v.current=new a.SPe(b,A,T.length-1),v.current.frustumCulled=!1,y.add(v.current),f.current(),()=>{c.dispose(),window.removeEventListener("resize",m),window.removeEventListener("TextureLoaded",f.current)}}),[]);const w=(0,r.useCallback)(((e,n)=>{let t=[],r=[];try{const n=new Function(e);[t,r]=n()}catch(o){return void console.log(o.toString())}function a(e){if(Array.isArray(e)){for(let n=0;n{y(e,"")}})}),T&&(0,m.jsx)(l.Z,{value:"fragment.glsl",children:(0,m.jsx)(c.r,{height:b,defaultValue:h,onChange:e=>{y("",e)}})})]})}),(0,m.jsx)("div",{ref:p,style:{width:"100%"},onMouseDown:e=>e.preventDefault()})]})}let g=new a.xEZ;f.Z.canUseDOM&&(g=(new a.dpR).load(`/${p.Z.projectName}/img/stamp2.png`,(e=>{window.dispatchEvent(new CustomEvent("TextureLoaded"))}),void 0,void 0));let y=new a.xEZ;f.Z.canUseDOM&&(y=(new a.dpR).load(`/${p.Z.projectName}/img/dot.png`,(e=>{window.dispatchEvent(new CustomEvent("TextureLoaded"))}),void 0,void 0));const w={type:{value:x.Stamp},color:{value:[0,0,0,1]},footprint:{value:g},stampIntervalRatio:{value:.4},noiseFactor:{value:1.2},rotationFactor:{value:.75}},b=((e,n)=>{let t=new a.AXT(new a.FM8(0,1),e,n,new a.FM8(1,0));const r=256,o=new Uint8Array(1024),i=t.getPoints(512);for(let a=0;a=t.x&&e<=r.x){let n=(t.y*(r.x-e)+r.y*(e-t.x))/(r.x-t.x);o[4*a]=Math.floor(255*n)}}}const l=new a.IEO(o,r,1);return l.needsUpdate=!0,l})(new a.FM8(.33,1),new a.FM8(.66,0)),j={type:{value:x.Airbrush},color:{value:[0,0,0,1]},gradient:{value:b}},I={type:{value:x.Stamp},color:{value:[0,0,0,.5]},footprint:{value:y},stampIntervalRatio:{value:2},noiseFactor:{value:0},rotationFactor:{value:0}},T={type:{value:x.Stamp},color:{value:[0,0,0,.5]},footprint:{value:y},stampIntervalRatio:{value:1},noiseFactor:{value:0},rotationFactor:{value:0}}}}]); \ No newline at end of file diff --git a/assets/js/ac092286.788807fc.js b/assets/js/ac092286.788807fc.js new file mode 100644 index 0000000..204c558 --- /dev/null +++ b/assets/js/ac092286.788807fc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkbrush_stroke_tutorial=self.webpackChunkbrush_stroke_tutorial||[]).push([[364],{5923:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>d});var r=t(5893),a=t(1151),o=t(5632);const i={title:"Introduction",sidebar_position:2},s=void 0,l={id:"Introduction/Introduction",title:"Introduction",description:"Vanilla",source:"@site/docs/Introduction/Introduction.mdx",sourceDirName:"Introduction",slug:"/Introduction/",permalink:"/brush-rendering-tutorial/Introduction/",draft:!1,unlisted:!1,editUrl:"https://github.com/ShenCiao/brush-rendering-tutorial/tree/main/docs/Introduction/Introduction.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Introduction",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Table of Contents",permalink:"/brush-rendering-tutorial/"},next:{title:"Basics",permalink:"/brush-rendering-tutorial/category/basics"}},c={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Structure",id:"structure",level:2},{value:"Content",id:"content",level:3},{value:"Live coding",id:"live-coding",level:3},{value:"Supplementary contents",id:"supplementary-contents",level:3},{value:"Citation",id:"citation",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.a)(),...e.components},{Details:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("div",{className:"row row--no-gutters margin-left--xs",children:[(0,r.jsxs)("div",{className:"col col--6",children:[(0,r.jsx)(o.ij,{}),(0,r.jsx)("center",{children:(0,r.jsx)("em",{children:" Vanilla "})})]}),(0,r.jsxs)("div",{className:"col col--6",children:[(0,r.jsx)(o.ij,{uniforms:o.PQ}),(0,r.jsx)("center",{children:(0,r.jsx)("em",{children:" Pencil "})})]})]}),"\n",(0,r.jsx)("br",{}),"\n",(0,r.jsxs)(n.admonition,{type:"note",children:[(0,r.jsx)(n.p,{children:"When hovering your mouse on the canvas you can:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Pan"}),": Left-click and drag the mouse."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Zoom"}),": Scroll or drag the mouse wheel."]}),"\n"]})]}),"\n",(0,r.jsxs)(n.p,{children:["This tutorial series will teach you how to use the modern GPU graphics pipeline to render brush strokes,\ncommonly seen with a paint tool in graphics design software like Photoshop.\nThe contents mainly come from my research work ",(0,r.jsx)(n.a,{href:"https://github.com/ShenCiao/Ciallo",children:"Ciallo: The next generation vector paint program"}),',\nand a textbook "Image and Video-Based Artistic Stylisation" by Stephen DiVerdi, which introduce brush stroke rendering in its second chapter.\nSince there will be more research work on GPU brush stroke rendering,\nI will continuously update this tutorial series to teach you related techniques in (potentially) influential research works.']}),"\n",(0,r.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsx)(n.p,{children:"Decent experience in one of the GPU graphics APIs like OpenGL and D3D is required.\nIf you were relatively new to computer graphics, you should at least have rendered your first 3D scene and practiced instanced rendering."}),"\n",(0,r.jsxs)(n.p,{children:["GPU apis have built-in line rendering functionalities.\nIt's totally fine if you never heard about ",(0,r.jsx)(n.code,{children:"LINES"}),", ",(0,r.jsx)(n.code,{children:"LINE_STRIP"}),", and ",(0,r.jsx)(n.code,{children:"LINE_LOOP"})," GPU primitives.\nWe won't use the functionalities in this tutorial series.\nIf you're interested in learning about their drawbacks, you can check out mattdesl's article titled ",(0,r.jsx)(n.a,{href:"https://mattdesl.svbtle.com/drawing-lines-is-hard",children:"Drawing Lines is Hard"}),".\nReading it isn't a prerequisite, I still recommend it."]}),"\n",(0,r.jsx)(n.p,{children:"Though I create all the demos in the web environment, you don't have to know about WebGL or WebGPU.\nWe will concentrate on high-level techniques rather than the implementation details.\nNo matter which GPU API you are familiar with, utilizing them to render a stroke will be easy after this series."}),"\n",(0,r.jsx)(n.h2,{id:"structure",children:"Structure"}),"\n",(0,r.jsx)(n.h3,{id:"content",children:"Content"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.a,{href:"../category/basics/",children:"Basic"})," section covers the basics of the rendering and stylization methods.\nArticles in the Basic part are organized in a progressive fashion.\nYou may miss something important if skip one of them.\nAfter learning the Basic section, you can freely select your favorite topics.\nI will list extra prerequisites at the very beginning of each article."]}),"\n",(0,r.jsx)(n.h3,{id:"live-coding",children:"Live coding"}),"\n",(0,r.jsxs)(n.p,{children:["You will find live code editors similar to the one displayed below, inspired by ",(0,r.jsx)(n.a,{href:"https://thebookofshaders.com/",children:(0,r.jsx)(n.em,{children:"The Book of Shader"})}),".\nThe rendering result is updated in real-time after modifying the code.\nGive it a try by altering the values of ",(0,r.jsx)(n.code,{children:"maxRadius"}),", and watch how the canvas below changes."]}),"\n",(0,r.jsx)(o.ij,{showEditor:[!0,!1,!1]}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["If there are bugs for common usages in the code editors or canvases, tell me at the ",(0,r.jsx)(n.a,{href:"https://github.com/ShenCiao/brush-rendering-tutorial/issues",children:"issue"})," page."]})}),"\n",(0,r.jsx)(n.p,{children:'Only geometry generation code "geometry.js" is demonstrated here.\nYou will find "vertex.glsl" and "fragment.glsl" for vertex and fragment shader code.\nWhether they are hidden or shown will depend on the context.'}),"\n",(0,r.jsx)(n.h3,{id:"supplementary-contents",children:"Supplementary contents"}),"\n",(0,r.jsx)(t,{open:!0,children:(0,r.jsxs)(n.p,{children:[(0,r.jsx)("summary",{children:"Dropdown tab"}),"\nSome contents are hidden inside a dropdown tab like this.\nThey are complementary to the main contents.\nFeel free to skip them."]})}),"\n",(0,r.jsx)(n.h2,{id:"citation",children:"Citation"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"@inproceedings{Ciallo2023,\n author = {Ciao, Shen and Wei, Li-Yi},\n title = {Ciallo: The next-Generation Vector Paint Program},\n year = {2023},\n isbn = {9798400701436},\n publisher = {Association for Computing Machinery},\n address = {New York, NY, USA},\n url = {https://doi.org/10.1145/3587421.3595418},\n doi = {10.1145/3587421.3595418},\n booktitle = {ACM SIGGRAPH 2023 Talks},\n articleno = {67},\n numpages = {2},\n keywords = {Digital painting, stylized stroke, arrangement, vector graphics. coloring, graphics processing unit (GPU)},\n location = {Los Angeles, CA, USA},\n series = {SIGGRAPH '23}\n}\n"})}),"\n",(0,r.jsxs)(n.admonition,{title:"Research Tip",type:"note",children:[(0,r.jsx)(n.p,{children:"To demonstrate your research work about brush rendering, select vector drawings have variable radius or pen pressure data.\nRegular vector drawing datasets don't contain them."}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Zeyu Wang's work: ",(0,r.jsx)(n.a,{href:"https://dl.acm.org/doi/10.1145/3450626.3459819",children:"Paper"})," | ",(0,r.jsx)(n.a,{href:"https://github.com/zachzeyuwang/tracing-vs-freehand",children:"Dataset"})]}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://cloud.blender.org/p/gallery/5b642e25bf419c1042056fc6",children:"Blender Grease Pencil"})}),"\n",(0,r.jsxs)(n.li,{children:["... Tell me more in the ",(0,r.jsx)(n.a,{href:"https://github.com/ShenCiao/brush-rendering-tutorial/discussions/1",children:"discussion"}),"."]}),"\n"]})]})]})}function h(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},5632:(e,n,t)=>{t.d(n,{ij:()=>v,Sw:()=>b,rL:()=>j,PQ:()=>w});var r=t(7294),a=t(9477),o=t(5452),i=t(4866),s=t(5162),l=t(3764),c=t(5034),d=t(9279);const u="precision mediump float;\nprecision mediump int;\n\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\n\nin vec2 position0;\nin float radius0;\nin float summedLength0;\nin vec2 position1;\nin float radius1;\nin float summedLength1;\n\nout vec2 p; // position of the current pixel\nflat out vec2 p0;\nflat out float r0;\nflat out float l0;\nflat out vec2 p1;\nflat out float r1;\nflat out float l1;\n\nvoid main()\t{\n r0 = radius0;\n r1 = radius1;\n p0 = position0;\n p1 = position1;\n l0 = summedLength0;\n l1 = summedLength1;\n\n vec2 tangent = normalize(position1 - position0);\n vec2 normal = vec2(-tangent.y, tangent.x);\n float cosTheta = (r0 - r1)/distance(p0, p1);\n // the vertex1 with radius is fully inside the vertex0.\n if(abs(cosTheta) >= 1.0) return;\n\n // Each instance is a trapzoid, whose vertices' positions are determined here.\n // Use gl_VertexID {0, 1, 2, 3} to index and get the desired parameters.\n // Be careful with the backface culling! We are ignoring it here.\n vec2 offsetSign = vec2[](\n vec2(-1.0,-1.0),\n vec2(-1.0, 1.0),\n vec2( 1.0, 1.0),\n vec2( 1.0,-1.0)\n )[gl_VertexID];\n vec2 position = vec2[](position0, position0, position1, position1)[gl_VertexID];\n float radius = vec4(radius0, radius0, radius1, radius1)[gl_VertexID];\n\n float tanHalfTheta = sqrt((1.0+cosTheta) / (1.0-cosTheta));\n float cotHalfTheta = 1.0 / tanHalfTheta;\n float normalTanValue = vec4(tanHalfTheta, tanHalfTheta, cotHalfTheta, cotHalfTheta)[gl_VertexID];\n if(normalTanValue > 10.0 || normalTanValue < 0.1) return;\n\n vec2 trapzoidVertexPosition = position +\n offsetSign.x * radius * tangent +\n offsetSign.y * radius * normal * normalTanValue;\n p = trapzoidVertexPosition;\n\n gl_Position = projectionMatrix * modelViewMatrix * vec4(trapzoidVertexPosition, 0.0, 1.0);\n}\n",h="precision mediump float;\nprecision mediump int;\n\nin vec2 p;\nflat in vec2 p0;\nflat in float r0;\nflat in float l0;\nflat in vec2 p1;\nflat in float r1;\nflat in float l1;\n\n// Common\nuniform int type;\nconst int Vanilla = 0, Stamp = 1, Airbrush = 2;\nuniform vec4 color;\n// Stamp\nuniform mediump sampler2D footprint;\nuniform float stampIntervalRatio;\nuniform float noiseFactor;\nuniform float rotationFactor;\nfloat x2n(float x); // from distance to stamp index.\nfloat n2x(float n); // from stamp index to distance.\nmat2 rotate(float angle);\n// Airbrush\nuniform mediump sampler2D gradient;\nfloat sampleGraident(float distance){ return texture(gradient, vec2(distance, 0.0)).r; }\n\n// Noise helper functions from _The Book of Shader_.\nfloat random (in vec2 st);\nfloat noise (in vec2 st);\nfloat fbm (in vec2 st);\n\nout vec4 outColor;\n\nvoid main() {\n vec2 tangent = normalize(p1 - p0);\n vec2 normal = vec2(-tangent.y, tangent.x);\n\n // The local coordinate orgin at p0, x axis along the tangent direct.\n float len = distance(p1, p0);\n vec2 pLocal = vec2(dot(p-p0, tangent), dot(p-p0, normal));\n vec2 p0Local = vec2(0, 0);\n vec2 p1Local = vec2(len, 0);\n\n float cosTheta = (r0 - r1)/len;\n float d0 = distance(p, p0);\n float d0cos = pLocal.x / d0;\n float d1 = distance(p, p1);\n float d1cos = (pLocal.x - len) / d1;\n\n // Remove corners\n if(d0cos < cosTheta && d0 > r0) discard;\n if(d1cos > cosTheta && d1 > r1) discard;\n\n if(type == Vanilla){\n if(d0 < r0 && d1 < r1) discard;\n float A = (d0 < r0 || d1 < r1) ? 1.0 - sqrt(1.0 - color.a) : color.a;\n outColor = vec4(color.rgb, A);\n return;\n }\n\n if(type == Stamp){\n // The method here is not published yet, it should be explained in a 10min video.\n // The footprint is a disk instead of a square.\n // We set a quadratic polynomial to calculate the effect range, the range on polyline edge footprint can touch the current pixel.\n // Two roots of the quadratic polynomial are the effectRangeFront and effectRangeBack.\n // Formulas from SIGGRAPH 2022 Talk - A Fast & Robust Solution for Cubic & Higher-Order Polynomials\n float a, b, c, delta;\n a = 1.0 - pow(cosTheta, 2.0);\n b = 2.0 * (r0 * cosTheta - pLocal.x);\n c = pow(pLocal.x, 2.0) + pow(pLocal.y, 2.0) - pow(r0, 2.0);\n delta = pow(b, 2.0) - 4.0*a*c;\n if(delta <= 0.0) discard; // This should never happen.\n\n float tempMathBlock = b + sign(b) * sqrt(delta);\n float x1 = -2.0 * c / tempMathBlock;\n float x2 = -tempMathBlock / (2.0*a);\n float effectRangeFront = x1 <= x2 ? x1 : x2;\n float effectRangeBack = x1 > x2 ? x1 : x2;\n\n // We stamp on polyline every time the stamp index comes to an integer.\n float index0 = l0/stampIntervalRatio; // The stamp index of vertex0.\n float startIndex, endIndex;\n if (effectRangeFront <= 0.0){\n startIndex = ceil(index0);\n }\n else{\n startIndex = ceil(index0 + x2n(effectRangeFront));\n }\n float index1 = l1/stampIntervalRatio;\n float backIndex = x2n(effectRangeBack) + index0;\n endIndex = index1 < backIndex ? index1 : backIndex;\n if(startIndex > endIndex) discard;\n\n // The main loop to sample and blend color from the footprint.\n int MAX_i = 128; float currIndex = startIndex;\n float A = 0.0;\n for(int i = 0; i < MAX_i; i++){\n float currStampLocalX = n2x(currIndex - index0);\n // Apply roation and sample the footprint.\n vec2 pToCurrStamp = pLocal - vec2(currStampLocalX, 0.0);\n float currStampRadius = r0 - cosTheta * currStampLocalX;\n float angle = rotationFactor*radians(360.0*fract(sin(currIndex)*1.0));\n pToCurrStamp *= rotate(angle);\n vec2 textureCoordinate = (pToCurrStamp/currStampRadius + 1.0)/2.0;\n float opacity = texture(footprint, textureCoordinate).a;\n // Blend opacity.\n float opacityNoise = noiseFactor*fbm(textureCoordinate*50.0);\n opacity = clamp(opacity - opacityNoise, 0.0, 1.0) * color.a;\n A = A * (1.0-opacity) + opacity;\n\n currIndex += 1.0;\n if(currIndex > endIndex) break;\n }\n if(A < 1e-4) discard;\n outColor = vec4(color.rgb, A);\n return;\n }\n\n if(type == Airbrush){\n // The method here is not published yet. Shen is not fully satisfied with the current solution.\n float tanTheta = sqrt(1.0 - cosTheta*cosTheta)/cosTheta;\n float mid = pLocal.x - abs(pLocal.y)/tanTheta;\n float A = color.a;\n float transparency0 = d0 > r0 ? 1.0:sqrt(1.0 - A*sampleGraident(d0/r0));\n float transparency1 = d1 > r1 ? 1.0:sqrt(1.0 - A*sampleGraident(d1/r1));\n float transparency;\n\n // A bunch of math derived with the continuous form of airbrush here.\n if(mid <= 0.0){\n transparency = transparency0/transparency1;\n }\n if(mid > 0.0 && mid < len){\n float r = (mid * r1 + (len - mid) * r0)/len;\n float dr = distance(pLocal, vec2(mid, 0))/r;\n transparency = (1.0 - A*sampleGraident(dr))/transparency0/transparency1;\n }\n if(mid >= len){\n transparency = transparency1/transparency0;\n }\n\n outColor = vec4(color.rgb, 1.0 - transparency);\n }\n}\n\nfloat x2n(float x){\n float L = distance(p0, p1);\n if(r0 == r1) return x/(stampIntervalRatio*r0);\n else return -L / stampIntervalRatio / (r0 - r1) * log(1.0 - (1.0 - r1/r0)/L * x);\n}\n\nfloat n2x(float n){\n float L = distance(p0, p1);\n if(r0 == r1) return n * stampIntervalRatio * r0;\n else return L * (1.0-exp(-(r0-r1)*n*stampIntervalRatio/L)) / (1.0-r1/r0);\n}\n\n// Helper functions----------------------------------------------------------------------------------\nmat2 rotate(float angle){\n return mat2(cos(angle), -sin(angle), sin(angle), cos(angle));\n}\n\nfloat random (in vec2 st) {\n return fract(sin(dot(st.xy,\n vec2(12.9898,78.233)))*\n 43758.5453123);\n}\n\nfloat noise (in vec2 st) {\n vec2 i = floor(st);\n vec2 f = fract(st);\n\n // Four corners in 2D of a tile\n float a = random(i);\n float b = random(i + vec2(1.0, 0.0));\n float c = random(i + vec2(0.0, 1.0));\n float d = random(i + vec2(1.0, 1.0));\n\n vec2 u = f * f * (3.0 - 2.0 * f);\n\n return mix(a, b, u.x) +\n (c - a)* u.y * (1.0 - u.x) +\n (d - b) * u.x * u.y;\n}\n\n#define OCTAVES 6\nfloat fbm (in vec2 st) {\n // Initial values\n float value = 0.0;\n float amplitude = .5;\n float frequency = 0.;\n //\n // Loop of octaves\n for (int i = 0; i < OCTAVES; i++) {\n value += amplitude * noise(st);\n st *= 2.;\n amplitude *= .5;\n }\n return value;\n}\n";var p=t(9501),f=t(412),m=t(5893);let x=function(e){return e[e.Vanilla=0]="Vanilla",e[e.Stamp=1]="Stamp",e[e.Airbrush=2]="Airbrush",e}({});function v(e){let{uniforms:n=null,showEditor:t=null}=e;const p=(0,r.useRef)(),f=(0,r.useRef)(),v=(0,r.useRef)();function g(e,n,t){const r=[...n],o=[...n.slice(2)],i=[...t],s=[...t.slice(1)],l=[];let c=0;for(let h=0;h{const e=(1+Math.sqrt(5))/2,t=p.current.clientWidth,r=t*(.5/e),i=4*e,s=i*(.5/e),l=new a.iKG(i/-2,i/2,s/2,s/-2,-1e3,1e3);l.position.z=5;const c=new a.CP7({antialias:!0,alpha:!0,premultipliedAlpha:!1,powerPreference:"high-performance"});function m(){const n=p.current.clientWidth,t=.5*n/e;c.setSize(n,t)}c.setClearColor(new a.Ilk(1,1,1),0),c.setSize(t,r),window.addEventListener("resize",m),p.current.appendChild(c.domElement);const y=new a.xsS,w=new o.o(l,c.domElement);w.enableRotate=!1,w.enableDamping=!1,w.screenSpacePanning=!0,w.addEventListener("change",(()=>{c.render(y,l)})),f.current=()=>c.render(y,l),window.addEventListener("TextureLoaded",f.current);const b=new a.u9r;b.setIndex([0,1,2,2,3,0]);const j=new Function(d.Z),[I,T]=j();g(b,I,T);const S={type:{value:x.Vanilla},color:{value:[0,0,0,1]},footprint:{value:new a.xEZ},stampIntervalRatio:{value:1},noiseFactor:{value:0},rotationFactor:{value:0},gradient:{value:new a.IEO}},A=new a.FIo({uniforms:n||S,vertexShader:u,fragmentShader:h,side:a.ehD,transparent:!0,glslVersion:a.LSk});return v.current=new a.SPe(b,A,T.length-1),v.current.frustumCulled=!1,y.add(v.current),f.current(),()=>{c.dispose(),window.removeEventListener("resize",m),window.removeEventListener("TextureLoaded",f.current)}}),[]);const w=(0,r.useCallback)(((e,n)=>{let t=[],r=[];try{const n=new Function(e);[t,r]=n()}catch(o){return void console.log(o.toString())}function a(e){if(Array.isArray(e)){for(let n=0;n{y(e,"")}})}),T&&(0,m.jsx)(s.Z,{value:"fragment.glsl",children:(0,m.jsx)(c.r,{height:b,defaultValue:h,onChange:e=>{y("",e)}})})]})}),(0,m.jsx)("div",{ref:p,style:{width:"100%"},onMouseDown:e=>e.preventDefault()})]})}let g=new a.xEZ;f.Z.canUseDOM&&(g=(new a.dpR).load(`/${p.Z.projectName}/img/stamp2.png`,(e=>{window.dispatchEvent(new CustomEvent("TextureLoaded"))}),void 0,void 0));let y=new a.xEZ;f.Z.canUseDOM&&(y=(new a.dpR).load(`/${p.Z.projectName}/img/dot.png`,(e=>{window.dispatchEvent(new CustomEvent("TextureLoaded"))}),void 0,void 0));const w={type:{value:x.Stamp},color:{value:[0,0,0,1]},footprint:{value:g},stampIntervalRatio:{value:.4},noiseFactor:{value:1.2},rotationFactor:{value:.75}},b=(((e,n)=>{let t=new a.AXT(new a.FM8(0,1),e,n,new a.FM8(1,0));const r=256,o=new Uint8Array(1024),i=t.getPoints(512);for(let a=0;a=t.x&&e<=r.x){let n=(t.y*(r.x-e)+r.y*(e-t.x))/(r.x-t.x);o[4*a]=Math.floor(255*n)}}}const s=new a.IEO(o,r,1);s.needsUpdate=!0})(new a.FM8(.33,1),new a.FM8(.66,0)),x.Airbrush,{type:{value:x.Stamp},color:{value:[0,0,0,.5]},footprint:{value:y},stampIntervalRatio:{value:2},noiseFactor:{value:0},rotationFactor:{value:0}}),j={type:{value:x.Stamp},color:{value:[0,0,0,.5]},footprint:{value:y},stampIntervalRatio:{value:1},noiseFactor:{value:0},rotationFactor:{value:0}}}}]); \ No newline at end of file diff --git a/assets/js/bc662926.7a47c573.js b/assets/js/bc662926.7a47c573.js new file mode 100644 index 0000000..a71464d --- /dev/null +++ b/assets/js/bc662926.7a47c573.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkbrush_stroke_tutorial=self.webpackChunkbrush_stroke_tutorial||[]).push([[805],{7565:(s,e,a)=>{a.r(e),a.d(e,{assets:()=>A,contentTitle:()=>v,default:()=>w,frontMatter:()=>g,metadata:()=>u,toc:()=>N});var n=a(5893),i=a(1151),t=(a(7294),a(4896));const l="const maxRadius = 1/3;\nconst segmentCount = 32;\n\nconst position = [-4.0, -1.0, -2.0, 1.0, 2.0, 1.0, 4.0, -1.0];\nconst radius = [maxRadius, maxRadius, maxRadius, maxRadius];\n\nreturn [position, radius];\n",r="precision mediump float;\nprecision mediump int;\n\n// Take golbal const values like the `radius` here as uniforms. You can modify them freely.\nconst float radius = 1.0/2.0;\n\nuniform mat4 modelViewMatrix;\n// The `projectionMatrix` is a orthogonal projection matrix here, which is the default setting when rendering 2D stuff.\nuniform mat4 projectionMatrix;\n\n// The position of polyline vertices v_i and v_{i+1}\nin vec2 position0;\nin vec2 position1;\n\n// Output values to the fragment shader, `p` will be the current world position of a pixel. The others are shown in the diagram.\n// If you don't know about the `flat` qualifier here, you should jump right into the description below and come back later.\nout vec2 p;\nflat out vec2 p0;\nflat out vec2 p1;\nflat out float r;\n\nvoid main(){\n p0 = position0;\n p1 = position1;\n r = radius;\n\n vec2 tangent = normalize(p1 - p0);\n vec2 normal = vec2(-tangent.y, tangent.x);\n\n /* Each instance is a rectangle, whose vertices' positions are determined here.\n * The built-in variable `gl_VertexID` records the vertex index, whose value is one of the {0, 1, 2, 3}\n * We use `gl_VertexID` to index values we need for.\n * Here, 0 is the vertex on the lowerleft corner, 1 upperleft, 2 upperright, 3 lowerright\n */\n vec2 position = vec2[](p0, p0, p1, p1)[gl_VertexID];\n vec2 offsetSign = vec2[](\n vec2(-1.0, -1.0),\n vec2(-1.0, 1.0),\n vec2(1.0, 1.0),\n vec2(1.0, -1.0)\n )[gl_VertexID];\n\n vec2 vertexPosition = position +\n offsetSign.x * r * tangent +\n offsetSign.y * r * normal;\n\n // Output positions are interpolated by the graphics pipeline to give us the world poisition of a pixel in fragement shader.\n p = vertexPosition;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(p, 0.0, 1.0);\n}",c="precision mediump float;\nprecision mediump int;\n\nconst vec4 color = vec4(0.0, 0.0, 0.0, 1.0);\n\nout vec4 outColor;\n\nin vec2 p;\n// These variable are shown in the diagram\nflat in vec2 p0;\nflat in vec2 p1;\nflat in float r;\n\nvoid main() {\n vec2 tangent = normalize(p1 - p0);\n vec2 normal = vec2(-tangent.y, tangent.x);\n float len = distance(p1, p0);\n\n // Calculate the pixel position in the local coordinate shown in the diagram.\n vec2 pLocal = vec2(dot(p-p0, tangent), dot(p-p0, normal));\n\n float d0 = distance(p, p0);\n float d1 = distance(p, p1);\n\n // Remove corners\n if(pLocal.x < 0.0 && d0 > r) discard; // left corners\n if(pLocal.x > len && d1 > r) discard; // right corners\n\n outColor = color;\n}";function h(s){let{showEditor:e=[!1,!1,!1]}=s;return(0,n.jsx)(t.m,{geometry:l,vertexShader:r,fragmentShader:c,showEditor:e})}var m=a(9279);const d="precision mediump float;\nprecision mediump int;\n\n// Set alpha value to 0.5\nconst vec4 color = vec4(0.0, 0.0, 0.0, 0.5);\n\nout vec4 outColor;\n\nin vec2 p;\nflat in vec2 p0;\nflat in vec2 p1;\nflat in float r;\n\nvoid main() {\n vec2 tangent = normalize(p1 - p0);\n vec2 normal = vec2(-tangent.y, tangent.x);\n float len = distance(p1, p0);\n\n vec2 pLocal = vec2(dot(p-p0, tangent), dot(p-p0, normal));\n\n float d0 = distance(p, p0);\n float d1 = distance(p, p1);\n\n if(pLocal.x < 0.0 && d0 > r) discard;\n if(pLocal.x > len && d1 > r) discard;\n\n // ------------------------------------------------\n float A = color.a;\n // If pixel is inside one of the joint areas\n if (d0 < r || d1 < r) A = 1.0 - sqrt(1.0 - A);\n // If pixel is inside both joint areas, opacity is zero, discard it\n if (d0 < r && d1 < r) discard;\n\n outColor = vec4(color.rgb, A);\n}";function o(s){let{showEditor:e=[!1,!1,!1]}=s;return(0,n.jsx)(t.m,{geometry:m.Z,vertexShader:r,fragmentShader:d,showEditor:e})}const p="precision mediump float;\nprecision mediump int;\n\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\n\n// Radius values are given by geometry data\nin float radius0;\nin float radius1;\nin vec2 position0;\nin vec2 position1;\n\nout vec2 p;\nflat out vec2 p0;\nflat out vec2 p1;\n// Output radius\nflat out float r0;\nflat out float r1;\n\nvoid main(){\n p0 = position0;\n p1 = position1;\n r0 = radius0;\n r1 = radius1;\n\n float cosTheta = (r0 - r1)/distance(p0, p1);\n // Coner case: One circle is entirely inside the another, discard the edge.\n if(abs(cosTheta) >= 1.0) return;\n\n vec2 tangent = normalize(p1 - p0);\n vec2 normal = vec2(-tangent.y, tangent.x);\n\n vec2 offsetSign = vec2[](\n vec2(-1.0,-1.0),\n vec2(-1.0, 1.0),\n vec2( 1.0, 1.0),\n vec2( 1.0,-1.0)\n )[gl_VertexID];\n vec2 position = vec2[](position0, position0, position1, position1)[gl_VertexID];\n float radius = vec4(radius0, radius0, radius1, radius1)[gl_VertexID];\n\n // Apply the half angle formula from cos(theta) to tan(theta/2)\n float tanHalfTheta = sqrt((1.0+cosTheta) / (1.0-cosTheta));\n float cotHalfTheta = 1.0 / tanHalfTheta;\n float normalTanValue = vec4(tanHalfTheta, tanHalfTheta, cotHalfTheta, cotHalfTheta)[gl_VertexID];\n // Corner case: The small circle is very close to the big one, casuing large offset in the normal direction, discard the edge\n if(normalTanValue > 10.0 || normalTanValue < 0.1) return;\n\n vec2 trapzoidVertexPosition = position +\n offsetSign.x * radius * tangent +\n offsetSign.y * radius * normal * normalTanValue;\n p = trapzoidVertexPosition;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(p, 0.0, 1.0);\n}",x="precision mediump float;\nprecision mediump int;\n\nconst vec4 color = vec4(0.0, 0.0, 0.0, 1.0);\n\nout vec4 outColor;\n\nin vec2 p;\n\nflat in vec2 p0;\nflat in vec2 p1;\n// Radius values given by geometry, passed from the vertex shader\nflat in float r0;\nflat in float r1;\n\nvoid main() {\n vec2 tangent = normalize(p1 - p0);\n vec2 normal = vec2(-tangent.y, tangent.x);\n float len = distance(p1, p0);\n\n vec2 pLocal = vec2(dot(p-p0, tangent), dot(p-p0, normal));\n\n float d0 = distance(p, p0);\n float d1 = distance(p, p1);\n float d0cos = pLocal.x / d0; // cosine value of the angle between line(p0, p) and current edge\n float d1cos = (pLocal.x - len) / d1; // between line(p1, p) and current edge\n\n float cosTheta = (r0 - r1)/distance(p0, p1);\n\n // Discard corners\n if(d0cos < cosTheta && d0 > r0) discard;\n if(d1cos > cosTheta && d1 > r1) discard;\n\n // Deal with opactiy\n float A = color.a;\n if (d0 < r0 && d1 < r1) discard;\n if (d0 < r0 || d1 < r1) A = 1.0 - sqrt(1.0 - A);\n\n outColor = vec4(color.rgb, A);\n}";function j(s){let{showEditor:e=[!1,!1,!1]}=s;return(0,n.jsx)(t.m,{geometry:m.Z,vertexShader:p,fragmentShader:x,showEditor:e})}const g={sidebar_position:1},v=void 0,u={id:"Basics/Vanilla/Vanilla",title:"Vanilla",description:"Uni radius",source:"@site/docs/Basics/Vanilla/Vanilla.mdx",sourceDirName:"Basics/Vanilla",slug:"/Basics/Vanilla/",permalink:"/brush-rendering-tutorial/Basics/Vanilla/",draft:!1,unlisted:!1,editUrl:"https://github.com/ShenCiao/brush-rendering-tutorial/tree/main/docs/Basics/Vanilla/Vanilla.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Problem Statement",permalink:"/brush-rendering-tutorial/Basics/Basics/"},next:{title:"Stamp",permalink:"/brush-rendering-tutorial/Basics/Stamp/"}},A={},N=[{value:"Uni radius",id:"uni-radius",level:2},{value:"Geometry shader implementation is elegant",id:"geometry-shader-implementation-is-elegant",level:4},{value:"Opacity",id:"opacity",level:2},{value:"Variable radius",id:"variable-radius",level:2},{value:"Corner case",id:"corner-case",level:2}];function f(s){const e={a:"a",annotation:"annotation",code:"code",em:"em",h2:"h2",h4:"h4",img:"img",math:"math",mfrac:"mfrac",mi:"mi",mn:"mn",mo:"mo",mrow:"mrow",msqrt:"msqrt",msub:"msub",p:"p",path:"path",pre:"pre",semantics:"semantics",span:"span",strong:"strong",svg:"svg",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.a)(),...s.components},{Details:t}=e;return t||function(s,e){throw new Error("Expected "+(e?"component":"object")+" `"+s+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.h2,{id:"uni-radius",children:"Uni radius"}),"\n",(0,n.jsx)(e.p,{children:"Let's start with a solid stroke with a single radius value.\nLater, add variable radius to it."}),"\n","\n",(0,n.jsx)(h,{}),"\n",(0,n.jsxs)(e.p,{children:["We are given a polyline with a set of vertices.\nIn the diagram below, we select an edge with two consecutive vertices, labeled as ",(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsx)(e.mrow,{children:(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{children:"v"}),(0,n.jsx)(e.mi,{children:"i"})]})}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"v_i"})]})})}),(0,n.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.5806em",verticalAlign:"-0.15em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.03588em"},children:"v"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3117em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"-0.0359em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mathnormal mtight",children:"i"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,n.jsx)(e.span,{})})})]})})]})]})})]})," and ",(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsx)(e.mrow,{children:(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{children:"v"}),(0,n.jsxs)(e.mrow,{children:[(0,n.jsx)(e.mi,{children:"i"}),(0,n.jsx)(e.mo,{children:"+"}),(0,n.jsx)(e.mn,{children:"1"})]})]})}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"v_{i+1}"})]})})}),(0,n.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.6389em",verticalAlign:"-0.2083em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.03588em"},children:"v"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3117em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"-0.0359em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsxs)(e.span,{className:"mord mtight",children:[(0,n.jsx)(e.span,{className:"mord mathnormal mtight",children:"i"}),(0,n.jsx)(e.span,{className:"mbin mtight",children:"+"}),(0,n.jsx)(e.span,{className:"mord mtight",children:"1"})]})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.2083em"},children:(0,n.jsx)(e.span,{})})})]})})]})]})})]}),", then draw a capsule on it.\nIf we render every single edge like this, edges will connect to each other naturally, as shown on the right."]}),"\n",(0,n.jsxs)(e.table,{children:[(0,n.jsx)(e.thead,{children:(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.th,{style:{textAlign:"center"},children:(0,n.jsx)(e.img,{alt:"edge",src:a(2003).Z+"",width:"2560",height:"1080"})}),(0,n.jsx)(e.th,{style:{textAlign:"center"},children:(0,n.jsx)(e.img,{alt:"edge",src:a(9948).Z+"",width:"2560",height:"1080"})})]})}),(0,n.jsx)(e.tbody,{children:(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{style:{textAlign:"center"},children:(0,n.jsx)(e.em,{children:"Draw a capsule on an edge"})}),(0,n.jsx)(e.td,{style:{textAlign:"center"},children:(0,n.jsx)(e.em,{children:"Connected capsules"})})]})})]}),"\n",(0,n.jsxs)(e.p,{children:["The diagram quite looks like drawing an ",(0,n.jsx)(e.a,{href:"https://www.google.com/search?q=articulated+arm+2D+diagram&tbm=isch",children:"articulated arm"}),".\nTherefore, we call it ",(0,n.jsx)(e.strong,{children:"articulated"})," stroke (Line) rendering."]}),"\n",(0,n.jsx)(e.p,{children:"Hopefully, the above idea sounds straightforward to you.\nIt's also easy to implement with GPU APIs.\nTo draw the capsule, we generate four new vertices to invoke a rectangle, as shown in the left figure below.\nThen, discard the pixels in the four corners, as shown on the right. All is done!"}),"\n",(0,n.jsxs)(e.table,{children:[(0,n.jsx)(e.thead,{children:(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.th,{style:{textAlign:"center"},children:(0,n.jsx)(e.img,{alt:"quad",src:a(2621).Z+"",width:"2560",height:"1080"})}),(0,n.jsx)(e.th,{style:{textAlign:"center"},children:(0,n.jsx)(e.img,{alt:"quad",src:a(561).Z+"",width:"2560",height:"1080"})})]})}),(0,n.jsx)(e.tbody,{children:(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{style:{textAlign:"center"},children:"_Generate rectangle vertices _"}),(0,n.jsx)(e.td,{style:{textAlign:"center"},children:(0,n.jsx)(e.em,{children:"Discard corners"})})]})})]}),"\n",(0,n.jsx)(e.p,{children:"There are several possible ways to generate the rectangle vertices.\nThe most elegant one is to use a geometry shader.\nBut sadly, it's not supported on Apple's ecosystem and web platform, and many readers are not experienced in it.\nSo, I will mainly introduce another implementation with instanced rendering.\nBut if you're familiar with geometry shader, check out the dropdown tab below."}),"\n",(0,n.jsxs)(t,{children:[(0,n.jsx)("summary",{children:"Geometry shader implementation"}),(0,n.jsx)(e.p,{children:"Geometry shader is designed for transforming geometry.\nWe can write very elegant code on the CPU side, which feels like an OpenGL built-in stroke (line strip) rendering functionality."}),(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-cpp",children:"glUseProgram(brushStrokeProgram)\n/* set uniforms ... */\nglBindVertexArray(vao);\nglDrawArrays(GL_LINE_STRIP, ...);\n"})}),(0,n.jsx)(e.p,{children:"Pseudo code in the geometry shader:"}),(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-glsl",children:"layout(lines) in;\nlayout(triangle_strip, max_vertices = 4) out;\n\nvoid main(){\n /* Set the down left vertex variables */\n EmitVertex();\n /* Set the up left vertex variables */\n EmitVertex();\n /* Set the down right vertex variables */\n EmitVertex();\n /* Set the up right vertex variables */\n EmitVertex();\n}\n"})}),(0,n.jsx)(e.p,{children:"You will find the details in the upcoming description."}),(0,n.jsx)(e.h4,{id:"geometry-shader-implementation-is-elegant",children:"Geometry shader implementation is elegant"}),(0,n.jsxs)(e.p,{children:["The vertex array buffer object ",(0,n.jsx)(e.code,{children:"vao"})," is created like drawing a line strip.\nWe bind it and draw it as a line strip, then get a custom \"line strip\"!\nEvery line of the code is incredibly descriptive and self-explanatory.\nWhen mocking geometry shader's behavior with instanced rendering, the code gets obscure.\nSadly, graphics engineers cannot easily enjoy this elegance because of Apple's Metal API."]}),(0,n.jsx)(e.p,{children:"You may argue that geometry shader can cause a lot of performance issues.\nBut benefiting from hard work by GPU engineers and manufacturers,\nthe computational power is very much superfluous to draw 2D contents with a modern discrete graphics card.\nPerformance is not everything.\nWriting maintainable and easy-to-understand code is much more critical in some cases."})]}),"\n",(0,n.jsxs)(e.p,{children:["We use instanced rendering to draw a large number of objects with the same vertex data.\nFor drawing a stroke, each instance is the rectangle shown above, and the number of instances is the number of stroke's edges\n(number of polyline vertices minus one).\nTo place a rectangle, all rectangle's vertices need to know the positions of polyline vertices ",(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsx)(e.mrow,{children:(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{children:"p"}),(0,n.jsx)(e.mn,{children:"0"})]})}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"p_0"})]})})}),(0,n.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.625em",verticalAlign:"-0.1944em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathnormal",children:"p"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mtight",children:"0"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,n.jsx)(e.span,{})})})]})})]})]})})]})," and ",(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsx)(e.mrow,{children:(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{children:"p"}),(0,n.jsx)(e.mn,{children:"1"})]})}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"p_1"})]})})}),(0,n.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.625em",verticalAlign:"-0.1944em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathnormal",children:"p"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mtight",children:"1"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,n.jsx)(e.span,{})})})]})})]})]})})]})," and radius value ",(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsx)(e.mrow,{children:(0,n.jsx)(e.mi,{children:"r"})}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"r"})]})})}),(0,n.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.4306em"}}),(0,n.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.02778em"},children:"r"})]})})]}),".\nWe will set a local coordinate in the shader program, origin at ",(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsx)(e.mrow,{children:(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{children:"p"}),(0,n.jsx)(e.mn,{children:"0"})]})}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"p_0"})]})})}),(0,n.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.625em",verticalAlign:"-0.1944em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathnormal",children:"p"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mtight",children:"0"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,n.jsx)(e.span,{})})})]})})]})]})})]}),", X and Y axes align to the tangent and normal direction:\n",(0,n.jsx)(e.img,{alt:"coo",src:a(9367).Z+"",width:"2560",height:"1080"})]}),"\n",(0,n.jsx)(e.p,{children:'You will find implementation details in the comments of the shader code below.\nThe "vertex.glsl" for the vertex shader and "fragment.glsl" for the fragment shader, feel free to change them:'}),"\n",(0,n.jsx)(h,{showEditor:[!1,!0,!0]}),"\n",(0,n.jsxs)(t,{children:[(0,n.jsx)("summary",{children:(0,n.jsxs)(e.p,{children:["In case you don't know the ",(0,n.jsx)(e.code,{children:"flat"})," qualifier"]})}),(0,n.jsxs)(e.p,{children:["Shader variables are interpolated by default when passing to a fragment shader.\nThe ",(0,n.jsx)(e.code,{children:"flat"})," qualifier tells your shader program no to interpolate the variable.\nIf you still need clarifications, check out this ",(0,n.jsx)(e.a,{href:"https://www.geeks3d.com/20130514/opengl-interpolation-qualifiers-glsl-tutorial/",children:"article"}),"."]})]}),"\n",(0,n.jsx)(e.h2,{id:"opacity",children:"Opacity"}),"\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.img,{alt:"trans",src:a(7139).Z+"",width:"958",height:"296"})}),"\n",(0,n.jsxs)(e.p,{children:["Obviously, we are not dealing with transparency correctly in image above.\nYou can replicate it by setting the ",(0,n.jsx)(e.code,{children:"color"})," variable in the fragment shader above as ",(0,n.jsx)(e.code,{children:"const vec4 color = vec4(0.0, 0.0, 0.0, 0.5);"}),".\nThe areas where two edges connect are doubly colored.\nWe need to fix it."]}),"\n",(0,n.jsx)(e.p,{children:'For clarification, we define "joint" areas in the two circles at the start and end of the capsule,\nand the non-joint area is called "bone" area.'}),"\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.img,{alt:"joint",src:a(2625).Z+"",width:"2560",height:"1080"})}),"\n",(0,n.jsxs)(e.p,{children:["Joint areas are doubly colored.\nWe need to adjust joints' pixels opacity (alpha value) to get the target opacity of bone.\nLabel joint alpha ",(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsx)(e.mrow,{children:(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{mathvariant:"normal",children:"A"}),(0,n.jsx)(e.mi,{children:"j"})]})}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"\\Alpha_j"})]})})}),(0,n.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.9694em",verticalAlign:"-0.2861em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathrm",children:"A"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3117em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mathnormal mtight",style:{marginRight:"0.05724em"},children:"j"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.2861em"},children:(0,n.jsx)(e.span,{})})})]})})]})]})})]})," and bone alpha ",(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsx)(e.mrow,{children:(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{mathvariant:"normal",children:"A"}),(0,n.jsx)(e.mi,{children:"b"})]})}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"\\Alpha_b"})]})})}),(0,n.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.8333em",verticalAlign:"-0.15em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathrm",children:"A"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3361em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mathnormal mtight",children:"b"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,n.jsx)(e.span,{})})})]})})]})]})})]}),".\nSince rgb values from previous and next edge are the same, we can apply alpha compositing formula:\n",(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsxs)(e.mrow,{children:[(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{mathvariant:"normal",children:"A"}),(0,n.jsx)(e.mi,{children:"b"})]}),(0,n.jsx)(e.mo,{children:"="}),(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{mathvariant:"normal",children:"A"}),(0,n.jsx)(e.mi,{children:"j"})]}),(0,n.jsx)(e.mo,{children:"+"}),(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{mathvariant:"normal",children:"A"}),(0,n.jsx)(e.mi,{children:"j"})]}),(0,n.jsx)(e.mo,{children:"\u2217"}),(0,n.jsx)(e.mo,{stretchy:"false",children:"("}),(0,n.jsx)(e.mn,{children:"1"}),(0,n.jsx)(e.mo,{children:"\u2212"}),(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{mathvariant:"normal",children:"A"}),(0,n.jsx)(e.mi,{children:"j"})]}),(0,n.jsx)(e.mo,{stretchy:"false",children:")"})]}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"\\Alpha_b = \\Alpha_j + \\Alpha_j * (1 - \\Alpha_j)"})]})})}),(0,n.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.8333em",verticalAlign:"-0.15em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathrm",children:"A"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3361em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mathnormal mtight",children:"b"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,n.jsx)(e.span,{})})})]})})]}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,n.jsx)(e.span,{className:"mrel",children:"="}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.9694em",verticalAlign:"-0.2861em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathrm",children:"A"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3117em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mathnormal mtight",style:{marginRight:"0.05724em"},children:"j"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.2861em"},children:(0,n.jsx)(e.span,{})})})]})})]}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,n.jsx)(e.span,{className:"mbin",children:"+"}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}})]}),(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.9694em",verticalAlign:"-0.2861em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathrm",children:"A"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3117em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mathnormal mtight",style:{marginRight:"0.05724em"},children:"j"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.2861em"},children:(0,n.jsx)(e.span,{})})})]})})]}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,n.jsx)(e.span,{className:"mbin",children:"\u2217"}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}})]}),(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,n.jsx)(e.span,{className:"mopen",children:"("}),(0,n.jsx)(e.span,{className:"mord",children:"1"}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,n.jsx)(e.span,{className:"mbin",children:"\u2212"}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}})]}),(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"1.0361em",verticalAlign:"-0.2861em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathrm",children:"A"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3117em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mathnormal mtight",style:{marginRight:"0.05724em"},children:"j"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.2861em"},children:(0,n.jsx)(e.span,{})})})]})})]}),(0,n.jsx)(e.span,{className:"mclose",children:")"})]})]})]}),", and solve and joint opacity"]}),"\n",(0,n.jsx)(e.span,{className:"katex-display",children:(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsxs)(e.mrow,{children:[(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{mathvariant:"normal",children:"A"}),(0,n.jsx)(e.mi,{children:"j"})]}),(0,n.jsx)(e.mo,{children:"="}),(0,n.jsx)(e.mn,{children:"1"}),(0,n.jsx)(e.mo,{children:"\u2212"}),(0,n.jsx)(e.msqrt,{children:(0,n.jsxs)(e.mrow,{children:[(0,n.jsx)(e.mn,{children:"1"}),(0,n.jsx)(e.mo,{children:"\u2212"}),(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{mathvariant:"normal",children:"A"}),(0,n.jsx)(e.mi,{children:"b"})]})]})})]}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"\\Alpha_j = 1 - \\sqrt{1 - \\Alpha_b}"})]})})}),(0,n.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.9694em",verticalAlign:"-0.2861em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathrm",children:"A"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3117em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mathnormal mtight",style:{marginRight:"0.05724em"},children:"j"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.2861em"},children:(0,n.jsx)(e.span,{})})})]})})]}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,n.jsx)(e.span,{className:"mrel",children:"="}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.7278em",verticalAlign:"-0.0833em"}}),(0,n.jsx)(e.span,{className:"mord",children:"1"}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,n.jsx)(e.span,{className:"mbin",children:"\u2212"}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}})]}),(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"1.24em",verticalAlign:"-0.2395em"}}),(0,n.jsx)(e.span,{className:"mord sqrt",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsxs)(e.span,{className:"vlist",style:{height:"1.0005em"},children:[(0,n.jsxs)(e.span,{className:"svg-align",style:{top:"-3.2em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"3.2em"}}),(0,n.jsxs)(e.span,{className:"mord",style:{paddingLeft:"1em"},children:[(0,n.jsx)(e.span,{className:"mord",children:"1"}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,n.jsx)(e.span,{className:"mbin",children:"\u2212"}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathrm",children:"A"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3361em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mathnormal mtight",children:"b"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,n.jsx)(e.span,{})})})]})})]})]})]}),(0,n.jsxs)(e.span,{style:{top:"-2.9605em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"3.2em"}}),(0,n.jsx)(e.span,{className:"hide-tail",style:{minWidth:"1.02em",height:"1.28em"},children:(0,n.jsx)(e.svg,{xmlns:"http://www.w3.org/2000/svg",width:"400em",height:"1.28em",viewBox:"0 0 400000 1296",preserveAspectRatio:"xMinYMin slice",children:(0,n.jsx)(e.path,{d:"M263,681c0.7,0,18,39.7,52,119\nc34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120\nc340,-704.7,510.7,-1060.3,512,-1067\nl0 -0\nc4.7,-7.3,11,-11,19,-11\nH40000v40H1012.3\ns-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232\nc-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1\ns-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26\nc-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z\nM1001 80h400000v40h-400000z"})})})]})]}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.2395em"},children:(0,n.jsx)(e.span,{})})})]})})]})]})]})}),"\n",(0,n.jsx)(e.p,{children:"Let's see how to implement it:"}),"\n",(0,n.jsxs)(t,{children:[(0,n.jsx)("summary",{children:"About alpha compositing"}),(0,n.jsxs)(e.p,{children:["I've seen very experienced graphics engineers unfamiliar with alpha compositing.\nI would recommend two articles ",(0,n.jsx)(e.a,{href:"https://ciechanow.ski/alpha-compositing/",children:"1"})," and ",(0,n.jsx)(e.a,{href:"https://wiki.edunitas.com/IT/en/114-10/alpha-channels_400_eduNitas.html",children:"2"}),".\nThe topic is so important for 2D rendering that I will write a dedicated article to explain when introducing the airbrush."]})]}),"\n","\n",(0,n.jsx)(o,{showEditor:[!1,!1,!0]}),"\n",(0,n.jsx)(e.h2,{id:"variable-radius",children:"Variable radius"}),"\n",(0,n.jsx)(e.p,{children:"We are given a polyline with a radius value at each point to represent the variable radius stroke.\nThe rendering process is basically the same as uni-radius stroke:\nPlace four new vertices and discard the four corners, as shown in the figure below."}),"\n",(0,n.jsxs)(e.table,{children:[(0,n.jsx)(e.thead,{children:(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.th,{style:{textAlign:"center"},children:(0,n.jsx)(e.img,{alt:"edge",src:a(9289).Z+"",width:"2560",height:"1080"})}),(0,n.jsx)(e.th,{style:{textAlign:"center"},children:(0,n.jsx)(e.img,{alt:"edge",src:a(8533).Z+"",width:"2560",height:"1080"})})]})}),(0,n.jsx)(e.tbody,{children:(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{style:{textAlign:"center"},children:(0,n.jsx)(e.em,{children:"An edge"})}),(0,n.jsx)(e.td,{style:{textAlign:"center"},children:(0,n.jsx)(e.em,{children:"Connected edges"})})]})})]}),"\n",(0,n.jsxs)(e.p,{children:["The new vertices form a trapezoid rather than a rectangle to cover the whole capsule.\nWe need to solve a few extra geometric parameters in this trapezoid.\nFirst solve the angle ",(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsx)(e.mrow,{children:(0,n.jsx)(e.mi,{children:"\u03b8"})}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"\\theta"})]})})}),(0,n.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.6944em"}}),(0,n.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.02778em"},children:"\u03b8"})]})})]})," in the diagrams.\nAs the figure below shows, draw a perpendicular from ",(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsx)(e.mrow,{children:(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{children:"p"}),(0,n.jsx)(e.mn,{children:"1"})]})}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"p_1"})]})})}),(0,n.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.625em",verticalAlign:"-0.1944em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathnormal",children:"p"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mtight",children:"1"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,n.jsx)(e.span,{})})})]})})]})]})})]})," to the radius at ",(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsx)(e.mrow,{children:(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{children:"p"}),(0,n.jsx)(e.mn,{children:"0"})]})}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"p_0"})]})})}),(0,n.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.625em",verticalAlign:"-0.1944em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathnormal",children:"p"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mtight",children:"0"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,n.jsx)(e.span,{})})})]})})]})]})})]}),".\nThe distance between ",(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsx)(e.mrow,{children:(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{children:"p"}),(0,n.jsx)(e.mn,{children:"0"})]})}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"p_0"})]})})}),(0,n.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.625em",verticalAlign:"-0.1944em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathnormal",children:"p"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mtight",children:"0"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,n.jsx)(e.span,{})})})]})})]})]})})]})," and ",(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsx)(e.mrow,{children:(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{children:"p"}),(0,n.jsx)(e.mn,{children:"1"})]})}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"p_1"})]})})}),(0,n.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.625em",verticalAlign:"-0.1944em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathnormal",children:"p"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mtight",children:"1"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,n.jsx)(e.span,{})})})]})})]})]})})]})," is known."]}),"\n",(0,n.jsx)(e.span,{className:"katex-display",children:(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsxs)(e.mrow,{children:[(0,n.jsx)(e.mi,{children:"cos"}),(0,n.jsx)(e.mo,{children:"\u2061"}),(0,n.jsx)(e.mi,{children:"\u03b8"}),(0,n.jsx)(e.mo,{children:"="}),(0,n.jsxs)(e.mfrac,{children:[(0,n.jsxs)(e.mrow,{children:[(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{children:"r"}),(0,n.jsx)(e.mn,{children:"0"})]}),(0,n.jsx)(e.mo,{children:"\u2212"}),(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{children:"r"}),(0,n.jsx)(e.mn,{children:"1"})]})]}),(0,n.jsxs)(e.mrow,{children:[(0,n.jsx)(e.mi,{mathvariant:"normal",children:"\u2223"}),(0,n.jsx)(e.mi,{mathvariant:"normal",children:"\u2223"}),(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{children:"p"}),(0,n.jsx)(e.mn,{children:"0"})]}),(0,n.jsx)(e.mo,{children:"\u2212"}),(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{children:"p"}),(0,n.jsx)(e.mn,{children:"1"})]}),(0,n.jsx)(e.mi,{mathvariant:"normal",children:"\u2223"}),(0,n.jsx)(e.mi,{mathvariant:"normal",children:"\u2223"})]})]})]}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"\\cos\\theta = \\frac{r_0 - r_1}{||p_0 - p_1||}"})]})})}),(0,n.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.6944em"}}),(0,n.jsx)(e.span,{className:"mop",children:"cos"}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.1667em"}}),(0,n.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.02778em"},children:"\u03b8"}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,n.jsx)(e.span,{className:"mrel",children:"="}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"2.1963em",verticalAlign:"-0.936em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mopen nulldelimiter"}),(0,n.jsx)(e.span,{className:"mfrac",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsxs)(e.span,{className:"vlist",style:{height:"1.2603em"},children:[(0,n.jsxs)(e.span,{style:{top:"-2.314em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord",children:"\u2223\u2223"}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathnormal",children:"p"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mtight",children:"0"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,n.jsx)(e.span,{})})})]})})]}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,n.jsx)(e.span,{className:"mbin",children:"\u2212"}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathnormal",children:"p"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mtight",children:"1"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,n.jsx)(e.span,{})})})]})})]}),(0,n.jsx)(e.span,{className:"mord",children:"\u2223\u2223"})]})]}),(0,n.jsxs)(e.span,{style:{top:"-3.23em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,n.jsx)(e.span,{className:"frac-line",style:{borderBottomWidth:"0.04em"}})]}),(0,n.jsxs)(e.span,{style:{top:"-3.677em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.02778em"},children:"r"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"-0.0278em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mtight",children:"0"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,n.jsx)(e.span,{})})})]})})]}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,n.jsx)(e.span,{className:"mbin",children:"\u2212"}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.02778em"},children:"r"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"-0.0278em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mtight",children:"1"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,n.jsx)(e.span,{})})})]})})]})]})]})]}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.936em"},children:(0,n.jsx)(e.span,{})})})]})}),(0,n.jsx)(e.span,{className:"mclose nulldelimiter"})]})]})]})]})}),"\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.img,{alt:"theta",src:a(8917).Z+"",width:"2560",height:"1080"})}),"\n",(0,n.jsx)(e.p,{children:"The line between trapezoid corners and polyline points are bisectors, drawn in solid black line,\nso the corners' offset along the normal direction can be calculated.\nYou can easily know the parameters in the lower half part with symmetry."}),"\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.img,{alt:"para",src:a(1642).Z+"",width:"2560",height:"1080"})}),"\n",(0,n.jsx)(e.p,{children:"Shader code implementation:"}),"\n","\n","\n",(0,n.jsx)(j,{showEditor:[!1,!0,!0]}),"\n",(0,n.jsx)(e.h2,{id:"corner-case",children:"Corner case"}),"\n",(0,n.jsx)(e.p,{children:"In the vertex shader, we discard edges in the two corner conditions.\nBut in fact, they represent one corner case, as shown in the figures below."}),"\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.img,{alt:"near",src:a(9528).Z+"",width:"2560",height:"1080"})}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-glsl",children:"// Corner case: The small circle is very close to the big one, casuing large offset in the normal direction, discard the edge\n if(normalTanValue > 10.0 || normalTanValue < 0.1) return;\n"})}),"\n",(0,n.jsxs)(e.p,{children:["When the small circle is very close to the big one, we get a large ",(0,n.jsx)(e.code,{children:"normalTanValue"})," value and invoked triangles will cover large areas of pixels,\nIt can hurt the performance badly."]}),"\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.img,{alt:"inside",src:a(8058).Z+"",width:"2560",height:"1080"})}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-glsl",children:"// Coner case: One circle is entirely inside the another, discard the edge.\n if(abs(cosTheta) >= 1.0) return;\n"})}),"\n",(0,n.jsx)(e.p,{children:"When the small circle gets closer and entirely inside the big one, how to place vertices is undefined."}),"\n",(0,n.jsxs)(e.p,{children:["The two ",(0,n.jsx)(e.code,{children:"if"})," conditions happened in the same situation: the radius changes drastically in a short distance between points.\nIt rarely happens for the geometry data comes from a 2D canvas.\nModern tablets are stable enough to avoid generating this ill data.\nBut it is common in 3D, I will introduce the solution together with 3D stroke rendering."]})]})}function w(s={}){const{wrapper:e}={...(0,i.a)(),...s.components};return e?(0,n.jsx)(e,{...s,children:(0,n.jsx)(f,{...s})}):f(s)}},4896:(s,e,a)=>{a.d(e,{m:()=>p});var n=a(7294),i=a(9477),t=a(5452),l=a(4866),r=a(5162),c=a(3764),h=a(5034),m=a(412),d=a(9501),o=a(5893);function p(s){let{geometry:e,vertexShader:a,fragmentShader:p,showEditor:x=null}=s;const j=(0,n.useRef)(),g=(0,n.useRef)(),v=(0,n.useRef)(),u=(0,n.useRef)();function A(s,e,a){const n=[...e],t=[...e.slice(2)],l=[...a],r=[...a.slice(1)],c=[];let h=0;for(let o=0;o{const s=(1+Math.sqrt(5))/2,n=j.current.clientWidth,l=n*(.5/s),r=6*s,c=r*(.5/s),h=new i.iKG(r/-2,r/2,c/2,c/-2,-1e3,1e3);h.position.z=5;const o=new i.CP7({preserveDrawingBuffer:!0,powerPreference:"high-performance",antialias:!0,alpha:!0,premultipliedAlpha:!1});function x(){const e=j.current.clientWidth,a=.5*e/s;o.setSize(e,a)}o.setClearColor(new i.Ilk(1,1,1),0),o.setSize(n,l),u.current=o,window.addEventListener("resize",x),j.current.appendChild(o.domElement);const N=new i.xsS,f=new t.o(h,o.domElement);f.enableRotate=!1,f.enableDamping=!1,f.screenSpacePanning=!0,f.addEventListener("change",(()=>{o.render(N,h)})),g.current=()=>o.render(N,h),window.addEventListener("TextureLoaded",g.current);let w=new i.u9r;if("string"==typeof e){const s=[0,1,2,2,3,0];w.setIndex(s);const a=new Function(e),[n,i]=a();A(w,n,i)}else{if(!(e instanceof i.u9r))return void console.error("Unrecognized geometry input: "+typeof e);w=e}let y=new i.xEZ;m.Z.canUseDOM&&(y=(new i.dpR).load(`/${d.Z.projectName}/img/stamp86.png`,(s=>{window.dispatchEvent(new CustomEvent("TextureLoaded"))}),void 0,void 0));const b={footprint:{value:y}},L=new i.FIo({vertexShader:a,fragmentShader:p,side:i.ehD,transparent:!0,glslVersion:i.LSk,uniforms:b});return v.current=new i.SPe(w,L,w.getAttribute("position0").count-1),v.current.frustumCulled=!1,N.add(v.current),g.current(),()=>{o.dispose(),window.removeEventListener("resize",x),window.removeEventListener("TextureLoaded",g.current)}}),[]);const f=(0,n.useCallback)(((s,e)=>{let a=[],n=[];try{const e=new Function(s);[a,n]=e()}catch(t){return void console.log(t.toString())}function i(s){if(Array.isArray(s)){for(let e=0;e{N(s,"")}})}),L&&(0,o.jsx)(r.Z,{value:"fragment.glsl",children:(0,o.jsx)(h.r,{height:w,defaultValue:p,onChange:s=>{N("",s)}})})]})}),(0,o.jsx)("div",{ref:j,style:{width:"100%"},onMouseDown:s=>{s.preventDefault(),2==s.button&&console.log(u.current.domElement.toDataURL())}})]})}},9367:(s,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/coordinate-68714349e3013c769921a0eb25796188.png"},7139:(s,e,a)=>{a.d(e,{Z:()=>n});const n="data:image/png;base64,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"},2003:(s,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/uni-capsule-2431a7ac5ef2ad09ed6f95c0bdc851cc.png"},9948:(s,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/uni-connect-154f70dedb0fdc2925c947b72c9b5e63.png"},2625:(s,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/uni-joint-4a2efa37d7b523b21cea374679424637.png"},561:(s,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/uni-quad-capsule-b5f5c7122375176a3a612ac132814fe5.png"},2621:(s,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/uni-quad-faf9f304af7d8eb2aa3e3f4b48fe0a24.png"},9289:(s,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/var-capsule-1a4d1542500b2b4bc675225002014fb5.png"},8533:(s,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/var-connect-7370fb26c99bcde2bd3a2a2472e1762e.png"},8058:(s,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/var-inside-3f14e22e18826517a08aefef56ca7b68.png"},9528:(s,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/var-near-ee8cdfc7cab5636a8382e54837f25a35.png"},1642:(s,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/var-parameters-9d4c6d7aa31d0f61fd39ba9f69eaae6d.png"},8917:(s,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/var-theta-12b21c91e67f9f33e901ae6d7435f111.png"}}]); \ No newline at end of file diff --git a/assets/js/bc662926.e139a372.js b/assets/js/bc662926.e139a372.js deleted file mode 100644 index e84e9ce..0000000 --- a/assets/js/bc662926.e139a372.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkbrush_stroke_tutorial=self.webpackChunkbrush_stroke_tutorial||[]).push([[805],{7565:(s,e,a)=>{a.r(e),a.d(e,{assets:()=>A,contentTitle:()=>v,default:()=>w,frontMatter:()=>g,metadata:()=>u,toc:()=>N});var n=a(5893),i=a(1151),t=(a(7294),a(4896));const l="const maxRadius = 1/3;\nconst segmentCount = 32;\n\nconst position = [-4.0, -1.0, -2.0, 1.0, 2.0, 1.0, 4.0, -1.0];\nconst radius = [maxRadius, maxRadius, maxRadius, maxRadius];\n\nreturn [position, radius];\n",r="precision mediump float;\nprecision mediump int;\n\n// Take golbal const values like the `radius` here as uniforms. You can modify them freely.\nconst float radius = 1.0/2.0;\n\nuniform mat4 modelViewMatrix;\n// The `projectionMatrix` is a orthogonal projection matrix here, which is the default setting when rendering 2D stuff.\nuniform mat4 projectionMatrix;\n\n// The position of polyline vertices v_i and v_{i+1}\nin vec2 position0;\nin vec2 position1;\n\n// Output values to the fragment shader, `p` will be the current world position of a pixel. The others are shown in the diagram.\n// If you don't know about the `flat` qualifier here, you should jump right into the description below and come back later.\nout vec2 p;\nflat out vec2 p0;\nflat out vec2 p1;\nflat out float r;\n\nvoid main(){\n p0 = position0;\n p1 = position1;\n r = radius;\n\n vec2 tangent = normalize(p1 - p0);\n vec2 normal = vec2(-tangent.y, tangent.x);\n\n /* Each instance is a rectangle, whose vertices' positions are determined here.\n * The built-in variable `gl_VertexID` records the vertex index, whose value is one of the {0, 1, 2, 3}\n * We use `gl_VertexID` to index values we need for.\n * Here, 0 is the vertex on the lowerleft corner, 1 upperleft, 2 upperright, 3 lowerright\n */\n vec2 position = vec2[](p0, p0, p1, p1)[gl_VertexID];\n vec2 offsetSign = vec2[](\n vec2(-1.0, -1.0),\n vec2(-1.0, 1.0),\n vec2(1.0, 1.0),\n vec2(1.0, -1.0)\n )[gl_VertexID];\n\n vec2 vertexPosition = position +\n offsetSign.x * r * tangent +\n offsetSign.y * r * normal;\n\n // Output positions are interpolated by the graphics pipeline to give us the world poisition of a pixel in fragement shader.\n p = vertexPosition;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(p, 0.0, 1.0);\n}",c="precision mediump float;\nprecision mediump int;\n\nconst vec4 color = vec4(0.0, 0.0, 0.0, 1.0);\n\nout vec4 outColor;\n\nin vec2 p;\n// These variable are shown in the diagram\nflat in vec2 p0;\nflat in vec2 p1;\nflat in float r;\n\nvoid main() {\n vec2 tangent = normalize(p1 - p0);\n vec2 normal = vec2(-tangent.y, tangent.x);\n float len = distance(p1, p0);\n\n // Calculate the pixel position in the local coordinate shown in the diagram.\n vec2 pLocal = vec2(dot(p-p0, tangent), dot(p-p0, normal));\n\n float d0 = distance(p, p0);\n float d1 = distance(p, p1);\n\n // Remove corners\n if(pLocal.x < 0.0 && d0 > r) discard; // left corners\n if(pLocal.x > len && d1 > r) discard; // right corners\n\n outColor = color;\n}";function h(s){let{showEditor:e=[!1,!1,!1]}=s;return(0,n.jsx)(t.m,{geometry:l,vertexShader:r,fragmentShader:c,showEditor:e})}var m=a(9279);const d="precision mediump float;\nprecision mediump int;\n\n// Set alpha value to 0.5\nconst vec4 color = vec4(0.0, 0.0, 0.0, 0.5);\n\nout vec4 outColor;\n\nin vec2 p;\nflat in vec2 p0;\nflat in vec2 p1;\nflat in float r;\n\nvoid main() {\n vec2 tangent = normalize(p1 - p0);\n vec2 normal = vec2(-tangent.y, tangent.x);\n float len = distance(p1, p0);\n\n vec2 pLocal = vec2(dot(p-p0, tangent), dot(p-p0, normal));\n\n float d0 = distance(p, p0);\n float d1 = distance(p, p1);\n\n if(pLocal.x < 0.0 && d0 > r) discard;\n if(pLocal.x > len && d1 > r) discard;\n\n // ------------------------------------------------\n float A = color.a;\n // If pixel is inside one of the joint areas\n if (d0 < r || d1 < r) A = 1.0 - sqrt(1.0 - A);\n // If pixel is inside both joint areas, opacity is zero, discard it\n if (d0 < r && d1 < r) discard;\n\n outColor = vec4(color.rgb, A);\n}";function o(s){let{showEditor:e=[!1,!1,!1]}=s;return(0,n.jsx)(t.m,{geometry:m.Z,vertexShader:r,fragmentShader:d,showEditor:e})}const p="precision mediump float;\nprecision mediump int;\n\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\n\n// Radius values are given by geometry data\nin float radius0;\nin float radius1;\nin vec2 position0;\nin vec2 position1;\n\nout vec2 p;\nflat out vec2 p0;\nflat out vec2 p1;\n// Output radius\nflat out float r0;\nflat out float r1;\n\nvoid main(){\n p0 = position0;\n p1 = position1;\n r0 = radius0;\n r1 = radius1;\n\n float cosTheta = (r0 - r1)/distance(p0, p1);\n // Coner case: One circle is entirely inside the another, discard the edge.\n if(abs(cosTheta) >= 1.0) return;\n\n vec2 tangent = normalize(p1 - p0);\n vec2 normal = vec2(-tangent.y, tangent.x);\n\n vec2 offsetSign = vec2[](\n vec2(-1.0,-1.0),\n vec2(-1.0, 1.0),\n vec2( 1.0, 1.0),\n vec2( 1.0,-1.0)\n )[gl_VertexID];\n vec2 position = vec2[](position0, position0, position1, position1)[gl_VertexID];\n float radius = vec4(radius0, radius0, radius1, radius1)[gl_VertexID];\n\n // Apply the half angle formula from cos(theta) to tan(theta/2)\n float tanHalfTheta = sqrt((1.0+cosTheta) / (1.0-cosTheta));\n float cotHalfTheta = 1.0 / tanHalfTheta;\n float normalTanValue = vec4(tanHalfTheta, tanHalfTheta, cotHalfTheta, cotHalfTheta)[gl_VertexID];\n // Corner case: The small circle is very close to the big one, casuing large offset in the normal direction, discard the edge\n if(normalTanValue > 10.0 || normalTanValue < 0.1) return;\n\n vec2 trapzoidVertexPosition = position +\n offsetSign.x * radius * tangent +\n offsetSign.y * radius * normal * normalTanValue;\n p = trapzoidVertexPosition;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(p, 0.0, 1.0);\n}",x="precision mediump float;\nprecision mediump int;\n\nconst vec4 color = vec4(0.0, 0.0, 0.0, 1.0);\n\nout vec4 outColor;\n\nin vec2 p;\n\nflat in vec2 p0;\nflat in vec2 p1;\n// Radius values given by geometry, passed from the vertex shader\nflat in float r0;\nflat in float r1;\n\nvoid main() {\n vec2 tangent = normalize(p1 - p0);\n vec2 normal = vec2(-tangent.y, tangent.x);\n float len = distance(p1, p0);\n\n vec2 pLocal = vec2(dot(p-p0, tangent), dot(p-p0, normal));\n\n float d0 = distance(p, p0);\n float d1 = distance(p, p1);\n float d0cos = pLocal.x / d0; // cosine value of the angle between line(p0, p) and current edge\n float d1cos = (pLocal.x - len) / d1; // between line(p1, p) and current edge\n\n float cosTheta = (r0 - r1)/distance(p0, p1);\n\n // Discard corners\n if(d0cos < cosTheta && d0 > r0) discard;\n if(d1cos > cosTheta && d1 > r1) discard;\n\n // Deal with opactiy\n float A = color.a;\n if (d0 < r0 && d1 < r1) discard;\n if (d0 < r0 || d1 < r1) A = 1.0 - sqrt(1.0 - A);\n\n outColor = vec4(color.rgb, A);\n}";function j(s){let{showEditor:e=[!1,!1,!1]}=s;return(0,n.jsx)(t.m,{geometry:m.Z,vertexShader:p,fragmentShader:x,showEditor:e})}const g={sidebar_position:1},v=void 0,u={id:"Basics/Vanilla/Vanilla",title:"Vanilla",description:"Uni radius",source:"@site/docs/Basics/Vanilla/Vanilla.mdx",sourceDirName:"Basics/Vanilla",slug:"/Basics/Vanilla/",permalink:"/brush-rendering-tutorial/Basics/Vanilla/",draft:!1,unlisted:!1,editUrl:"https://github.com/ShenCiao/brush-rendering-tutorial/tree/main/docs/Basics/Vanilla/Vanilla.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Basics",permalink:"/brush-rendering-tutorial/Basics/Basics/"},next:{title:"Stamp",permalink:"/brush-rendering-tutorial/Basics/Stamp/"}},A={},N=[{value:"Uni radius",id:"uni-radius",level:2},{value:"Geometry shader implementation is elegant",id:"geometry-shader-implementation-is-elegant",level:4},{value:"Opacity",id:"opacity",level:2},{value:"Variable radius",id:"variable-radius",level:2},{value:"Corner case",id:"corner-case",level:2}];function f(s){const e={a:"a",annotation:"annotation",code:"code",em:"em",h2:"h2",h4:"h4",img:"img",math:"math",mfrac:"mfrac",mi:"mi",mn:"mn",mo:"mo",mrow:"mrow",msqrt:"msqrt",msub:"msub",p:"p",path:"path",pre:"pre",semantics:"semantics",span:"span",strong:"strong",svg:"svg",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.a)(),...s.components},{Details:t}=e;return t||function(s,e){throw new Error("Expected "+(e?"component":"object")+" `"+s+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.h2,{id:"uni-radius",children:"Uni radius"}),"\n",(0,n.jsx)(e.p,{children:"Let's start with a solid stroke with a single radius value.\nLater, add variable radius to it."}),"\n","\n",(0,n.jsx)(h,{}),"\n",(0,n.jsxs)(e.p,{children:["We are given a polyline with a set of vertices.\nIn the diagram below, we select an edge with two consecutive vertices, labeled as ",(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsx)(e.mrow,{children:(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{children:"v"}),(0,n.jsx)(e.mi,{children:"i"})]})}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"v_i"})]})})}),(0,n.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.5806em",verticalAlign:"-0.15em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.03588em"},children:"v"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3117em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"-0.0359em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mathnormal mtight",children:"i"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,n.jsx)(e.span,{})})})]})})]})]})})]})," and ",(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsx)(e.mrow,{children:(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{children:"v"}),(0,n.jsxs)(e.mrow,{children:[(0,n.jsx)(e.mi,{children:"i"}),(0,n.jsx)(e.mo,{children:"+"}),(0,n.jsx)(e.mn,{children:"1"})]})]})}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"v_{i+1}"})]})})}),(0,n.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.6389em",verticalAlign:"-0.2083em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.03588em"},children:"v"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3117em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"-0.0359em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsxs)(e.span,{className:"mord mtight",children:[(0,n.jsx)(e.span,{className:"mord mathnormal mtight",children:"i"}),(0,n.jsx)(e.span,{className:"mbin mtight",children:"+"}),(0,n.jsx)(e.span,{className:"mord mtight",children:"1"})]})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.2083em"},children:(0,n.jsx)(e.span,{})})})]})})]})]})})]}),", then draw a capsule on it.\nIf we render every single edge like this, edges will connect to each other naturally, as shown on the right."]}),"\n",(0,n.jsxs)(e.table,{children:[(0,n.jsx)(e.thead,{children:(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.th,{style:{textAlign:"center"},children:(0,n.jsx)(e.img,{alt:"edge",src:a(2003).Z+"",width:"2560",height:"1080"})}),(0,n.jsx)(e.th,{style:{textAlign:"center"},children:(0,n.jsx)(e.img,{alt:"edge",src:a(9948).Z+"",width:"2560",height:"1080"})})]})}),(0,n.jsx)(e.tbody,{children:(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{style:{textAlign:"center"},children:(0,n.jsx)(e.em,{children:"Draw a capsule on an edge"})}),(0,n.jsx)(e.td,{style:{textAlign:"center"},children:(0,n.jsx)(e.em,{children:"Connected capsules"})})]})})]}),"\n",(0,n.jsxs)(e.p,{children:["The diagram quite looks like drawing an ",(0,n.jsx)(e.a,{href:"https://www.google.com/search?q=articulated+arm+2D+diagram&tbm=isch",children:"articulated arm"}),".\nTherefore, we call it ",(0,n.jsx)(e.strong,{children:"articulated"})," stroke (Line) rendering."]}),"\n",(0,n.jsx)(e.p,{children:"Hopefully, the above idea sounds straightforward to you.\nIt's also easy to implement with GPU APIs.\nTo draw the capsule, we generate four new vertices to invoke a rectangle, as shown in the left figure below.\nThen, discard the pixels in the four corners, as shown on the right. All is done!"}),"\n",(0,n.jsxs)(e.table,{children:[(0,n.jsx)(e.thead,{children:(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.th,{style:{textAlign:"center"},children:(0,n.jsx)(e.img,{alt:"quad",src:a(2621).Z+"",width:"2560",height:"1080"})}),(0,n.jsx)(e.th,{style:{textAlign:"center"},children:(0,n.jsx)(e.img,{alt:"quad",src:a(561).Z+"",width:"2560",height:"1080"})})]})}),(0,n.jsx)(e.tbody,{children:(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{style:{textAlign:"center"},children:"_Generate rectangle vertices _"}),(0,n.jsx)(e.td,{style:{textAlign:"center"},children:(0,n.jsx)(e.em,{children:"Discard corners"})})]})})]}),"\n",(0,n.jsx)(e.p,{children:"There are several possible ways to generate the rectangle vertices.\nThe most elegant one is to use a geometry shader.\nBut sadly, it's not supported on Apple's ecosystem and web platform, and many readers are not experienced in it.\nSo, I will mainly introduce another implementation with instanced rendering.\nBut if you're familiar with geometry shader, check out the dropdown tab below."}),"\n",(0,n.jsxs)(t,{children:[(0,n.jsx)("summary",{children:"Geometry shader implementation"}),(0,n.jsx)(e.p,{children:"Geometry shader is designed for transforming geometry.\nWe can write very elegant code on the CPU side, which feels like an OpenGL built-in stroke (line strip) rendering functionality."}),(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-cpp",children:"glUseProgram(brushStrokeProgram)\n/* set uniforms ... */\nglBindVertexArray(vao);\nglDrawArrays(GL_LINE_STRIP, ...);\n"})}),(0,n.jsx)(e.p,{children:"Pseudo code in the geometry shader:"}),(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-glsl",children:"layout(lines) in;\nlayout(triangle_strip, max_vertices = 4) out;\n\nvoid main(){\n /* Set the down left vertex variables */\n EmitVertex();\n /* Set the up left vertex variables */\n EmitVertex();\n /* Set the down right vertex variables */\n EmitVertex();\n /* Set the up right vertex variables */\n EmitVertex();\n}\n"})}),(0,n.jsx)(e.p,{children:"You will find the details in the upcoming description."}),(0,n.jsx)(e.h4,{id:"geometry-shader-implementation-is-elegant",children:"Geometry shader implementation is elegant"}),(0,n.jsxs)(e.p,{children:["The vertex array buffer object ",(0,n.jsx)(e.code,{children:"vao"})," is created like drawing a line strip.\nWe bind it and draw it as a line strip, then get a custom \"line strip\"!\nEvery line of the code is incredibly descriptive and self-explanatory.\nWhen mocking geometry shader's behavior with instanced rendering, the code gets obscure.\nSadly, graphics engineers cannot easily enjoy this elegance because of Apple's Metal API."]}),(0,n.jsx)(e.p,{children:"You may argue that geometry shader can cause a lot of performance issues.\nBut benefiting from hard work by GPU engineers and manufacturers,\nthe computational power is very much superfluous to draw 2D contents with a modern discrete graphics card.\nPerformance is not everything.\nWriting maintainable and easy-to-understand code is much more critical in some cases."})]}),"\n",(0,n.jsxs)(e.p,{children:["We use instanced rendering to draw a large number of objects with the same vertex data.\nFor drawing a stroke, each instance is the rectangle shown above, and the number of instances is the number of stroke's edges\n(number of polyline vertices minus one).\nTo place a rectangle, all rectangle's vertices need to know the positions of polyline vertices ",(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsx)(e.mrow,{children:(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{children:"p"}),(0,n.jsx)(e.mn,{children:"0"})]})}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"p_0"})]})})}),(0,n.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.625em",verticalAlign:"-0.1944em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathnormal",children:"p"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mtight",children:"0"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,n.jsx)(e.span,{})})})]})})]})]})})]})," and ",(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsx)(e.mrow,{children:(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{children:"p"}),(0,n.jsx)(e.mn,{children:"1"})]})}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"p_1"})]})})}),(0,n.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.625em",verticalAlign:"-0.1944em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathnormal",children:"p"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mtight",children:"1"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,n.jsx)(e.span,{})})})]})})]})]})})]})," and radius value ",(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsx)(e.mrow,{children:(0,n.jsx)(e.mi,{children:"r"})}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"r"})]})})}),(0,n.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.4306em"}}),(0,n.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.02778em"},children:"r"})]})})]}),".\nWe will set a local coordinate in the shader program, origin at ",(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsx)(e.mrow,{children:(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{children:"p"}),(0,n.jsx)(e.mn,{children:"0"})]})}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"p_0"})]})})}),(0,n.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.625em",verticalAlign:"-0.1944em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathnormal",children:"p"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mtight",children:"0"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,n.jsx)(e.span,{})})})]})})]})]})})]}),", X and Y axes align to the tangent and normal direction:\n",(0,n.jsx)(e.img,{alt:"coo",src:a(9367).Z+"",width:"2560",height:"1080"})]}),"\n",(0,n.jsx)(e.p,{children:'You will find implementation details in the comments of the shader code below.\nThe "vertex.glsl" for the vertex shader and "fragment.glsl" for the fragment shader, feel free to change them:'}),"\n",(0,n.jsx)(h,{showEditor:[!1,!0,!0]}),"\n",(0,n.jsxs)(t,{children:[(0,n.jsx)("summary",{children:(0,n.jsxs)(e.p,{children:["In case you don't know the ",(0,n.jsx)(e.code,{children:"flat"})," qualifier"]})}),(0,n.jsxs)(e.p,{children:["Shader variables are interpolated by default when passing to a fragment shader.\nThe ",(0,n.jsx)(e.code,{children:"flat"})," qualifier tells your shader program no to interpolate the variable.\nIf you still need clarifications, check out this ",(0,n.jsx)(e.a,{href:"https://www.geeks3d.com/20130514/opengl-interpolation-qualifiers-glsl-tutorial/",children:"article"}),"."]})]}),"\n",(0,n.jsx)(e.h2,{id:"opacity",children:"Opacity"}),"\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.img,{alt:"trans",src:a(7139).Z+"",width:"958",height:"296"})}),"\n",(0,n.jsxs)(e.p,{children:["Obviously, we are not dealing with transparency correctly in image above.\nYou can replicate it by setting the ",(0,n.jsx)(e.code,{children:"color"})," variable in the fragment shader above as ",(0,n.jsx)(e.code,{children:"const vec4 color = vec4(0.0, 0.0, 0.0, 0.5);"}),".\nThe areas where two edges connect are doubly colored.\nWe need to fix it."]}),"\n",(0,n.jsx)(e.p,{children:'For clarification, we define "joint" areas in the two circles at the start and end of the capsule,\nand the non-joint area is called "bone" area.'}),"\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.img,{alt:"joint",src:a(2625).Z+"",width:"2560",height:"1080"})}),"\n",(0,n.jsxs)(e.p,{children:["Joint areas are doubly colored.\nWe need to adjust joints' pixels opacity (alpha value) to get the target opacity of bone.\nLabel joint alpha ",(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsx)(e.mrow,{children:(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{mathvariant:"normal",children:"A"}),(0,n.jsx)(e.mi,{children:"j"})]})}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"\\Alpha_j"})]})})}),(0,n.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.9694em",verticalAlign:"-0.2861em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathrm",children:"A"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3117em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mathnormal mtight",style:{marginRight:"0.05724em"},children:"j"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.2861em"},children:(0,n.jsx)(e.span,{})})})]})})]})]})})]})," and bone alpha ",(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsx)(e.mrow,{children:(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{mathvariant:"normal",children:"A"}),(0,n.jsx)(e.mi,{children:"b"})]})}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"\\Alpha_b"})]})})}),(0,n.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.8333em",verticalAlign:"-0.15em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathrm",children:"A"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3361em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mathnormal mtight",children:"b"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,n.jsx)(e.span,{})})})]})})]})]})})]}),".\nSince rgb values from previous and next edge are the same, we can apply alpha compositing formula:\n",(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsxs)(e.mrow,{children:[(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{mathvariant:"normal",children:"A"}),(0,n.jsx)(e.mi,{children:"b"})]}),(0,n.jsx)(e.mo,{children:"="}),(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{mathvariant:"normal",children:"A"}),(0,n.jsx)(e.mi,{children:"j"})]}),(0,n.jsx)(e.mo,{children:"+"}),(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{mathvariant:"normal",children:"A"}),(0,n.jsx)(e.mi,{children:"j"})]}),(0,n.jsx)(e.mo,{children:"\u2217"}),(0,n.jsx)(e.mo,{stretchy:"false",children:"("}),(0,n.jsx)(e.mn,{children:"1"}),(0,n.jsx)(e.mo,{children:"\u2212"}),(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{mathvariant:"normal",children:"A"}),(0,n.jsx)(e.mi,{children:"j"})]}),(0,n.jsx)(e.mo,{stretchy:"false",children:")"})]}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"\\Alpha_b = \\Alpha_j + \\Alpha_j * (1 - \\Alpha_j)"})]})})}),(0,n.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.8333em",verticalAlign:"-0.15em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathrm",children:"A"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3361em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mathnormal mtight",children:"b"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,n.jsx)(e.span,{})})})]})})]}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,n.jsx)(e.span,{className:"mrel",children:"="}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.9694em",verticalAlign:"-0.2861em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathrm",children:"A"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3117em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mathnormal mtight",style:{marginRight:"0.05724em"},children:"j"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.2861em"},children:(0,n.jsx)(e.span,{})})})]})})]}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,n.jsx)(e.span,{className:"mbin",children:"+"}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}})]}),(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.9694em",verticalAlign:"-0.2861em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathrm",children:"A"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3117em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mathnormal mtight",style:{marginRight:"0.05724em"},children:"j"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.2861em"},children:(0,n.jsx)(e.span,{})})})]})})]}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,n.jsx)(e.span,{className:"mbin",children:"\u2217"}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}})]}),(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,n.jsx)(e.span,{className:"mopen",children:"("}),(0,n.jsx)(e.span,{className:"mord",children:"1"}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,n.jsx)(e.span,{className:"mbin",children:"\u2212"}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}})]}),(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"1.0361em",verticalAlign:"-0.2861em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathrm",children:"A"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3117em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mathnormal mtight",style:{marginRight:"0.05724em"},children:"j"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.2861em"},children:(0,n.jsx)(e.span,{})})})]})})]}),(0,n.jsx)(e.span,{className:"mclose",children:")"})]})]})]}),", and solve and joint opacity"]}),"\n",(0,n.jsx)(e.span,{className:"katex-display",children:(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsxs)(e.mrow,{children:[(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{mathvariant:"normal",children:"A"}),(0,n.jsx)(e.mi,{children:"j"})]}),(0,n.jsx)(e.mo,{children:"="}),(0,n.jsx)(e.mn,{children:"1"}),(0,n.jsx)(e.mo,{children:"\u2212"}),(0,n.jsx)(e.msqrt,{children:(0,n.jsxs)(e.mrow,{children:[(0,n.jsx)(e.mn,{children:"1"}),(0,n.jsx)(e.mo,{children:"\u2212"}),(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{mathvariant:"normal",children:"A"}),(0,n.jsx)(e.mi,{children:"b"})]})]})})]}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"\\Alpha_j = 1 - \\sqrt{1 - \\Alpha_b}"})]})})}),(0,n.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.9694em",verticalAlign:"-0.2861em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathrm",children:"A"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3117em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mathnormal mtight",style:{marginRight:"0.05724em"},children:"j"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.2861em"},children:(0,n.jsx)(e.span,{})})})]})})]}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,n.jsx)(e.span,{className:"mrel",children:"="}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.7278em",verticalAlign:"-0.0833em"}}),(0,n.jsx)(e.span,{className:"mord",children:"1"}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,n.jsx)(e.span,{className:"mbin",children:"\u2212"}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}})]}),(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"1.24em",verticalAlign:"-0.2395em"}}),(0,n.jsx)(e.span,{className:"mord sqrt",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsxs)(e.span,{className:"vlist",style:{height:"1.0005em"},children:[(0,n.jsxs)(e.span,{className:"svg-align",style:{top:"-3.2em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"3.2em"}}),(0,n.jsxs)(e.span,{className:"mord",style:{paddingLeft:"1em"},children:[(0,n.jsx)(e.span,{className:"mord",children:"1"}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,n.jsx)(e.span,{className:"mbin",children:"\u2212"}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathrm",children:"A"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3361em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mathnormal mtight",children:"b"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,n.jsx)(e.span,{})})})]})})]})]})]}),(0,n.jsxs)(e.span,{style:{top:"-2.9605em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"3.2em"}}),(0,n.jsx)(e.span,{className:"hide-tail",style:{minWidth:"1.02em",height:"1.28em"},children:(0,n.jsx)(e.svg,{xmlns:"http://www.w3.org/2000/svg",width:"400em",height:"1.28em",viewBox:"0 0 400000 1296",preserveAspectRatio:"xMinYMin slice",children:(0,n.jsx)(e.path,{d:"M263,681c0.7,0,18,39.7,52,119\nc34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120\nc340,-704.7,510.7,-1060.3,512,-1067\nl0 -0\nc4.7,-7.3,11,-11,19,-11\nH40000v40H1012.3\ns-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232\nc-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1\ns-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26\nc-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z\nM1001 80h400000v40h-400000z"})})})]})]}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.2395em"},children:(0,n.jsx)(e.span,{})})})]})})]})]})]})}),"\n",(0,n.jsx)(e.p,{children:"Let's see how to implement it:"}),"\n",(0,n.jsxs)(t,{children:[(0,n.jsx)("summary",{children:"About alpha compositing"}),(0,n.jsxs)(e.p,{children:["I've seen very experienced graphics engineers unfamiliar with alpha compositing.\nI would recommend two articles ",(0,n.jsx)(e.a,{href:"https://ciechanow.ski/alpha-compositing/",children:"1"})," and ",(0,n.jsx)(e.a,{href:"https://wiki.edunitas.com/IT/en/114-10/alpha-channels_400_eduNitas.html",children:"2"}),".\nThe topic is so important for 2D rendering that I will write a dedicated article to explain when introducing the airbrush."]})]}),"\n","\n",(0,n.jsx)(o,{showEditor:[!1,!1,!0]}),"\n",(0,n.jsx)(e.h2,{id:"variable-radius",children:"Variable radius"}),"\n",(0,n.jsx)(e.p,{children:"We are given a polyline with a radius value at each point to represent the variable radius stroke.\nThe rendering process is basically the same as uni-radius stroke:\nPlace four new vertices and discard the four corners, as shown in the figure below."}),"\n",(0,n.jsxs)(e.table,{children:[(0,n.jsx)(e.thead,{children:(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.th,{style:{textAlign:"center"},children:(0,n.jsx)(e.img,{alt:"edge",src:a(9289).Z+"",width:"2560",height:"1080"})}),(0,n.jsx)(e.th,{style:{textAlign:"center"},children:(0,n.jsx)(e.img,{alt:"edge",src:a(8533).Z+"",width:"2560",height:"1080"})})]})}),(0,n.jsx)(e.tbody,{children:(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{style:{textAlign:"center"},children:(0,n.jsx)(e.em,{children:"An edge"})}),(0,n.jsx)(e.td,{style:{textAlign:"center"},children:(0,n.jsx)(e.em,{children:"Connected edges"})})]})})]}),"\n",(0,n.jsxs)(e.p,{children:["The new vertices form a trapezoid rather than a rectangle to cover the whole capsule.\nWe need to solve a few extra geometric parameters in this trapezoid.\nFirst solve the angle ",(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsx)(e.mrow,{children:(0,n.jsx)(e.mi,{children:"\u03b8"})}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"\\theta"})]})})}),(0,n.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.6944em"}}),(0,n.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.02778em"},children:"\u03b8"})]})})]})," in the diagrams.\nAs the figure below shows, draw a perpendicular from ",(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsx)(e.mrow,{children:(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{children:"p"}),(0,n.jsx)(e.mn,{children:"1"})]})}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"p_1"})]})})}),(0,n.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.625em",verticalAlign:"-0.1944em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathnormal",children:"p"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mtight",children:"1"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,n.jsx)(e.span,{})})})]})})]})]})})]})," to the radius at ",(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsx)(e.mrow,{children:(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{children:"p"}),(0,n.jsx)(e.mn,{children:"0"})]})}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"p_0"})]})})}),(0,n.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.625em",verticalAlign:"-0.1944em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathnormal",children:"p"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mtight",children:"0"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,n.jsx)(e.span,{})})})]})})]})]})})]}),".\nThe distance between ",(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsx)(e.mrow,{children:(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{children:"p"}),(0,n.jsx)(e.mn,{children:"0"})]})}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"p_0"})]})})}),(0,n.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.625em",verticalAlign:"-0.1944em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathnormal",children:"p"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mtight",children:"0"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,n.jsx)(e.span,{})})})]})})]})]})})]})," and ",(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsx)(e.mrow,{children:(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{children:"p"}),(0,n.jsx)(e.mn,{children:"1"})]})}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"p_1"})]})})}),(0,n.jsx)(e.span,{className:"katex-html","aria-hidden":"true",children:(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.625em",verticalAlign:"-0.1944em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathnormal",children:"p"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mtight",children:"1"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,n.jsx)(e.span,{})})})]})})]})]})})]})," is known."]}),"\n",(0,n.jsx)(e.span,{className:"katex-display",children:(0,n.jsxs)(e.span,{className:"katex",children:[(0,n.jsx)(e.span,{className:"katex-mathml",children:(0,n.jsx)(e.math,{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block",children:(0,n.jsxs)(e.semantics,{children:[(0,n.jsxs)(e.mrow,{children:[(0,n.jsx)(e.mi,{children:"cos"}),(0,n.jsx)(e.mo,{children:"\u2061"}),(0,n.jsx)(e.mi,{children:"\u03b8"}),(0,n.jsx)(e.mo,{children:"="}),(0,n.jsxs)(e.mfrac,{children:[(0,n.jsxs)(e.mrow,{children:[(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{children:"r"}),(0,n.jsx)(e.mn,{children:"0"})]}),(0,n.jsx)(e.mo,{children:"\u2212"}),(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{children:"r"}),(0,n.jsx)(e.mn,{children:"1"})]})]}),(0,n.jsxs)(e.mrow,{children:[(0,n.jsx)(e.mi,{mathvariant:"normal",children:"\u2223"}),(0,n.jsx)(e.mi,{mathvariant:"normal",children:"\u2223"}),(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{children:"p"}),(0,n.jsx)(e.mn,{children:"0"})]}),(0,n.jsx)(e.mo,{children:"\u2212"}),(0,n.jsxs)(e.msub,{children:[(0,n.jsx)(e.mi,{children:"p"}),(0,n.jsx)(e.mn,{children:"1"})]}),(0,n.jsx)(e.mi,{mathvariant:"normal",children:"\u2223"}),(0,n.jsx)(e.mi,{mathvariant:"normal",children:"\u2223"})]})]})]}),(0,n.jsx)(e.annotation,{encoding:"application/x-tex",children:"\\cos\\theta = \\frac{r_0 - r_1}{||p_0 - p_1||}"})]})})}),(0,n.jsxs)(e.span,{className:"katex-html","aria-hidden":"true",children:[(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"0.6944em"}}),(0,n.jsx)(e.span,{className:"mop",children:"cos"}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.1667em"}}),(0,n.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.02778em"},children:"\u03b8"}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}}),(0,n.jsx)(e.span,{className:"mrel",children:"="}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2778em"}})]}),(0,n.jsxs)(e.span,{className:"base",children:[(0,n.jsx)(e.span,{className:"strut",style:{height:"2.1963em",verticalAlign:"-0.936em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mopen nulldelimiter"}),(0,n.jsx)(e.span,{className:"mfrac",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsxs)(e.span,{className:"vlist",style:{height:"1.2603em"},children:[(0,n.jsxs)(e.span,{style:{top:"-2.314em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord",children:"\u2223\u2223"}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathnormal",children:"p"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mtight",children:"0"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,n.jsx)(e.span,{})})})]})})]}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,n.jsx)(e.span,{className:"mbin",children:"\u2212"}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathnormal",children:"p"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"0em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mtight",children:"1"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,n.jsx)(e.span,{})})})]})})]}),(0,n.jsx)(e.span,{className:"mord",children:"\u2223\u2223"})]})]}),(0,n.jsxs)(e.span,{style:{top:"-3.23em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,n.jsx)(e.span,{className:"frac-line",style:{borderBottomWidth:"0.04em"}})]}),(0,n.jsxs)(e.span,{style:{top:"-3.677em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"3em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.02778em"},children:"r"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"-0.0278em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mtight",children:"0"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,n.jsx)(e.span,{})})})]})})]}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,n.jsx)(e.span,{className:"mbin",children:"\u2212"}),(0,n.jsx)(e.span,{className:"mspace",style:{marginRight:"0.2222em"}}),(0,n.jsxs)(e.span,{className:"mord",children:[(0,n.jsx)(e.span,{className:"mord mathnormal",style:{marginRight:"0.02778em"},children:"r"}),(0,n.jsx)(e.span,{className:"msupsub",children:(0,n.jsxs)(e.span,{className:"vlist-t vlist-t2",children:[(0,n.jsxs)(e.span,{className:"vlist-r",children:[(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.3011em"},children:(0,n.jsxs)(e.span,{style:{top:"-2.55em",marginLeft:"-0.0278em",marginRight:"0.05em"},children:[(0,n.jsx)(e.span,{className:"pstrut",style:{height:"2.7em"}}),(0,n.jsx)(e.span,{className:"sizing reset-size6 size3 mtight",children:(0,n.jsx)(e.span,{className:"mord mtight",children:"1"})})]})}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.15em"},children:(0,n.jsx)(e.span,{})})})]})})]})]})]})]}),(0,n.jsx)(e.span,{className:"vlist-s",children:"\u200b"})]}),(0,n.jsx)(e.span,{className:"vlist-r",children:(0,n.jsx)(e.span,{className:"vlist",style:{height:"0.936em"},children:(0,n.jsx)(e.span,{})})})]})}),(0,n.jsx)(e.span,{className:"mclose nulldelimiter"})]})]})]})]})}),"\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.img,{alt:"theta",src:a(8917).Z+"",width:"2560",height:"1080"})}),"\n",(0,n.jsx)(e.p,{children:"The line between trapezoid corners and polyline points are bisectors, drawn in solid black line,\nso the corners' offset along the normal direction can be calculated.\nYou can easily know the parameters in the lower half part with symmetry."}),"\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.img,{alt:"para",src:a(1642).Z+"",width:"2560",height:"1080"})}),"\n",(0,n.jsx)(e.p,{children:"Shader code implementation:"}),"\n","\n","\n",(0,n.jsx)(j,{showEditor:[!1,!0,!0]}),"\n",(0,n.jsx)(e.h2,{id:"corner-case",children:"Corner case"}),"\n",(0,n.jsx)(e.p,{children:"In the vertex shader, we discard edges in the two corner conditions.\nBut in fact, they represent one corner case, as shown in the figures below."}),"\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.img,{alt:"near",src:a(9528).Z+"",width:"2560",height:"1080"})}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-glsl",children:"// Corner case: The small circle is very close to the big one, casuing large offset in the normal direction, discard the edge\n if(normalTanValue > 10.0 || normalTanValue < 0.1) return;\n"})}),"\n",(0,n.jsxs)(e.p,{children:["When the small circle is very close to the big one, we get a large ",(0,n.jsx)(e.code,{children:"normalTanValue"})," value and invoked triangles will cover large areas of pixels,\nIt can hurt the performance badly."]}),"\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.img,{alt:"inside",src:a(8058).Z+"",width:"2560",height:"1080"})}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-glsl",children:"// Coner case: One circle is entirely inside the another, discard the edge.\n if(abs(cosTheta) >= 1.0) return;\n"})}),"\n",(0,n.jsx)(e.p,{children:"When the small circle gets closer and entirely inside the big one, how to place vertices is undefined."}),"\n",(0,n.jsxs)(e.p,{children:["The two ",(0,n.jsx)(e.code,{children:"if"})," conditions happened in the same situation: the radius changes drastically in a short distance between points.\nIt rarely happens for the geometry data comes from a 2D canvas.\nModern tablets are stable enough to avoid generating this ill data.\nBut it is common in 3D, I will introduce the solution together with 3D stroke rendering."]})]})}function w(s={}){const{wrapper:e}={...(0,i.a)(),...s.components};return e?(0,n.jsx)(e,{...s,children:(0,n.jsx)(f,{...s})}):f(s)}},4896:(s,e,a)=>{a.d(e,{m:()=>p});var n=a(7294),i=a(9477),t=a(5452),l=a(4866),r=a(5162),c=a(3764),h=a(5034),m=a(412),d=a(9501),o=a(5893);function p(s){let{geometry:e,vertexShader:a,fragmentShader:p,showEditor:x=null}=s;const j=(0,n.useRef)(),g=(0,n.useRef)(),v=(0,n.useRef)(),u=(0,n.useRef)();function A(s,e,a){const n=[...e],t=[...e.slice(2)],l=[...a],r=[...a.slice(1)],c=[];let h=0;for(let o=0;o{const s=(1+Math.sqrt(5))/2,n=j.current.clientWidth,l=n*(.5/s),r=6*s,c=r*(.5/s),h=new i.iKG(r/-2,r/2,c/2,c/-2,-1e3,1e3);h.position.z=5;const o=new i.CP7({preserveDrawingBuffer:!0,powerPreference:"high-performance",antialias:!0,alpha:!0,premultipliedAlpha:!1});function x(){const e=j.current.clientWidth,a=.5*e/s;o.setSize(e,a)}o.setClearColor(new i.Ilk(1,1,1),0),o.setSize(n,l),u.current=o,window.addEventListener("resize",x),j.current.appendChild(o.domElement);const N=new i.xsS,f=new t.o(h,o.domElement);f.enableRotate=!1,f.enableDamping=!1,f.screenSpacePanning=!0,f.addEventListener("change",(()=>{o.render(N,h)})),g.current=()=>o.render(N,h),window.addEventListener("TextureLoaded",g.current);let w=new i.u9r;if("string"==typeof e){const s=[0,1,2,2,3,0];w.setIndex(s);const a=new Function(e),[n,i]=a();A(w,n,i)}else{if(!(e instanceof i.u9r))return void console.error("Unrecognized geometry input: "+typeof e);w=e}let y=new i.xEZ;m.Z.canUseDOM&&(y=(new i.dpR).load(`/${d.Z.projectName}/img/stamp86.png`,(s=>{window.dispatchEvent(new CustomEvent("TextureLoaded"))}),void 0,void 0));const b={footprint:{value:y}},L=new i.FIo({vertexShader:a,fragmentShader:p,side:i.ehD,transparent:!0,glslVersion:i.LSk,uniforms:b});return v.current=new i.SPe(w,L,w.getAttribute("position0").count-1),v.current.frustumCulled=!1,N.add(v.current),g.current(),()=>{o.dispose(),window.removeEventListener("resize",x),window.removeEventListener("TextureLoaded",g.current)}}),[]);const f=(0,n.useCallback)(((s,e)=>{let a=[],n=[];try{const e=new Function(s);[a,n]=e()}catch(t){return void console.log(t.toString())}function i(s){if(Array.isArray(s)){for(let e=0;e{N(s,"")}})}),L&&(0,o.jsx)(r.Z,{value:"fragment.glsl",children:(0,o.jsx)(h.r,{height:w,defaultValue:p,onChange:s=>{N("",s)}})})]})}),(0,o.jsx)("div",{ref:j,style:{width:"100%"},onMouseDown:s=>{s.preventDefault(),2==s.button&&console.log(u.current.domElement.toDataURL())}})]})}},9367:(s,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/coordinate-68714349e3013c769921a0eb25796188.png"},7139:(s,e,a)=>{a.d(e,{Z:()=>n});const n="data:image/png;base64,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"},2003:(s,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/uni-capsule-2431a7ac5ef2ad09ed6f95c0bdc851cc.png"},9948:(s,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/uni-connect-154f70dedb0fdc2925c947b72c9b5e63.png"},2625:(s,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/uni-joint-4a2efa37d7b523b21cea374679424637.png"},561:(s,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/uni-quad-capsule-b5f5c7122375176a3a612ac132814fe5.png"},2621:(s,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/uni-quad-faf9f304af7d8eb2aa3e3f4b48fe0a24.png"},9289:(s,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/var-capsule-1a4d1542500b2b4bc675225002014fb5.png"},8533:(s,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/var-connect-7370fb26c99bcde2bd3a2a2472e1762e.png"},8058:(s,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/var-inside-3f14e22e18826517a08aefef56ca7b68.png"},9528:(s,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/var-near-ee8cdfc7cab5636a8382e54837f25a35.png"},1642:(s,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/var-parameters-9d4c6d7aa31d0f61fd39ba9f69eaae6d.png"},8917:(s,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/var-theta-12b21c91e67f9f33e901ae6d7435f111.png"}}]); \ No newline at end of file diff --git a/assets/js/d50c89f1.ecc88b7c.js b/assets/js/d50c89f1.d592ad16.js similarity index 57% rename from assets/js/d50c89f1.ecc88b7c.js rename to assets/js/d50c89f1.d592ad16.js index 2da65f9..367a7b2 100644 --- a/assets/js/d50c89f1.ecc88b7c.js +++ b/assets/js/d50c89f1.d592ad16.js @@ -1 +1 @@ -"use strict";(self.webpackChunkbrush_stroke_tutorial=self.webpackChunkbrush_stroke_tutorial||[]).push([[736],{9452:r=>{r.exports=JSON.parse('{"title":"Basics","slug":"/category/basics","permalink":"/brush-rendering-tutorial/category/basics","navigation":{"previous":{"title":"Introduction","permalink":"/brush-rendering-tutorial/Introduction/"},"next":{"title":"Basics","permalink":"/brush-rendering-tutorial/Basics/Basics/"}}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkbrush_stroke_tutorial=self.webpackChunkbrush_stroke_tutorial||[]).push([[736],{9452:t=>{t.exports=JSON.parse('{"title":"Basics","slug":"/category/basics","permalink":"/brush-rendering-tutorial/category/basics","navigation":{"previous":{"title":"Introduction","permalink":"/brush-rendering-tutorial/Introduction/"},"next":{"title":"Problem Statement","permalink":"/brush-rendering-tutorial/Basics/Basics/"}}}')}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.13891849.js b/assets/js/runtime~main.13891849.js new file mode 100644 index 0000000..0308ae9 --- /dev/null +++ b/assets/js/runtime~main.13891849.js @@ -0,0 +1 @@ +(()=>{"use strict";var e,t,r,o,a,n={},i={};function f(e){var t=i[e];if(void 0!==t)return t.exports;var r=i[e]={id:e,loaded:!1,exports:{}};return n[e].call(r.exports,r,r.exports,f),r.loaded=!0,r.exports}f.m=n,f.c=i,e=[],f.O=(t,r,o,a)=>{if(!r){var n=1/0;for(u=0;u=a)&&Object.keys(f.O).every((e=>f.O[e](r[c])))?r.splice(c--,1):(i=!1,a0&&e[u-1][2]>a;u--)e[u]=e[u-1];e[u]=[r,o,a]},f.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return f.d(t,{a:t}),t},r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,f.t=function(e,o){if(1&o&&(e=this(e)),8&o)return e;if("object"==typeof e&&e){if(4&o&&e.__esModule)return e;if(16&o&&"function"==typeof e.then)return e}var a=Object.create(null);f.r(a);var n={};t=t||[null,r({}),r([]),r(r)];for(var i=2&o&&e;"object"==typeof i&&!~t.indexOf(i);i=r(i))Object.getOwnPropertyNames(i).forEach((t=>n[t]=()=>e[t]));return n.default=()=>e,f.d(a,n),a},f.d=(e,t)=>{for(var r in t)f.o(t,r)&&!f.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},f.f={},f.e=e=>Promise.all(Object.keys(f.f).reduce(((t,r)=>(f.f[r](e,t),t)),[])),f.u=e=>"assets/js/"+({53:"935f2afb",147:"26251b8b",195:"22948d09",274:"3b358ec9",342:"e7f20846",364:"ac092286",368:"a94703ab",370:"ed94b18f",394:"5244698c",518:"a7bd4aaa",592:"common",613:"6ae0415c",661:"5e95c892",736:"d50c89f1",805:"bc662926",817:"14eb3368",915:"6858f5cd",918:"17896441",940:"a7b05c2e"}[e]||e)+"."+{53:"d6c8afee",147:"b79fd33c",195:"f22bad27",274:"dc424447",342:"11c8b691",364:"788807fc",368:"1c7b2e92",370:"9dbb1674",394:"15347dcb",518:"799f9698",592:"800e0a6c",613:"9dffb487",661:"21b5de99",736:"d592ad16",772:"9c6e198c",805:"7a47c573",817:"563fa8c8",915:"989f493c",918:"dbac6b85",940:"fd1fd14f"}[e]+".js",f.miniCssF=e=>{},f.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),f.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o={},a="brush-stroke-tutorial:",f.l=(e,t,r,n)=>{if(o[e])o[e].push(t);else{var i,c;if(void 0!==r)for(var d=document.getElementsByTagName("script"),u=0;u{i.onerror=i.onload=null,clearTimeout(s);var a=o[e];if(delete o[e],i.parentNode&&i.parentNode.removeChild(i),a&&a.forEach((e=>e(r))),t)return t(r)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=l.bind(null,i.onerror),i.onload=l.bind(null,i.onload),c&&document.head.appendChild(i)}},f.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.p="/brush-rendering-tutorial/",f.gca=function(e){return e={17896441:"918","935f2afb":"53","26251b8b":"147","22948d09":"195","3b358ec9":"274",e7f20846:"342",ac092286:"364",a94703ab:"368",ed94b18f:"370","5244698c":"394",a7bd4aaa:"518",common:"592","6ae0415c":"613","5e95c892":"661",d50c89f1:"736",bc662926:"805","14eb3368":"817","6858f5cd":"915",a7b05c2e:"940"}[e]||e,f.p+f.u(e)},(()=>{var e={303:0,532:0};f.f.j=(t,r)=>{var o=f.o(e,t)?e[t]:void 0;if(0!==o)if(o)r.push(o[2]);else if(/^(303|532)$/.test(t))e[t]=0;else{var a=new Promise(((r,a)=>o=e[t]=[r,a]));r.push(o[2]=a);var n=f.p+f.u(t),i=new Error;f.l(n,(r=>{if(f.o(e,t)&&(0!==(o=e[t])&&(e[t]=void 0),o)){var a=r&&("load"===r.type?"missing":r.type),n=r&&r.target&&r.target.src;i.message="Loading chunk "+t+" failed.\n("+a+": "+n+")",i.name="ChunkLoadError",i.type=a,i.request=n,o[1](i)}}),"chunk-"+t,t)}},f.O.j=t=>0===e[t];var t=(t,r)=>{var o,a,n=r[0],i=r[1],c=r[2],d=0;if(n.some((t=>0!==e[t]))){for(o in i)f.o(i,o)&&(f.m[o]=i[o]);if(c)var u=c(f)}for(t&&t(r);d{"use strict";var e,t,r,o,a,n={},c={};function i(e){var t=c[e];if(void 0!==t)return t.exports;var r=c[e]={id:e,loaded:!1,exports:{}};return n[e].call(r.exports,r,r.exports,i),r.loaded=!0,r.exports}i.m=n,i.c=c,e=[],i.O=(t,r,o,a)=>{if(!r){var n=1/0;for(u=0;u=a)&&Object.keys(i.O).every((e=>i.O[e](r[f])))?r.splice(f--,1):(c=!1,a0&&e[u-1][2]>a;u--)e[u]=e[u-1];e[u]=[r,o,a]},i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,i.t=function(e,o){if(1&o&&(e=this(e)),8&o)return e;if("object"==typeof e&&e){if(4&o&&e.__esModule)return e;if(16&o&&"function"==typeof e.then)return e}var a=Object.create(null);i.r(a);var n={};t=t||[null,r({}),r([]),r(r)];for(var c=2&o&&e;"object"==typeof c&&!~t.indexOf(c);c=r(c))Object.getOwnPropertyNames(c).forEach((t=>n[t]=()=>e[t]));return n.default=()=>e,i.d(a,n),a},i.d=(e,t)=>{for(var r in t)i.o(t,r)&&!i.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},i.f={},i.e=e=>Promise.all(Object.keys(i.f).reduce(((t,r)=>(i.f[r](e,t),t)),[])),i.u=e=>"assets/js/"+({53:"935f2afb",147:"26251b8b",195:"22948d09",274:"3b358ec9",342:"e7f20846",364:"ac092286",368:"a94703ab",370:"ed94b18f",394:"5244698c",518:"a7bd4aaa",592:"common",613:"6ae0415c",661:"5e95c892",736:"d50c89f1",805:"bc662926",817:"14eb3368",915:"6858f5cd",918:"17896441",940:"a7b05c2e"}[e]||e)+"."+{53:"e9e1f595",147:"6fd2a627",195:"f22bad27",274:"dc424447",342:"11c8b691",364:"46380a79",368:"1c7b2e92",370:"9dbb1674",394:"15347dcb",518:"799f9698",592:"800e0a6c",613:"b5896ee6",661:"21b5de99",736:"ecc88b7c",772:"9c6e198c",805:"e139a372",817:"563fa8c8",915:"38283fa2",918:"dbac6b85",940:"fd1fd14f"}[e]+".js",i.miniCssF=e=>{},i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o={},a="brush-stroke-tutorial:",i.l=(e,t,r,n)=>{if(o[e])o[e].push(t);else{var c,f;if(void 0!==r)for(var d=document.getElementsByTagName("script"),u=0;u{c.onerror=c.onload=null,clearTimeout(s);var a=o[e];if(delete o[e],c.parentNode&&c.parentNode.removeChild(c),a&&a.forEach((e=>e(r))),t)return t(r)},s=setTimeout(b.bind(null,void 0,{type:"timeout",target:c}),12e4);c.onerror=b.bind(null,c.onerror),c.onload=b.bind(null,c.onload),f&&document.head.appendChild(c)}},i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.p="/brush-rendering-tutorial/",i.gca=function(e){return e={17896441:"918","935f2afb":"53","26251b8b":"147","22948d09":"195","3b358ec9":"274",e7f20846:"342",ac092286:"364",a94703ab:"368",ed94b18f:"370","5244698c":"394",a7bd4aaa:"518",common:"592","6ae0415c":"613","5e95c892":"661",d50c89f1:"736",bc662926:"805","14eb3368":"817","6858f5cd":"915",a7b05c2e:"940"}[e]||e,i.p+i.u(e)},(()=>{var e={303:0,532:0};i.f.j=(t,r)=>{var o=i.o(e,t)?e[t]:void 0;if(0!==o)if(o)r.push(o[2]);else if(/^(303|532)$/.test(t))e[t]=0;else{var a=new Promise(((r,a)=>o=e[t]=[r,a]));r.push(o[2]=a);var n=i.p+i.u(t),c=new Error;i.l(n,(r=>{if(i.o(e,t)&&(0!==(o=e[t])&&(e[t]=void 0),o)){var a=r&&("load"===r.type?"missing":r.type),n=r&&r.target&&r.target.src;c.message="Loading chunk "+t+" failed.\n("+a+": "+n+")",c.name="ChunkLoadError",c.type=a,c.request=n,o[1](c)}}),"chunk-"+t,t)}},i.O.j=t=>0===e[t];var t=(t,r)=>{var o,a,n=r[0],c=r[1],f=r[2],d=0;if(n.some((t=>0!==e[t]))){for(o in c)i.o(c,o)&&(i.m[o]=c[o]);if(f)var u=f(i)}for(t&&t(r);d Appendix | Brush Rendering Tutorial - + -

      + \ No newline at end of file diff --git a/category/basics/index.html b/category/basics/index.html index e059c0a..e3fd194 100644 --- a/category/basics/index.html +++ b/category/basics/index.html @@ -4,10 +4,10 @@ Basics | Brush Rendering Tutorial - + - + \ No newline at end of file diff --git a/index.html b/index.html index 552df90..826bd16 100644 --- a/index.html +++ b/index.html @@ -3,29 +3,29 @@ -Table of Contents | Brush Rendering Tutorial - +Table of Contents | Brush Rendering Tutorial + -

      This tutorial series will teach you how to render brush strokes with the modern GPU graphics pipeline.

      -

      If you like this series, please star the code repository instead of bookmark this website since the domain might be changed.

      +

      eye-catcher

      +

      This tutorial series will teach you how to render brush strokes with the modern GPU graphics pipeline. +If you like this series, please star the code repository instead of bookmark this website since the domain might be changed.

      Table of Contents

      -
      Future Contents

      Airbrush

      Loading...

      Airbrush is a special type of stamp brush. -Here I'm demonstrating a "continuous airbrush", which is mathematically continuous and needs a little bit of calculus to develop. -You will learn how to generalize a stamp brush into its continuous form.

      Stamp density and "ratio-distance"

      Loading...
      Adjacent dots
      Loading...
      Adjacent with one dot interleaved

      You can see dots are adjacent to each other instead of equidistantly distributed. +

      Future Contents

      Stamp density and "ratio-distance"

      Loading...
      Adjacent dots
      Loading...
      Adjacent with one dot interleaved

      You can see dots are adjacent to each other instead of equidistantly distributed. The pattern is achieved by setting the intervals between dots proportional to their radii. You will learn how to freely control stamp density along a stamp -stroke. Very important for a serious project.

      3D stroke

      Learn how to extend the algorithms to 3D space.

      I'm integrating it into the Blender Grease Pencil:

      +stroke. Very important for a serious project.

      3D stroke

      Learn how to extend the algorithms to 3D space.

      I'm integrating it into the Blender Grease Pencil:

    \ No newline at end of file