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
ta_ka_tsu
September 06, 2019
Technology
6.5k
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
810
作ってわかるレンダリングパイプライン〜CPUで3D描画〜
takatsu
4
2.5k
Other Decks in Technology
See All in Technology
5分でわかるDuckDB Quack
chanyou0311
4
300
デジタル・デザイン:次の50年を描く「進化する青写真」
y150saya
0
800
AIで政治は変わるのか? — 中高生と考えたAI時代の民主主義(東海高校サタデープログラム)
eitarosuda
0
360
AWS Summit Japan 2026の振り返りと2027へ向けて / AWS Summit Japan 2026 Recap and Prospects for 2027
kaminashi
1
180
AIをフル活用してオンコール機能のプロトタイプを2日で作った話 / Building an AI-Powered On-Call Prototype in Just Two Days
nari_ex
0
170
勉強会企画をアプリで構造化してみた 〜そこで見えた、AIとの付き合い方〜 / I've structured a study group plan using an app.
pauli
0
290
ゼロをイチにする仕事が終わったあと
smasato
0
250
10x Speed With QA Agent Platform - How we scaled adoption from individual effort to organizational capability
lycorptech_jp
PRO
0
120
Docker Desktop不要の時代が来る? WSL標準の「wslc」で Linuxコンテナを動かしてみた.
ueponx
0
570
Terraform 101 (初心者向け) 資料
shuadachi
0
160
NDIAS CTF 2026 問題解説会資料
bata_24
0
170
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
11k
Featured
See All Featured
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
340
Facilitating Awesome Meetings
lara
57
7k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
500
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
430
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
320
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Rails Girls Zürich Keynote
gr2m
96
14k
Paper Plane (Part 1)
katiecoart
PRO
0
9.5k
Building AI with AI
inesmontani
PRO
1
1.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