Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
めくるめくシェーダーアートの世界/The World of Dazzling Shader Art
Search
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
830
作ってわかるレンダリングパイプライン〜CPUで3D描画〜
takatsu
4
2.5k
Other Decks in Technology
See All in Technology
続・ソフトウェアアーキテクトのための意思決定術: Decision Readiness, Revisited — When AI Changes the Economics of Software Architecture
snoozer05
PRO
3
700
アクセラレーターで実現するServiceNow活用の高速化 / ServiceNow World Forum 2026
visional_engineering_and_design
0
120
ひとりで始めた AI駆動開発、チームに広げて何が変わったのか
kenichiodo
1
210
渡米前の準備を制す!re:Invent 2026徹底準備術 / The Ultimate Preparation Guide for re:Invent 2026
yuj1osm
1
510
構造で守らせる データ・法務・セキュリティ・開発チームとつくる AI時代のデータガバナンスとデータ基盤のリアル
legalontechnologies
PRO
3
770
AI Search (Foundry IQ) におけるRAGデータの準備と配置
ryomaru0825
1
140
E2Eってつらくないですか?E2Eの管理コストを下げる手段とその実践
akaboshinit
6
2.9k
2拠点SRE活動始めてみた | sogaoh's LT @ ホンマでっかSRE勉強会 #3
sogaoh
PRO
0
230
Copilot Coworkで「みのるん式」やってみた
minorun365
PRO
2
1.3k
キヨさん、67歳。AIコーディングエージェントに挑む
happysamurai294
0
140
Agent Loopを組み込んだ アンビエントなAI機能を実現する / Ambient AI fetures with Agent Loop
nekorush14
0
140
コードレビューをなくして見えたもの
henteko
0
130
Featured
See All Featured
For a Future-Friendly Web
brad_frost
184
11k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
580
Discover your Explorer Soul
emna__ayadi
2
1.3k
Why Our Code Smells
bkeepers
PRO
340
58k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
A designer walks into a library…
pauljervisheath
211
25k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
3.7k
ラッコキーワード サービス紹介資料
rakko
5
5.6M
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
Writing Fast Ruby
sferik
630
63k
Skip the Path - Find Your Career Trail
mkilby
1
280
Joys of Absence: A Defence of Solitary Play
codingconduct
1
570
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