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
初心者向けシェーダ講習会 第1回
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Pocol
March 31, 2020
Programming
690
0
Share
初心者向けシェーダ講習会 第1回
社内向けにやる予定だったシェーダ講習会の資料です。
ガチ勢お断り。
Pocol
March 31, 2020
More Decks by Pocol
See All by Pocol
最新のDirectX12で使えるレイトレ周りの機能追加について
projectasura
0
710
中級グラフィックス入門~効率的なメッシュレット描画~
projectasura
5
6.7k
Hardware-Raytracingを用いたフォトンマッピングの実装について
projectasura
1
830
ReSTIRについて
projectasura
6
3k
初心者向けシェーダ講習会 第2回
projectasura
0
490
中級グラフィックス入門~色彩工学編~
projectasura
21
12k
中級グラフィックス入門 ~シャドウマッピング総まとめ~
projectasura
5
4.7k
Other Decks in Programming
See All in Programming
今からFlash開発できるわけないじゃん、ムリムリ! (※ムリじゃなかった!?)
arkw
0
180
「速くなった気がする」をデータで疑う
senleaf24
0
130
Smarter Angular mit Transformers.js & Prompt API
christianliebel
PRO
1
110
LM Linkで(非力な!)ノートPCでローカルLLM
seosoft
0
320
ポーリング処理廃止によるイベント駆動アーキテクチャへの移行
seitarof
3
1.3k
AI-DLC 入門 〜AIコーディングの本質は「コード」ではなく「構造」〜 / Introduction to AI-DLC: The Essence of AI Coding Is Not “Code” but “Structure”
seike460
PRO
0
160
実践ハーネスエンジニアリング #MOSHTech
kajitack
7
5.4k
20260313 - Grafana & Friends Taipei #1 - Kubernetes v1.36 的開發雜記:那些困在 Alpha 加護病房太久的 Metrics
tico88612
0
250
Cyrius ーLinux非依存にコンテナをネイティブ実行する専用OSー
n4mlz
0
270
一度始めたらやめられない開発効率向上術 / Findy あなたのdotfilesを教えて!
k0kubun
3
2.7k
へんな働き方
yusukebe
6
2.9k
安いハードウェアでVulkan
fadis
1
870
Featured
See All Featured
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.8k
My Coaching Mixtape
mlcsv
0
91
The SEO Collaboration Effect
kristinabergwall1
0
410
How to Think Like a Performance Engineer
csswizardry
28
2.5k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
AI: The stuff that nobody shows you
jnunemaker
PRO
4
500
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
190
Designing Experiences People Love
moore
143
24k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
700
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
1.9k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.2k
How to build a perfect <img>
jonoalderson
1
5.3k
Transcript
初心者向け シェーダ講習会 第1回目 Presented By Pocol
目的 • アーティスト・プログラマー向けにシェーダの基礎を解説します。 • シェーダを触れるテクニカルアーティストや シェーダを触れるプログラマーの増員・増強が目的です。 • 最終目標として, Substance Painterでカスタムシェーダを作れることを目指します。
• 今回のシェーダ講習では GLSL を使用します。
おしながき • シェーダって何? • 開発環境整備 • はじめてのシェーダ! • テクスチャマッピングをしてみよう! •
UVアニメーションさせよう!
シェーダってなに? Shading 陰影付けをする処理をシェーディング(Shading)と言います。 シェーダ(Shader)とは元来は陰影付けを行うためのプログラムを指します。 現在では,陰影付け以外の用途にも使われるようになっています。
シェーダって何することができるの? • 色を付けるための計算ができる。 • 色を付けるための計算結果が出力できる。 「シェーダ」って聞くと, なんでも万能な魔法のように誤解しているかもしれませんが, 基本的にはこの2つが本来のメインです。
シェーダモデル • シェーダも時代と共に進化を遂げてきました。 • 時代が進むにつれて,使えるシェーダの機能や使えるシェーダの種類が 増えました。 • シェーダが使える機能セットのことを 「シェーダモデル (Shader
Model)」と呼びます。 • 現在最新のシェーダモデルは6.5です。 https://microsoft.github.io/DirectX-Specs/d3d/HLSL_ShaderModel6_5.html
シェーダモデルが違うとどうなの? • 使える機能や,シェーダの種類が異なります。 Vertex Shader Pixel Shader Vertex Shader Geometry
Shader Pixel Shader Vertex Shader Hull Shader Domain Shader Geometry Shader Pixel Shader Compute Shader Amplification Shader Mesh Shader Pixel Shader Compute Shader 今回のシェーダ講習会ではピクセルシェーダのみ使用します 使える機能やシェーダの種類について詳しく知りたい方はMicrosoft のドキュメント等を参照してください。 https://docs.microsoft.com/en-us/windows/desktop/direct3dhlsl/dx-graphics-hlsl
開発環境の整備(1) • Webブラウザ上でシェーダを書きます。 WebGLに対応しているブラウザが必要となります。 今回は,Google Chromeを使うので, あらかじめインストールしておいてください。 https://www.google.com/intl/ja/chrome/ • 次に
ShaderToyというサイト上でシェーダを書きます。 以下のページにGoogle Chromeでアクセスしてください。 https://www.shadertoy.com/new
開発環境の整備(2) • サイトにアクセスできれば以下のような画面が表示されているはずです。
シェーダを書くところ 実行結果が表示される ところ
はじめてのシェーダ!(1) まずは第一歩として,好きな色を出力シェーダに変えてみましょう。 シェーダを次のように書き換えます。 void mainImage( out vec4 fragColor, in vec2
fragCoord ) { // Normalized pixel coordinates (from 0 to 1) vec2 uv = fragCoord/iResolution.xy; // 赤を出力 vec3 col = vec3(1.0, 0.0, 0.0); // Output to screen fragColor = vec4(col, 1.0); }
はじめてのシェーダ!(2) 書き換えができたら,画面下のコンパイルボタンを押します。 出力結果が赤色になれば 成功です!!
シェーダ解説 void mainImage( out vec4 fragColor, in vec2 fragCoord )
{ // Normalized pixel coordinates (from 0 to 1) vec2 uv = fragCoord/iResolution.xy; // 赤を出力 vec3 col = vec3(1.0, 0.0, 0.0); // Output to screen fragColor = vec4(col, 1.0); } RGBに相当 画面に出力する色
シェーダ解説 void mainImage( out vec4 fragColor, in vec2 fragCoord )
{ // Normalized pixel coordinates (from 0 to 1) vec2 uv = fragCoord/iResolution.xy; // 赤を出力 vec3 col = vec3(1.0, 0.0, 0.0); // Output to screen fragColor = vec4(col, 1.0); } RGBの値 画面に出力する色 A=1.0にしてRGBAとして出力
テクスチャマッピングをしてみよう! • 単色では面白み無いので, 画像を出力できるようにしてみましょう。 1 2 4 3 Polygon1 Polygon2
u v 0 1 1
3次元でも同じです。 • 画像を張り付けるためには ポリゴン上で対応する箇所を示すためのテクスチャ座標が必要です。 CG World Entry.jpより引用 https://entry.cgworld.jp/terms/UV%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0.html
テクスチャマッピングには… 画像 1 2 4 3 (0, 1) (1, 1)
(1, 0) (0, 0) テクスチャ座標 が必要です。
シェーダでは… 画像 1 2 4 3 (0, 1) (1, 1)
(1, 0) (0, 0) テクスチャ座標 texture( iChannel0, uv );
クリック テクスチャ選択画面が表示されるようになります。 テクスチャは決められたものしか選択できません。
選択したテクスチャが表示されるようになります。 テクスチャは最大で4つまで設定できます。
早速表示してみよう • 最初に作ったシェーダを書き換えます。 vec3(1.0, 0.0, 0.0); texture(iChannel0, uv).rgb; 赤色 画像から取った色
RGBだけ抜き出し 先ほどは赤色を出力していましたが, これをtexture()という命令を使って,設定した画像からの色を出力するように書き換えます。
テクスチャマッピングのシェーダ 最終的なシェーダは次のようになります。 void mainImage( out vec4 fragColor, in vec2 fragCoord
) { // Normalized pixel coordinates (from 0 to 1) vec2 uv = fragCoord/iResolution.xy; // 画像から取った色を出力 vec3 col = texture(iChannel0, uv).rgb; // Output to screen fragColor = vec4(col, 1.0); }
UVアニメーションさせよう! • 最後にUVアニメーションを実装してみます。 • UVアニメーションはその名の通り,UVつまり テクスチャ座標を変化させることによってアニメーションする方法です。 • まずは,先ほど作ったシェーダを早速書き換えてみましょう。 uv の値を
0.2 だけずらして実行してみましょう。 texture(iChannel0, uv + 0.2).rgb; 0.2だけずらす
実行結果 ちょっとずれるようにできました。
さらにずらしてみる • 0.2だったものを,0.3, 0.4, 0.5…としてみると次のようになります。
時間変化するようにしてみる • テクスチャ座標を加算していくことで, 表示画像がだんだんとずれる様子が分かるようになりました。 • 今は,直接0.2,0.3, 0.4と指定しましたが, この代わりに時間変化で値が変わるようにしてみましょう。 • ShaderToyには
”iTime” という用意されているタイマーがあります。 これを使ってスクロールさせてみます。 texture(iChannel0, uv + iTime).rgb; 時間変化でずらす
UVスクロールのシェーダ • 簡単なUVスクロールのシェーダは次のようになります. void mainImage( out vec4 fragColor, in vec2
fragCoord ) { // Normalized pixel coordinates (from 0 to 1) vec2 uv = fragCoord/iResolution.xy; // 時間変化で画像から取る色を変える vec3 col = texture(iChannel0, uv + iTime).rgb; // Output to screen fragColor = vec4(col, 1.0); }
X方向のみのUVスクロールのシェーダ • X方向にだけスクロールさせたい場合は次のようになります void mainImage( out vec4 fragColor, in vec2
fragCoord ) { // Normalized pixel coordinates (from 0 to 1) vec2 uv = fragCoord/iResolution.xy; uv.x += iTime; // 時間変化で画像から取る色を変える vec3 col = texture(iChannel0, uv).rgb; // Output to screen fragColor = vec4(col, 1.0); }
Y方向のみのUVスクロールのシェーダ • Y方向にだけスクロールさせたい場合は次のようになります void mainImage( out vec4 fragColor, in vec2
fragCoord ) { // Normalized pixel coordinates (from 0 to 1) vec2 uv = fragCoord/iResolution.xy; uv.y += iTime; // 時間変化で画像から取る色を変える vec3 col = texture(iChannel0, uv).rgb; // Output to screen fragColor = vec4(col, 1.0); }
左右に揺らす • X方向に行ったり来たりさせる場合は sin() を使って変化させます。 void mainImage( out vec4 fragColor,
in vec2 fragCoord ) { // Normalized pixel coordinates (from 0 to 1) vec2 uv = fragCoord/iResolution.xy; uv.x += sin(iTime); // 時間変化で画像から取る色を変える vec3 col = texture(iChannel0, uv).rgb; // Output to screen fragColor = vec4(col, 1.0); }
sin()って何? • 正弦波です。 図にすると次のようになります。 • 高校1年の数学で習います(文系・理系共通)
今日の宿題 ・次の動画のように画面端が波のようにうねるUVアニメーションを作ってください。
実装例
本日はここまで! 次回は • 宿題の解説 • ブラー処理 • シェーダの書き方 について説明を行います。