Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
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
9
5.4k
めくるめくシェーダーアートの世界/The World of Dazzling Shader Art
iOSDC2019
ta_ka_tsu
September 06, 2019
Tweet
Share
More Decks by ta_ka_tsu
See All by ta_ka_tsu
AVSpeechSynthesizerにひたすら読ませる
takatsu
0
640
作ってわかるレンダリングパイプライン〜CPUで3D描画〜
takatsu
4
2.2k
Other Decks in Technology
See All in Technology
深層学習のリペア技術の最新動向と実際 / DNN Repair Techniques for AI Performance Alignment for Safety Requirements
ishikawafyu
0
220
日本全国・都市3D化プロジェクト「PLATEAU」とデータ変換OSS「PLATEAU GIS Converter」の公開
nokonoko1203
3
320
農業用ダム監視を目的とした衛星SAR 干渉解析の適用性について
osgeojp
0
120
ソフトウェアエンジニアとしてキャリアの螺旋を駆け上がる方法 - 経験と出会いが人生を変える / Career-Anchor-Drive
soudai
1
200
【ASW21-01】STAMPSTPAで導き出した課題に対する対策立案手法の提案
hianraku9498
0
310
検証と資産化を形にするプロダクト組織へ/tapple_pmconf2024
corin8823
1
4.1k
ポストモーテムレビューをブレームレスに運営し有効な改善アクションを引き出すために必要だったこと / What is needed to operate postmortem blamelessly and elicit improvement actions
yamaguchitk333
0
160
LINEヤフーにおける超大規模プラットフォーム実現への挑戦と学び / Challenges and Lessons in Building an Ultra-Large-Scale Platform at LY Corporation
hhiroshell
2
1k
ゆるSRE勉強会 #8 組織的にSREが始まる中で意識したこと
abnoumaru
2
900
sre本読んだ感想
pisakun
0
190
ONNX推論クレートの比較と実装奮闘記
emergent
0
280
GAS × Discord bot × Gemini で作ったさいきょーの情報収集ツール
ysknsid25
1
510
Featured
See All Featured
Building Better People: How to give real-time feedback that sticks.
wjessup
364
19k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
169
50k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
0
67
Producing Creativity
orderedlist
PRO
341
39k
Imperfection Machines: The Place of Print at Facebook
scottboms
266
13k
Bash Introduction
62gerente
608
210k
Mobile First: as difficult as doing things right
swwweet
222
8.9k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
Adopting Sorbet at Scale
ufuk
73
9.1k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
27
880
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