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
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
650
作ってわかるレンダリングパイプライン〜CPUで3D描画〜
takatsu
4
2.2k
Other Decks in Technology
See All in Technology
Turing × atmaCup #18 - 1st Place Solution
hakubishin3
0
460
KnowledgeBaseDocuments APIでベクトルインデックス管理を自動化する
iidaxs
1
250
CustomCopを使ってMongoidのコーディングルールを整えてみた
jinoketani
0
220
ガバメントクラウドのセキュリティ対策事例について
fujisawaryohei
0
520
LINE Developersプロダクト(LIFF/LINE Login)におけるフロントエンド開発
lycorptech_jp
PRO
0
120
NilAway による静的解析で「10 億ドル」を節約する #kyotogo / Kyoto Go 56th
ytaka23
3
370
TSKaigi 2024 の登壇から広がったコミュニティ活動について
tsukuha
0
160
alecthomas/kong はいいぞ / kamakura.go#7
fujiwara3
1
300
1等無人航空機操縦士一発試験 合格までの道のり ドローンミートアップ@大阪 2024/12/18
excdinc
0
140
NW-JAWS #14 re:Invent 2024(予選落ち含)で 発表された推しアップデートについて
nagisa53
0
250
Storage Browser for Amazon S3
miu_crescent
1
110
ブラックフライデーで購入したPixel9で、Gemini Nanoを動かしてみた
marchin1989
1
510
Featured
See All Featured
Keith and Marios Guide to Fast Websites
keithpitt
410
22k
Designing for Performance
lara
604
68k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
169
50k
Embracing the Ebb and Flow
colly
84
4.5k
Optimising Largest Contentful Paint
csswizardry
33
3k
BBQ
matthewcrist
85
9.4k
Thoughts on Productivity
jonyablonski
67
4.4k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
Docker and Python
trallard
41
3.1k
Building Flexible Design Systems
yeseniaperezcruz
327
38k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
45
2.2k
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