Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
めくるめくシェーダーアートの世界/The World of Dazzling Shader Art
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
ta_ka_tsu
September 06, 2019
Technology
6.6k
10
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
めくるめくシェーダーアートの世界/The World of Dazzling Shader Art
iOSDC2019
ta_ka_tsu
September 06, 2019
More Decks by ta_ka_tsu
See All by ta_ka_tsu
AVSpeechSynthesizerにひたすら読ませる
takatsu
0
820
作ってわかるレンダリングパイプライン〜CPUで3D描画〜
takatsu
4
2.5k
Other Decks in Technology
See All in Technology
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
2
320
【視聴者参加型!】AWSセキュリティアンチパターンクイズ
syoshie
0
460
現場に行くだけでは足りない——プロダクトエンジニアが業務の流れを捉える観点と、その鍛え方
takumiengineering
0
330
20260903 Tokyo Jazug Night #62 | Azure エンジニアよ、 その環境は本当にセキュアか?
olivia_0707
1
640
AI時代に、プロダクトの数だけ積み上がる所有コストをどうエンジニアリングするか / Engineering the Cost of Ownership
kzkmaeda
1
1.1k
AI活用の現在地、 ちゃんと見えてますか?/XPfest-2026
visional_engineering_and_design
0
170
20260906 「AWS運用入門」著者が教える、運用業務への生成AI活用入門
masaruogura
0
250
Screen Lens - 今見てる画面を翻訳する
komagata
0
110
動画配信アプリでの Engage SDK 導入 — TVer Android が Play ストアにコンテンツを届けるまで
techtver
PRO
0
150
enechainの内製セルフサービスプラットフォーム
hiyosi
0
140
AIで開発は速くなったのに、なぜ現場は楽にならないのか 〜あなたの組織のボトルネックを突き止めるワークショップ〜
jacopen
1
280
Claude Code本って、 読む必要あるの?
oikon48
1
100
Featured
See All Featured
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Mobile First: as difficult as doing things right
swwweet
225
10k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.7k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.2k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
660
Building a Scalable Design System with Sketch
lauravandoore
463
34k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
520
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
520
How GitHub (no longer) Works
holman
316
150k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
510
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2.1k
Transcript
Ί͘ΔΊ͘ γΣʔμΞʔτͷ iOSDC Japan 2019 ੈք
!UB@LB@UTV ذෞݝࡏॅ ࣗݾհ %$"%ܥϓϩάϥϚʔ %$".ܥϓϩάϥϚʔ ϑϦʔϥϯεˡ/PX ձࣾઃཱ
ࣗݾհ ࠷ۙϋϚ͍ͬͯΔ͜ͱ
ࣗݾհ࠷ۙϋϚ͍ͬͯΔ͜ͱ మ
ࣗݾհ࠷ۙϋϚ͍ͬͯΔ͜ͱ ࡐྉɿ ࠭మɾ
ࣗݾհ࠷ۙϋϚ͍ͬͯΔ͜ͱ ࡞Γํɿ ϒϩοΫͰ࡞ͬͨ ͷதͰઈ͑ͣ෩Λૹ Γଓ͚ͳ͕ΒΛ೩ ͠ɺҰఆ͓͖࣌ؒʹ ࠭మɾΛަޓʹ ೖͯ࣌ؒ͠ૢۀ
ࣗݾհ࠷ۙϋϚ͍ͬͯΔ͜ͱ
ࣗݾհ࠷ۙϋϚ͍ͬͯΔ͜ͱ ݪཧɿ $ 0ˠ$0 'F0ʴ$0ˠ'F $0 Λ೩ͯ͠ൃੜ͢ΔҰࢎԽૉ͕ ࠭మ ࢎԽమ Λؐݩ͢Δ͜ͱͰమʹͳΔɻ
ຊདྷమͷ༥ˆ͕ͩɺʹ͠ ͍ͯΔˍෆ७ΛؚΉ͜ͱʹΑΓڽݻ ߱Լ͕ى͜ΓɺΑΓ͍ԹͰ༹༥͠ ͷఈͰమմͱͳΔɻ
ࣗݾհ࠷ۙϋϚ͍ͬͯΔ͜ͱ
ࣗݾհ࠷ۙϋϚ͍ͬͯΔ͜ͱ ݱࡏɿ మͷૉྔͷௐʹઓத ˞ৄ͍͠ਓ͕͍ͨΒ ͥͻΞυ όΠεԼ͍͞
ࣗݾհ࠷ۙϋϚ͍ͬͯΔ͜ͱ ࢀߟจݙɿ ɾӬాɹ ɹΠν͔Β࡞Δమ ࢁړଜจԽڠձ ɾӬాɹ ɹਓͲͷΑ͏ʹమΛ࡞͖͔ͬͯͨ ߨஊࣾ
ɾڥɹஐ༸ɹϨϯΨࣜͨͨΒమʹΑΔమͮ͘Γ IUUQXXXUPSBZTGPSKQBDUJWJUZTDJFODF@FEVQEGI@QEG ɾᜊ౻ɾࡔຊູɾߴ௩ल࣏ɹঊ͕ܧঝ͢Δ౷ٕज़ͷࣗવՊ ֶతௐࠪ IUUQTXXXSFLJIBLVBDKQPVUMJOFQVCMJDBUJPOSPOCVOSPOCVOQEG QEG
None
γΣʔμ ʔΞʔτͱʁ
%&.0
γΣʔμ ʔΞʔτͱʁ 4IBEFSUPZ IUUQTXXXTIBEFSUPZDPN
(-4-4BOECPY IUUQHMTMTBOECPYDPN γΣʔμ ʔΞʔτͱʁ
2ԿΛ͍ͬͯΔͷ͔ʁ γΣʔμ ʔΞʔτͱʁ
"γΣʔμ ʔΛར༻ͯ͠ ֆΛඳ͍͍ͯΔ γΣʔμ ʔΞʔτͱʁ
γΣʔμ ʔͱʁ
࣍ݩίϯϐϡʔλάϥϑΟοΫεʹ͓͍ͯɺ γΣʔσΟϯάʢӄӨॲཧʣΛߦ͏ίϯϐϡʔλ ϓϩάϥϜͷ͜ͱɻʮTIBEFʯͱʮ࣍ୈʹมԽ ͤ͞ΔʯʮӄӨɾάϥσʔγϣϯΛ͚Δʯͱ͍ ͏ҙຯͰɺʮTIBEFSʯ৭ϐΫηϧ৭ͳ ͲΛ࣍ʑʹมԽͤ͞ΔͷʢΑΓ۩ମతʹɺڱٛ ͷҙຯͰݴ͑ؔʣΛҙຯ͢Δɻ 4IBEFS IUUQTKBXJLJQFEJBPSHXJLJγΣʔμʔ γΣʔμ
ʔͱʁ
࣍ݩ$(ͷඳըͷΈ ؆қ൛ ॲཧ ϥελϥΠζ ϑϥάϝϯτॲཧ ೖྗɿྻ ग़ྗɿը૾ γΣʔμ ʔͱʁ
࣍ݩ$(ͷඳըͷΈ ؆қ൛ ॲཧ ϥελϥΠζ ϑϥάϝϯτॲཧ ೖྗɿྻ ग़ྗɿը૾ ϨϯμϦϯά ύΠϓϥΠϯ γΣʔμ
ʔͱʁ
࣍ݩ$(ͷඳըͷΈ ؆қ൛ ॲཧ ϥελϥΠζ ϑϥάϝϯτॲཧ ೖྗɿྻ ग़ྗɿը૾ γΣʔμ ʔͱʁ
࣍ݩ$(ͷඳըͷΈ ؆қ൛ ॲཧ ϥελϥΠζ ϑϥάϝϯτॲཧ ೖྗɿྻ ग़ྗɿը૾ γΣʔμ ʔͱʁ
࣍ݩ$(ͷඳըͷΈ ؆қ൛ ॲཧ ϥελϥΠζ ϑϥάϝϯτॲཧ ೖྗɿྻ ग़ྗɿը૾ γΣʔμ ʔͱʁ
γΣʔμ ʔͱʁ
γΣʔμ ʔͱʁ
γΣʔμ ʔͱʁ
γΣʔμ ʔͱʁ
ৄͪ͘͜͠Β IUUQTTQFBLFSEFDLDPNUBLBUTV[VPUVUFXBLBSVSFOEBSJOHVQBJQVSBJO DQVEFENJBPIVB γΣʔμ ʔͱʁ
ॲཧ ϥελϥΠζ ϑϥάϝϯτॲཧ ೖྗɿྻ ग़ྗɿը૾ γΣʔμ ʔͱʁ
ॲཧ ϥελϥΠζ ϑϥάϝϯτॲཧ ೖྗɿྻ ग़ྗɿը૾ ɾɾɾϓϩάϥϜهड़ ɾɾɾϓϩάϥϜهड़ ɾɾɾݻఆॲཧ γΣʔμ ʔͱʁ
ॲཧ ϥελϥΠζ ϑϥάϝϯτॲཧ ೖྗɿྻ ग़ྗɿը૾ ɾɾɾϓϩάϥϜهड़ ɾɾɾϓϩάϥϜهड़ γΣʔμ ʔ ϑϥά
ϝϯτγΣʔμ ʔ γΣʔμ ʔͱʁ
γΣʔμ ʔΞʔτͷ Έ
γΣʔμ ʔΞʔτͷΈ ॲཧ ϥελϥΠζ ϑϥάϝϯτॲཧ ೖྗɿྻ ग़ྗɿը૾ ͭͷͰ ࡾ֯ܗΛͭඳը
γΣʔμ ʔΞʔτͷΈ ॲཧ ϥελϥΠζ ϑϥάϝϯτॲཧ ೖྗɿྻ ग़ྗɿը૾
γΣʔμ ʔΞʔτͷΈ ॲཧ ϥελϥΠζ ϑϥάϝϯτॲཧ ೖྗɿྻ ग़ྗɿը૾
ʮϐΫηϧ࠲ඪΛೖྗͱͯ͠৭Λग़ྗ͢Δؔʯ ͦͷ͕ؔશϐΫηϧʹద༻͞Εͯը૾͕Ͱ͖Δ ຊ࣭తʹ͜Ε͚ͩɻ γΣʔμ ʔΞʔτͷΈ
J04Ͱͷ࡞Γํ
J04Ͱͷ࡞Γํ ͓ͦΒ͘ํ๏ͭ %"1*ɿ8FC(- ඳըઌɿ8,8FC7JFX γΣʔμ ʔݴޠɿ(-4- %"1*ɿ.FUBM ඳըઌɿ$".FUBM-BZFS γΣʔμ ʔݴޠɿ.4-
%"1*ɿ0QFO(-&4 ඳըઌɿ$"&"(--BZFS γΣʔμ ʔݴޠɿ(-4- EFQSFDBUFE!
J04Ͱͷ࡞Γํ ະݕূ %"1*ɿ8FC(- ඳըઌɿ8,8FC7JFX γΣʔμ ʔݴޠɿ(-4- %"1*ɿ.FUBM ඳըઌɿ$".FUBM-BZFS γΣʔμ ʔݴޠɿ.4-
J04Ͱͷ࡞Γํ IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPONFUBM VTJOH@B@SFOEFS@QJQFMJOF@UP@SFOEFS@QSJNJUJWFT ࢀߟɿ6TJOHB3FOEFS1JQFMJOFUP3FOEFS1SJNJUJWFT ࡾ֯ܗΛͭඳ͚ͩ͘ͳͷͰ ϑϥά ϝϯτγΣʔμ ʔҎ֎ׂѪ
࣮ફ.4-
جຊฤ
جຊฤ
جຊฤ #include <metal_stdlib> using namespace metal; fragment float4 Basic1(float4 pixPos
[[position]]) { return float4(1.0, 0.0, 0.0, 1.0); }
جຊฤ
#include <metal_stdlib> using namespace metal; fragment float4 Basic1(float4 pixPos [[position]])
{ return float4(1.0, 0.0, 0.0, 1.0); } ΈࠐΈؔͷΠϯΫϧʔυ جຊฤ
#include <metal_stdlib> using namespace metal; fragment float4 Basic1(float4 pixPos [[position]])
{ return float4(1.0, 0.0, 0.0, 1.0); } ໊લۭؒNFUBMΛ͏ͱ͍͏એݴ جຊฤ
#include <metal_stdlib> using namespace metal; fragment float4 Basic1(float4 pixPos [[position]])
{ return float4(1.0, 0.0, 0.0, 1.0); } ϑϥά ϝϯτγΣʔμ ʔ༻ͷؔͰ͋Δͱ͍͏ؔଐੑ جຊฤ
#include <metal_stdlib> using namespace metal; fragment float4 Basic1(float4 pixPos [[position]])
{ return float4(1.0, 0.0, 0.0, 1.0); } ϥελϥΠβ͔Β͞ΕΔϐΫηϧ࠲ඪͰ͋Δ͜ͱΛࣔ͢ Ҿଐੑ جຊฤ
#include <metal_stdlib> using namespace metal; fragment float4 Basic1(float4 pixPos [[position]])
{ return float4(1.0, 0.0, 0.0, 1.0); } ೖྗͱͳΔϐΫηϧ࠲ඪΛ֨ೲ͢Δม جຊฤ
#include <metal_stdlib> using namespace metal; fragment float4 Basic1(float4 pixPos [[position]])
{ return float4(1.0, 0.0, 0.0, 1.0); } ϑϥά ϝϯτγΣʔμ ʔͷ໊ؔ جຊฤ
let library = device.makeDefaultLibrary() let fragmentFunction = library.makeFunction(name:”Basic1”) . .
. let pipelineDescriptor = MTLRenderPipelineDescriptor() pipelineDescriptor.fragmentFunction = fragmentFunction . . . $16ଆͰ໊͔ؔΒ.5-'VODUJPOΛऔಘ͠ ύΠϓϥΠϯͷϑϥά ϝϯτγΣʔμ ʔͱͯ͠ઃఆ͓ͯ͘͠ جຊฤ
#include <metal_stdlib> using namespace metal; fragment float4 Basic1(float4 pixPos [[position]])
{ return float4(1.0, 0.0, 0.0, 1.0); } 3 ( # Ћ جຊฤ
float bool int char short uchar uint ushort half size_t
ptrdiff_t void ˞MPOHVOTJHOFEMPOH.FUBMҎ߱Ͱαϙʔτ ˞EPVCMFMPOHMPOHVOTJHOFEMPOHMPOHMPOHEPVCMFະαϙʔτ جຊฤ .4-ͷεΧϥʔܕ
float2 float3 float4 bool2 bool3 bool4 int2 int3 int4 char2
char3 char4 short2 short3 short4 uchar2 uchar3 uchar4 uint2 uint3 uint4 ushort2 ushort3 ushort4 half2 half3 half4 جຊฤ .4-ͷϕΫτϧܕ
.4-ͷϕΫτϧܕ֤ίϯϙʔωϯτͷΞΫηε float4 vec(1.0, 2.0, 3.0, 4.0); float a = vec.x;
// 1.0 float b = vec.y; // 2.0 float c = vec.z; // 3.0 float d = vec.w; // 4.0 float e = vec.r; // 1.0 float f = vec.g; // 2.0 float g = vec.b; // 3.0 float h = vec.a; // 4.0 vec.x = 3.0; // (3.0, 2.0, 3.0, 4.0) float i = vec.r; // 3.0 جຊฤ
float4 vec1(4.0, 4.0, 4.0, 4.0); float4 vec2(1.0, 2.0, 4.0, 8.0);
float4 v1 = vec1 + vec2; // (5.0, 6.0, 8.0, 12.0) float4 v2 = vec1 - vec2; // (3.0, 2.0, 0.0, -4.0) float4 v3 = vec1 * vec2; // (4.0, 8.0, 16.0, 32.0) float4 v4 = vec1 / vec2; // (4.0, 2.0, 1.0, 0.5) .4-ͷϕΫτϧܕՃݮআ جຊฤ
float4 vec(1.0, 2.0, 3.0, 4.0); float4 v1 = vec +
2.0; // (3.0, 4.0, 5.0, 6.0) float4 v2 = vec - 2.0; // (-1.0, 0.0, 1.0, 2.0) float4 v3 = vec * 2.0; // (2.0, 4.0, 6.0, 8.0) float4 v4 = vec / 2.0; // (0.5, 1.0, 1.5, 2.0) vec = 1.0; // (1.0, 1.0, 1.0, 1.0) .4-ͷϕΫτϧܕεΧϥʔܕͱͷՃݮআ جຊฤ
half2x2 half2x3 half2x4 float2x2 float2x3 float2x4 half3x2 half3x3 half3x4 half4x2
half4x3 half4x4 float3x2 float3x3 float3x4 float4x2 float4x3 float4x4 .4-ͷߦྻܕ ໊લۭؒNFUBM جຊฤ
return float4(1.0, 0.0, 0.0, 1.0); શͯͷϐΫηϧΛʹ͢Δ جຊฤ
fragment float4 Basic2(float4 pixPos [[position]]) { return clamp(length(pixPos.xy)/300.0, 0.0, 1.0);
} جຊฤ
جຊฤ
fragment float4 Basic2(float4 pixPos [[position]]) { return clamp(length(pixPos.xy)/300.0, 0.0, 1.0);
} جຊฤ ͜ΕԿʁ
.4-ͷϕΫτϧܕ4XJ[[MJOH float4 vec(1.0, 2.0, 3.0, 4.0); vec.xy; // (1.0, 2.0)
vec.zwx; // (3.0, 4.0, 1.0) vec.xxxy; // (1.0, 1.0, 1.0, 2.0) vec.ra; // (1.0, 4.0) vec.rgb; // (1.0, 2.0, 3.0) vec.xyb; // compile error! vec.xy = float2(0.0, 1.0); // (0.0, 1.0, 3.0, 4.0) vec.xxy = float3(5.0, 4.0, 3.0); // compile error! جຊฤ
fragment float4 Basic2(float4 pixPos [[position]]) { return clamp(length(pixPos.xy)/300.0, 0.0, 1.0);
} MFOHUIؔ جຊฤ
MFOHUIؔ ϕΫτϧYͷ͞Λฦ͢ float2 vec2d(3.0, 4.0); length(vec2d); // 5.0 float3 vec3d(1.0,
1.0, 1.0); length(vec3d); // 1.732… P W MFOHUI W ؔ࿈ɿEJTUBODFؔEJTUBODF Q Q MFOHUI QQ Ts length(T x) جຊฤ
fragment float4 Basic2(float4 pixPos [[position]]) { return clamp(length(pixPos.xy)/300.0, 0.0, 1.0);
} DMBNQؔ جຊฤ
DMBNQؔ YΛNJO7ʙNBY7ͷൣғʹΫϥϯϓ͢Δ NJO7ʽNBY7 clamp(0.6, 0.0, 1.0); // 0.6 clamp(-0.3, 0.0,
1.0); // 0.0 clamp(1.2, 0.0, 1.0); // 1.0 DMBNQ Y NJO7 NBY7 NJO NBY Y NJO7 NBY7 T clamp(T x, T minV, T maxV) جຊฤ
9 : 8JEUI )FJHIU 8JEUI )FJHIU
ϐΫηϧ࠲ඪܥ جຊฤ
ݪͱͷڑΛͰׂͬͨͷΛ໌Δ͞ͱ͍ͯ͠Δ return clamp(length(pixPos.xy)/300.0, 0.0, 1.0); جຊฤ
fragment float4 Basic3(float4 pixPos [[position]]) { return step(300.0, length(pixPos.xy)); }
جຊฤ
جຊฤ
fragment float4 Basic3(float4 pixPos [[position]]) { return step(300.0, length(pixPos.xy)); }
TUFQؔ جຊฤ
TUFQؔ Y͕FEHFҎ্ͷ߹ʹΛ ͦΕҎ֎ͷ߹Λฦؔ͢ step(0.5, 1.0); // 1.0 step(0.5, 0.3); //
0.0 step(0.5, 0.5); // 1.0 TUFQ Y ͷάϥϑ T step(T edge, T x) جຊฤ
return step(300.0, length(pixPos.xy)); ݪͱͷڑ͕Ҏ্ͷՕॴ͕നɺະຬͷՕॴ͕ࠇ جຊฤ
fragment float4 Basic4(float4 pixPos [[position]]) { return smoothstep(300.0, 400.0, length(pixPos.xy));
} جຊฤ
جຊฤ
fragment float4 Basic4(float4 pixPos [[position]]) { return smoothstep(300.0, 400.0, length(pixPos.xy));
} TNPPUITUFQؔ جຊฤ
TNPPUITUFQؔ Y͕FҎԼͷ߹ FҎ্ͷ߹Λฦ͢ɻ ͦͷؒͷ߹Τϧϛʔτิؒ ˞ ͨ݁͠ՌΛฦ͢ɻ FʻF smoothstep(0.5, 1.0, 1.2);
// 1.0 smoothstep(0.5, 1.0, 0.2); // 0.0 smoothstep(0.5, 1.0, 0.6); // 0.104 smoothstep(0.5, 1.0, 0.9); // 0.896 T smoothstep(T e1, T e2, T x) ˞۠ؒ [e1 , e2 ] 3( x − e1 e2 − e1 )2 − 2( x − e1 e2 − e1 )3 ͷ x ʹରͯ͠ Λฦ͢ جຊฤ
TNPPUITUFQ Y ͷάϥϑ جຊฤ
return smoothstep(300.0, 400.0, length(pixPos.xy)); جຊฤ
fragment float4 Basic5(float4 pixPos[[position]]) { float4 red(1.0, 0.0, 0.0, 1.0);
float4 green(0.0, 1.0, 0.0, 1.0); float m1 = smoothstep(300.0, 400.0, length(pixPos.xy)); return mix(red, green, m1); } جຊฤ
جຊฤ
fragment float4 Basic5(float4 pixPos[[position]]) { float4 red(1.0, 0.0, 0.0, 1.0);
float4 green(0.0, 1.0, 0.0, 1.0); float m1 = smoothstep(300.0, 400.0, length(pixPos.xy)); return mix(red, green, m1); } جຊฤ NJYؔ
NJYؔ YͱZͷؒΛBͰઢܗิؒ ˞ ͢Δؔ ʽBʽ mix(10.0, 20.0, 0.5); //
15.0 mix(100.0, 50.0, 0.2); // 90.0 mix(10, -10.0, 0.6); // -2.0 T mix(T x, T y, T a) NJY Y ͷάϥϑ جຊฤ
fragment float4 Basic5(float4 pixPos[[position]]) { float4 red(1.0, 0.0, 0.0, 1.0);
float4 green(0.0, 1.0, 0.0, 1.0); float m1 = smoothstep(300.0, 400.0, length(pixPos.xy)); return mix(red, green, m1); } جຊฤ
جຊฤ
fragment float4 Basic5(float4 pixPos[[position]]) { float4 red(1.0, 0.0, 0.0, 1.0);
float4 green(0.0, 1.0, 0.0, 1.0); float m1 = smoothstep(300.0, 400.0, length(pixPos.xy)); return mix(red, green, m1); } جຊฤ NJYؔ
جຊฤ
fragment float4 Basic6(float4 pixPos[[position]]) { float4 red(1.0, 0.0, 0.0, 1.0);
float4 green(0.0, 1.0, 0.0, 1.0); float4 blue(0.0, 0.0, 1.0, 1.0); float m1 = smoothstep(300.0, 400.0, length(pixPos.xy)); float4 col = mix(red, green, m1); float m2 = step(500.0, length(pixPos.xy)); col = mix(col, blue, m2); return col; } جຊฤ
جຊฤ float m2 = step(500.0, length(pixPos.xy)); col = mix(col,
blue, m2);
جຊςΫχοΫ
ਖ਼نԽ ࠲ඪมͱ
࠲ඪมͱਖ਼نԽ return step(300.0, length(pixPos.xy));
return step(320.0, length(pixPos.xy - float2(568.0, 320.0))); ˞J1IPOF4&ͷ߹ ࠲ඪมͱਖ਼نԽ
ॲཧ ϥελϥΠζ ϑϥάϝϯτॲཧ ೖྗɿྻ ग़ྗɿը૾ όοϑΝ ڞ௨σʔλ γΣʔμ ʔʹόοϑΝΛ௨ͯ͡ڞ௨σʔλΛͤΔ ࠲ඪมͱਖ਼نԽ
ॲཧ ϥελϥΠζ ϑϥάϝϯτॲཧ ೖྗɿྻ ग़ྗɿը૾ όοϑΝ ը໘ղ૾ ղ૾Λ͢ ࠲ඪมͱਖ਼نԽ
// όοϑΝͷ࡞ resolutionBuffer = device.makeBuffer(length: 2 *ɹMemoryLayout<Float>.size, options: []) .
. . // όοϑΝղ૾Λॻ͖ࠐΈ memcpy(resolutionBuffer.contents(), [width, height], 2 * MemoryLayout<Float>.size) . . . // ϑϥάϝϯτγΣʔμʔͷόοϑΝͱͯ͠ઃఆ renderEncoder.setFragmentBuffer(resolutionBuffer, offset: 0, index: 0) ࠲ඪมͱਖ਼نԽ
// όοϑΝͷ࡞ resolutionBuffer = device.makeBuffer(length: 2 *ɹMemoryLayout<Float>.size, options: []) .
. . // όοϑΝղ૾Λॻ͖ࠐΈ memcpy(resolutionBuffer.contents(), [width, height], 2 * MemoryLayout<Float>.size) . . . // ϑϥάϝϯτγΣʔμʔͷόοϑΝͱͯ͠ઃఆ renderEncoder.setFragmentBuffer(resolutionBuffer, offset: 0, index: 0) ࠲ඪมͱਖ਼نԽ
fragment float4 Hogehoge(float4 pixPos [[position]], constant float2& res [[buffer(0)]]) {
. . . } όοϑΝ͔Β͞ΕΔͰ͋Δ͜ͱΛࣔ͢ Ҿଐੑ ࠲ඪมͱਖ਼نԽ
fragment float4 Hogehoge(float4 pixPos [[position]], constant float2& res [[buffer(0)]]) {
. . . } όοϑΝ͔Β͞ΕΔ ࢀরܕ͔ϙΠϯλܕͰड͚औΒͳ͚ΕͳΒͳ͍ ࠲ඪมͱਖ਼نԽ
fragment float4 Hogehoge(float4 pixPos [[position]], constant float2& res [[buffer(0)]]) {
. . . } .4-ͰࢀরܕϙΠϯλܕʹ ΞυϨεۭؒम০ࢠ͕ඞཁ ࠲ඪมͱਖ਼نԽ
fragment float4 CodSys1(float4 pixPos [[position]], constant float2& res[[buffer(0)]]) { float2
uv = (2.0 * pixPos.xy - res)/min(res.x, res.y); uv.y *= -1.0; return step(length(uv), 1.0); } ࠲ඪมͱਖ਼نԽ
࠲ඪมͱਖ਼نԽ
fragment float4 CodSys1(float4 pixPos [[position]], constant float2& res[[buffer(0)]]) { float2
uv = (2.0 * pixPos.xy - res)/min(res.x, res.y); uv.y *= -1.0; return step(length(uv), 1.0); } ࠲ඪมͱਖ਼نԽ
9 8JEUI )FJHIU 8JEUI )FJHIU ϐΫηϧ࠲ඪܥ
pixPos.xy : ࠲ඪมͱਖ਼نԽ
8JEUI )FJHIU 8JEUI )FJHIU ࠲ඪΛഒ͢Δ 2.0
* pixPos.xy ࠲ඪมͱਖ਼نԽ 8JEUI )FJHIU
8JEUI )FJHIU 8JEUI )FJHIU 2.0 *
pixPos.xy - res ղ૾ΛҾ͘ 8JEUI )FJHIU ࠲ඪมͱਖ਼نԽ
(2.0 *
pixPos.xy - res)/min(res.x, res.y) ղ૾ͷখ͍͞ํͰׂΔ ࠲ඪมͱਖ਼نԽ
float2 uv
= (2.0 * pixPos.xy - res)/min(res.x, res.y) uv.y *= -1.0 :࠲ඪΛసͤ͞Δ ࠲ඪมͱਖ਼نԽ
࠲ඪมͱਖ਼نԽ
৽͍͠࠲ඪ VW Ͱݪத৺ɺܘͷԁ return step(length(uv), 1.0); ࠲ඪมͱਖ਼نԽ
࠲ඪมͷߟ͑ํͷίπ ɾͷมͱݟΔ ɾ࠲ඪܥͷมͱݟΔ ՁͳͭͷࢹΛ࣋ͭ͜ͱ ࠲ඪมͱਖ਼نԽ
ྫฏߦҠಈ ͷมͱͯ͠ͷࢹ ࠲ඪܥͷมͱͯ͠ͷࢹ ⃗ t − ⃗ t ⃗ P
+ ⃗ t ࠲ඪมͱਖ਼نԽ
ྫճస ͷมͱͯ͠ͷࢹ ࠲ඪܥͷมͱͯ͠ͷࢹ θ θ R(θ) ⃗ P ࠲ඪมͱਖ਼نԽ
ྫεέʔϦϯά ͷมͱͯ͠ͷࢹ ࠲ඪܥͷมͱͯ͠ͷࢹ sഒ 1/sഒ s ⃗ P ࠲ඪมͱਖ਼نԽ
ɾͷมͱݟΔ ɾ࠲ඪܥͷมͱݟΔ ՁͳͭͷࢹΛ࣋ͭ͜ͱ ࠲ඪมͷߟ͑ํͷίπ ࠲ඪมͱਖ਼نԽ
ۃ࠲ඪͷར༻
ۃ࠲ඪͷར༻ ަ࠲ඪදࣔ x y (x, y)
θ r ۃ࠲ඪදࣔ (r, θ) ۃ࠲ඪͷར༻
fragment float4 Polar1(float4 pixPos [[position]], constant float2 &res[[buffer(0)]]) { float2
uv = (2.0 * pixPos.xy - res)/min(res.x, res.y); uv.y *= -1.0; float theta = atan2(uv.y, uv.x); float threshold = 0.5*sin(5 * theta) + 0.5; return step(length(uv), threshold); } ۃ࠲ඪͷར༻
ۃ࠲ඪͷར༻
θ ภ֯ͷʹΑ͖͍ͬͯ͠Λม͍͑ͯΔ float theta = atan2(uv.y, uv.x); float threshold =
0.5*sin(5 * theta) + 0.5; return step(length(uv), threshold); ۃ࠲ඪͷར༻
θ ͖͍͠ͷม͑ํͰ৭ʑͳܗʹ float theta = atan2(uv.y, uv.x); float threshold =
0.2*sin(5 * theta) + 0.8; return step(length(uv), threshold); ۃ࠲ඪͷར༻
θ ͖͍͠ͷม͑ํͰ৭ʑͳܗʹ float theta = atan2(uv.y, uv.x); float threshold =
0.1*step(sin(20 * theta), 0.0) + 0.9; return step(length(uv), threshold); ۃ࠲ඪͷར༻
Ξχϝʔγϣϯ
ॲཧ ϥελϥΠζ ϑϥάϝϯτॲཧ ೖྗɿྻ ग़ྗɿը૾ Ξχϝʔγϣϯ όοϑΝ ը໘ղ૾ ܦա࣌ؒ͢ όοϑΝ
ܦա࣌ؒ
fragment float4 Animation1(float4 pixPos [[position]], constant float2& res[[buffer(0)]], constant float&
time[[buffer(1)]]) { float2 uv = (2.0 * pixPos.xy - res)/min(res.x, res.y); uv.y *= -1.0; float theta = atan2(uv.y, uv.x) - time; float threshold = 0.2*sin(5 * theta) + 0.8; return step(length(uv), threshold); } Ξχϝʔγϣϯ
fragment float4 Animation1(float4 pixPos [[position]], constant float2& res[[buffer(0)]], constant float&
time[[buffer(1)]]) { float2 uv = (2.0 * pixPos.xy - res)/min(res.x, res.y); uv.y *= -1.0; float theta = atan2(uv.y, uv.x) - time; float threshold = 0.2*sin(5 * theta) + 0.8; return step(length(uv), threshold); } Ξχϝʔγϣϯ
Ξχϝʔγϣϯ
float theta = atan2(uv.y, uv.x); float amp = 0.2 *
sin(time); float threshold = amp*sin(5 * theta) + 0.8; return step(length(uv), threshold); Ξχϝʔγϣϯ
Ξχϝʔγϣϯ
Ξχϝʔγϣϯ
ෳ
fragment float4 Replication1(float4 pixPos [[position]], constant float2& res[[buffer(0)]], constant float&
time[[buffer(1)]]) { float2 uv = (2.0 * pixPos.xy - res)/min(res.x, res.y); uv.y *= -1.0; uv *= 2.0; uv = fract(uv) * 2.0 - 1.0; float theta = atan2(uv.y, uv.x) - time; float threshold = 0.2*sin(5 * theta) + 0.8; return step(length(uv), threshold); } ෳ
ෳ
uv ෳ
2.0 * uv ෳ
fract(2.0 * uv); ෳ
fract(2.0 * uv) * 2.0 - 1.0 ෳ
GSBDUؔ Yͷ খ෦ Λऔಘ͢Δؔ fract(1.5); // 0.5 fract(3.0); // 0.0
fract(-0.1); // 0.9 GSBDU Y ͷάϥϑ T fract(T x) ෳ
Y Yͷάϥϑ ෳ
GSBDU Y Y ͷάϥϑ ෳ
GSBDU
GSBDU ෳ
ෳ fragment float4 Replication1(float4 pixPos [[position]], constant float2& res[[buffer(0)]], constant
float& time[[buffer(1)]]) { float2 uv = (2.0 * pixPos.xy - res)/min(res.x, res.y); uv.y *= -1.0; uv *= 5.0; uv = fract(uv) * 2.0 - 1.0; float theta = atan2(uv.y, uv.x) - time; float threshold = 0.2*sin(5 * theta) + 0.8; return step(length(uv), threshold); }
ෳ
ෳͷࣝผ
fragment float4 Id1(float4 pixPos [[position]], constant float2& res[[buffer(0)]]) { float2
uv = (2.0 * pixPos.xy - res)/min(res.x, res.y); uv.y *= -1.0; uv *= 2.0; uv = fract(uv) * 2.0 - 1.0; return step(length(uv), 1.0); } ෳͷࣝผ
ෳͷࣝผ
fragment float4 Id2(float4 pixPos [[position]], constant float2& res[[buffer(0)]]) { float2
uv = (2.0 * pixPos.xy - res)/min(res.x, res.y); uv.y *= -1.0; uv *= 2.0; float2 id = floor(uv); uv = fract(uv) * 2.0 - 1.0; float threshold = exp(-length(id)); return step(length(uv), threshold); } ෳͷࣝผ
ෳͷࣝผ
fragment float4 Id2(float4 pixPos [[position]], constant float2& res[[buffer(0)]]) { float2
uv = (2.0 * pixPos.xy - res)/min(res.x, res.y); uv.y *= -1.0; uv *= 2.0; float2 id = floor(uv); uv = fract(uv) * 2.0 - 1.0; float threshold = exp(-length(id)); return step(length(uv), threshold); } ෳͷࣝผ
qPPSؔ চؔɹYΛ͑ͳ͍࠷େͷΛฦ͢ floor(1.5); // 1.0 floor(3.0); // 3.0 floor(-0.1); //
-1.0 T floor(T x) qPPS Y ͷάϥϑ ෳͷࣝผ
2.0 * uv ෳͷࣝผ
floor(2.0 * uv)
ෳͷࣝผ
ෳͷࣝผ fragment float4 Id2(float4 pixPos [[position]], constant float2& res[[buffer(0)]]) {
float2 uv = (2.0 * pixPos.xy - res)/min(res.x, res.y); uv.y *= -1.0; uv *= 2.0; float2 id = floor(uv); uv = fract(uv) * 2.0 - 1.0; float threshold = exp(-length(id)); return step(length(uv), threshold); }
ෳͷࣝผ
ෳͷࣝผ
ٙࣅཚ
ٙࣅཚ TJO Y GSBDU TJO Y
ٙࣅཚ GSBDU TJO Y GSBDU TJO Y
ٙࣅཚ GSBDU TJO Y GSBDU TJO Y
ٙࣅཚ GSBDU TJO Y GSBDU TJO Y
ٙࣅཚ GSBDU TJO Y
float N11(float v) { return fract(sin(v)*43758.5453123); } fragment float4 Noise1(float4
pixPos [[position]], constant float2& res[[buffer(0)]]) { float2 uv = (2.0 * pixPos.xy - res)/min(res.x, res.y); uv *= -1.0; return N11(uv.x); } ٙࣅཚ
ٙࣅཚ
float N21(float2 p) { return N11(dot(p, float2(12.9898, 78.233))); } fragment
float4 Noise2(float4 pixPos [[position]], constant float2& res[[buffer(0)]]) { float2 uv = (2.0 * pixPos.xy - res)/min(res.x, res.y); uv *= -1.0; return N21(uv); } ٙࣅཚ ˞EPU W W ɿϕΫτϧͷੵΛऔΔؔ
ٙࣅཚ
fragment float4 Noise3(float4 pixPos [[position]], constant float2& res[[buffer(0)]]) { float2
uv = (2.0 * pixPos.xy - res)/min(res.x, res.y); uv *= -1.0; uv *= 4.0; float2 id = floor(uv); return N21(id); } ٙࣅཚ
ٙࣅཚ
fragment float4 Noise4(float4 pixPos [[position]], constant float2& res[[buffer(0)]]) { float2
uv = (2.0 * pixPos.xy - res)/min(res.x, res.y); uv *= -1.0; uv *= 4.0; float2 id = floor(uv); uv = fract(uv)*2.0 - 1.0; float r = N21(id); return step(length(uv), r); } ٙࣅཚ
ٙࣅཚ
ٙࣅཚ
৭
fragment float4 Color1(float4 pixPos [[position]], constant float2& res[[buffer(0)]]) { float2
uv = (2.0 * pixPos.xy - res)/min(res.x, res.y); uv *= -1.0; float2 id = floor(4*uv); float r = N21(id); float g = N21(id + float2(123.34, 32.34)); float b = N21(id + float2(23.0, 342.0)); return float4(r, g, b, 1.0); } ৭
৭
৭ )47৭ۭؒΛ͏ IUUQTKBXJLJQFEJBPSHXJLJ)47৭ۭؒ
float3 hsv2rgb(float h, float s, float v) { float3 a
= fract(h + float3(0.0, 2.0, 1.0)/3.0)*6.0-3.0; a = clamp(abs(a) - 1.0, 0.0, 1.0) - 1.0; a = a*s + 1.0; return a*v; } ৭ ৭૬ ࠼ ໌ )47৭ۭؒΛ͏ ˞I T Wશͯʙͷ
fragment float4 Color2(float4 pixPos [[position]], constant float2& res[[buffer(0)]]) { float2
uv = (2.0 * pixPos.xy - res)/min(res.x, res.y); uv *= -1.0; float2 id = floor(4*uv); float h = N21(id); float3 rgb = hsv2rgb(h, 1.0, 1.0); return float4(rgb, 1.0); } ৭
৭
fragment float4 Color3(float4 pixPos [[position]], constant float2& res[[buffer(0)]]) { float2
uv = (2.0 * pixPos.xy - res)/min(res.x, res.y); uv *= -1.0; float2 id = floor(4*uv); float h = N21(id); float3 rgb = hsv2rgb(h, 0.7, 1.0); return float4(rgb, 1.0); } ৭
৭
fragment float4 Color4(float4 pixPos [[position]], constant float2& res[[buffer(0)]]) { float2
uv = (2.0 * pixPos.xy - res)/min(res.x, res.y); uv *= -1.0; float2 id = floor(4*uv); float h = N21(id); float3 rgb = hsv2rgb(fract(h + 0.2*time), 0.7, 1.0); return float4(rgb, 1.0); } ৭
৭
৭
ۭؒΛΊΔ
float grid(float2 p) { float g = 0.0; p =
fract(p); g = max(g, step(0.98, p.x)); g = max(g, step(0.98, p.y)); return g; } fragment float4 Distorted1(float4 pixPos [[position]], constant float2& res[[buffer(0)]]) { float2 uv = (2.0 * pixPos.xy - res)/min(res.x, res.y); uv.y *= -1.0; uv *= 2; float4 red(1.0, 0.0, 0.0, 1.0); return red * grid(uv); } ۭؒΛΊΔ
ۭؒΛΊΔ
fragment float4 Distorted2(float4 pixPos [[position]], constant float2& res[[buffer(0)]]) { float2
uv = (2.0 * pixPos.xy - res)/min(res.x, res.y); uv.y *= -1.0; uv *= 2; uv.x += sin(uv.y); float4 red(1.0, 0.0, 0.0, 1.0); return red * grid(uv); } ۭؒΛΊΔ
ۭؒΛΊΔ
fragment float4 Distorted3(float4 pixPos [[position]], constant float2& res[[buffer(0)]]) { float2
uv = (2.0 * pixPos.xy - res)/min(res.x, res.y); uv.y *= -1.0; uv *= 2; uv.x += sin(uv.y); uv.y += sin(uv.x); float4 red(1.0, 0.0, 0.0, 1.0); return red * grid(uv); } ۭؒΛΊΔ
ۭؒΛΊΔ
fragment float4 Distorted4(float4 pixPos [[position]], constant float2& res[[buffer(0)]], constant float&
time[[buffer(1)]]) { float2 uv = (2.0 * pixPos.xy - res)/min(res.x, res.y); uv.y *= -1.0; uv *= 2; uv.x += 0.5 * sin(uv.y + time) + 0.5; uv.y += 0.5 * sin(uv.x + time) + 0.5; float4 red(1.0, 0.0, 0.0, 1.0); return red * grid(uv); } ۭؒΛΊΔ
ۭؒΛΊΔ
fragment float4 Distorted5(float4 pixPos [[position]], constant float2& res[[buffer(0)]], constant float&
time[[buffer(1)]]) { float2 uv = (2.0 * pixPos.xy - res)/min(res.x, res.y); uv.y *= -1.0; uv *= 2; uv *= 1.0 + (0.1 * sin(time) + 0.1) * length(uv); float4 red(1.0, 0.0, 0.0, 1.0); return red * grid(uv); } ۭؒΛΊΔ
ۭؒΛΊΔ
fragment float4 Distorted6(float4 pixPos [[position]], constant float2& res[[buffer(0)]], constant float&
time[[buffer(1)]]) { float2 uv = (2.0 * pixPos.xy - res)/min(res.x, res.y); uv.y *= -1.0; uv *= 2; uv.x += 0.5 * sin(uv.y + time) + 0.5; uv.y += 0.5 * sin(uv.x + time) + 0.5; uv = fract(uv); uv -= 0.5; float theta = atan2(uv.y, uv.x); float threshold = 0.25*sin(5*theta)+0.25; return step(length(uv), threshold); } ۭؒΛΊΔ
ۭؒΛΊΔ
ςΫενϟ
ॲཧ ϥελϥΠζ ϑϥάϝϯτॲཧ ೖྗɿྻ ग़ྗɿը૾ ςΫενϟ όοϑΝ ը໘ղ૾ ςΫενϟͤΔ όοϑΝ
ܦա࣌ؒ ςΫενϟ
// όοϑΝͷ࡞ imageTexture = try! textureLoader.newTexture(name: “icon", scaleFactor: 1.0, bundle:
nil, options: [.SRGB: false]) . . . // ϑϥάϝϯτγΣʔμʔͷόοϑΝͱͯ͠ઃఆ renderEncoder.setFragmentTexture(imageTexture, index: 0) ςΫενϟ
// όοϑΝͷ࡞ imageTexture = try! textureLoader.newTexture(name: “icon", scaleFactor: 1.0, bundle:
nil, options: [.SRGB: false]) . . . // ϑϥάϝϯτγΣʔμʔͷόοϑΝͱͯ͠ઃఆ renderEncoder.setFragmentTexture(imageTexture, index: 0) ςΫενϟ
fragment float4 Hogehoge(float4 pixPos [[position]], constant float2& res[[buffer(0)]], texture2d<float> tex[[texture(0)]])
{ . . . } ςΫενϟ
fragment float4 Texture1(float4 pixPos [[position]], constant float2& res[[buffer(0)]], texture2d<float> tex[[texture(0)]])
{ float2 uv = (2.0 * pixPos.xy - res)/min(res.x, res.y); uv.y *= -1.0; constexpr sampler s(address::clamp_to_edge, filter::linear); return image.sample(s, uv); } ςΫενϟ
ςΫενϟ
ςΫενϟ
ςΫενϟ
fragment float4 Texture2(float4 pixPos [[position]], constant float2& res[[buffer(0)]], texture2d<float> tex[[texture(0)]])
{ float2 uv = (2.0 * pixPos.xy - res)/min(res.x, res.y); // uv.y *= -1.0; constexpr sampler s(address::clamp_to_edge, filter::linear); return image.sample(s, uv); } ςΫενϟ
ςΫενϟ
fragment float4 Texture2(float4 pixPos [[position]], constant float2& res[[buffer(0)]], texture2d<float> tex[[texture(0)]])
{ float2 uv = (2.0 * pixPos.xy - res)/min(res.x, res.y); // uv.y *= -1.0; constexpr sampler s(address::clamp_to_edge, filter::linear); return image.sample(s, uv); } ςΫενϟ
ςΫενϟ
fragment float4 Texture3(float4 pixPos [[position]], constant float2& res[[buffer(0)]], texture2d<float> tex[[texture(0)]])
{ float2 uv = (2.0 * pixPos.xy - res)/min(res.x, res.y); constexpr sampler s(address::repeat, filter::linear); return image.sample(s, uv); } ςΫενϟ
ςΫενϟ
address::mirrored_repeat address::clamp_to_zero ςΫενϟ
fragment float4 Texture4(float4 pixPos [[position]], constant float2& res[[buffer(0)]], texture2d<float> tex[[texture(0)]])
{ float2 uv = (2.0 * pixPos.xy - res)/min(res.x, res.y); constexpr sampler s(address::repeat, filter::linear); float idY = floor(uv.y * 40); float d = N11(idY); float offset = 0.1 * step(0.8, d); uv.x += offset; return image.sample(s, uv); } ςΫενϟ
ςΫενϟ
ΠϯλϥΫγϣϯ
ॲཧ ϥελϥΠζ ϑϥάϝϯτॲཧ ೖྗɿྻ ग़ྗɿը૾ ΠϯλϥΫγϣϯ όοϑΝ ը໘ղ૾ όοϑΝ ܦա࣌ؒ
ςΫενϟ
ॲཧ ϥελϥΠζ ϑϥάϝϯτॲཧ ೖྗɿྻ ग़ྗɿը૾ όοϑΝ ը໘ղ૾ όοϑΝ ܦա࣌ؒ ςΫενϟ
όοϑΝ Ճ όοϑΝ ϚΠΫԻྔ ςΫενϟ Χϝϥը૾ όοϑΝ ࠷ޙʹ৮ͬͨ ΠϯλϥΫγϣϯ
fragment float4 Sample(float4 pixPos [[position]], constant float2& res[[buffer(0)]], constant float&
time[[buffer(1)]], constant float& volume[[buffer(2)]], constant float& accel[[buffer(3)]], constant float2& touch[[buffer(4)]], texture2d<float> tex[[texture(0)]], texture2d<float> cam[[texture(1)]]) { . . . } ΠϯλϥΫγϣϯ
%&.0
ϨΠϚʔνϯά εϑ ΟΞτϨʔγϯά
ϨΠϚʔνϯά
ϨΠϚʔνϯά ΧϝϥɾεΫϦʔϯɾΦϒδΣΫτΛԾఆ͢Δ
ϨΠϚʔνϯά ͋ΔϐΫηϧʹண
ϐΫηϧͷ৭֎ଆ͔Βೖ͖ͬͯͨޫ ϨΠϚʔνϯά
ޫ͕Ͳ͔͜Βདྷͨͷ͔ΛٯʹḷΔ ˠϨΠτϨʔγϯά ϨΠϚʔνϯά
ϨΠϚʔνϯά
ϨΠϚʔνϯά
ϨΠϚʔνϯά
ϨΠϚʔνϯά
࠷ڑΛऔಘʁ Ͳ͏ͬͯʁ ϨΠϚʔνϯά
ڑͰϞσϧܗঢ়ΛܾΊΔ ϨΠϚʔνϯά
f(P) ϨΠϚʔνϯά Λೖྗ͠ڑΛग़ྗ͢Δؔ f P
f(P) = 0 ͱͳΔͷू߹ʂ Ϟσϧͷܗঢ় ϨΠϚʔνϯά f(P) P
IUUQJRVJMF[MFTPSHXXXBSUJDMFTEJTUGVODUJPOTEJTUGVODUJPOTIUN ϨΠϚʔνϯά
fͷ໘ͱަ͢Δ εΧϥʔͷޯ f gradf gradf ϨΠϚʔνϯά ɿϕΫτϧΛฦؔ͢
NBY " # NBY # " ڑؔ"Ͱఆٛ͞ΕΔܗঢ় ڑؔ#Ͱఆٛ͞ΕΔܗঢ় NBY "
# NJO " # ϨΠϚʔνϯά
l3BZNBSDIJOHJO3BZNBSDIJOHzDSFBUFECZLBOFUB !LBOFUBBBBB IUUQTXXXTIBEFSUPZDPNWJFXXM4(8Z ϨΠϚʔνϯά
ӍཻγΣʔμ ʔղઆ
ӍཻγΣʔμ ʔղઆ ॎԣൺ͕ҟͳΔάϦουΛ࡞Δ
ӍཻγΣʔμ ʔղઆ άϦουʹԁΛඳ͘
ӍཻγΣʔμ ʔղઆ ԁΛΞχϝʔγϣϯͤ͞Δ
ӍཻγΣʔμ ʔղઆ άϦουಈ͔͢
ӍཻγΣʔμ ʔղઆ άϦουʹখ͍͞Λඳ͘
ӍཻγΣʔμ ʔղઆ େ͖͍ԁΑΓ্ͷҐஔͰখ͍͞ԁʹϚεΫΛ͔͚Δ
ӍཻγΣʔμ ʔղઆ খ͍͞ԁʹάϥσʔγϣϯΛ͔͚Δ
ӍཻγΣʔμ ʔղઆ େ͖͍ԁΛগ͠·ͤͯԼଆ͕গ͠େ͖͍ܗʹ͢Δ
ӍཻγΣʔμ ʔղઆ ࠨӈํʹΞχϝʔγϣϯͤ͞Δ
ӍཻγΣʔμ ʔղઆ άϦουຖʹλΠϛϯάͱҐஔΛͣΒ͢
ӍཻγΣʔμ ʔղઆ ௨աҐஔۙล͚ͩʹάϥσʔγϣϯϚεΫΛ࡞Δ
ӍཻγΣʔμ ʔղઆ ΧϝϥೖྗΛςΫενϟͱͯ͠ೖྗ͠ ӍཻͷՕॴαϯϓϦϯά͢ΔॴΛͣΒ͢
ӍཻγΣʔμ ʔղઆ άϥσʔγϣϯϚεΫʹԠͯ͡΅͔͢
ӍཻγΣʔμ ʔղઆ 5IF"SUPG$PEF IUUQTXXXZPVUVCFDPNDIBOOFM6$D"M5RE[*%B/95[XY+9H
4IBEFS"SU4BNQMFT IUUQTHJUIVCDPNUBLBUTV4IBEFS"SU4BNQMFT
ࢀߟ ɾ5IF#PPLPG4IBEFS ɹIUUQTUIFCPPLPGTIBEFSTDPN ɾ*OJHP2VJMF[ࢯͷαΠτ ɹIUUQJRVJMF[MFTPSH ɾ5IF"SUPG$PEF ɹIUUQTXXXZPVUVCFDPNDIBOOFM6$D"M5RE[*%B/95[XY+9H ɾXHMEPSH(-4-DPOUFOUT ɹIUUQTXHMEPSHEHMTM ɾָ͍͠ʂ6OJUZγΣʔμʔ͓ֆඳ͖ೖʂ
ɹIUUQTUDPLX3"/MV$
&OKPZ4IBEFS 1SPHSBNNJOH