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
Pocol
March 31, 2020
Programming
0
650
初心者向けシェーダ講習会 第1回
社内向けにやる予定だったシェーダ講習会の資料です。
ガチ勢お断り。
Pocol
March 31, 2020
Tweet
Share
More Decks by Pocol
See All by Pocol
最新のDirectX12で使えるレイトレ周りの機能追加について
projectasura
0
460
中級グラフィックス入門~効率的なメッシュレット描画~
projectasura
5
4.9k
Hardware-Raytracingを用いたフォトンマッピングの実装について
projectasura
0
720
ReSTIRについて
projectasura
5
2.7k
初心者向けシェーダ講習会 第2回
projectasura
0
440
中級グラフィックス入門~色彩工学編~
projectasura
21
12k
中級グラフィックス入門 ~シャドウマッピング総まとめ~
projectasura
5
4.1k
Other Decks in Programming
See All in Programming
組み合わせ爆発にのまれない - 責務分割 x テスト
halhorn
1
180
[AI Engineering Summit Tokyo 2025] LLMは計画業務のゲームチェンジャーか? 最適化業務における活⽤の可能性と限界
terryu16
2
240
Go コードベースの構成と AI コンテキスト定義
andpad
0
150
Claude Codeの「Compacting Conversation」を体感50%減! CLAUDE.md + 8 Skills で挑むコンテキスト管理術
kmurahama
1
710
Combinatorial Interview Problems with Backtracking Solutions - From Imperative Procedural Programming to Declarative Functional Programming - Part 2
philipschwarz
PRO
0
130
Basic Architectures
denyspoltorak
0
160
MDN Web Docs に日本語翻訳でコントリビュート
ohmori_yusuke
0
300
The Art of Re-Architecture - Droidcon India 2025
siddroid
0
160
Spinner 軸ズレ現象を調べたらレンダリング深淵に飲まれた #レバテックMeetup
bengo4com
1
210
SQL Server 2025 LT
odashinsuke
0
120
React 19でつくる「気持ちいいUI」- 楽観的UIのすすめ
himorishige
11
4.1k
0→1 フロントエンド開発 Tips🚀 #レバテックMeetup
bengo4com
0
460
Featured
See All Featured
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
300
Being A Developer After 40
akosma
91
590k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
A Tale of Four Properties
chriscoyier
162
23k
Music & Morning Musume
bryan
46
7k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.7k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
0
2.3k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
0
84
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
420
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
9
1k
Are puppies a ranking factor?
jonoalderson
0
2.6k
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アニメーションを作ってください。
実装例
本日はここまで! 次回は • 宿題の解説 • ブラー処理 • シェーダの書き方 について説明を行います。