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
580
初心者向けシェーダ講習会 第1回
社内向けにやる予定だったシェーダ講習会の資料です。
ガチ勢お断り。
Pocol
March 31, 2020
Tweet
Share
More Decks by Pocol
See All by Pocol
中級グラフィックス入門~効率的なメッシュレット描画~
projectasura
4
3.1k
Hardware-Raytracingを用いたフォトンマッピングの実装について
projectasura
0
600
ReSTIRについて
projectasura
5
2.3k
初心者向けシェーダ講習会 第2回
projectasura
0
380
中級グラフィックス入門~色彩工学編~
projectasura
21
11k
中級グラフィックス入門 ~シャドウマッピング総まとめ~
projectasura
5
3.4k
Other Decks in Programming
See All in Programming
Flutter with Dart MCP: All You Need - 박제창 2025 I/O Extended Busan
itsmedreamwalker
0
130
Introducing ReActionView: A new ActionView-compatible ERB Engine @ Rails World 2025, Amsterdam
marcoroth
0
540
Putting The Genie in the Bottle - A Crash Course on running LLMs on Android
iurysza
0
110
More Approvers for Greater OSS and Japan Community
tkikuc
1
110
速いWebフレームワークを作る
yusukebe
5
1.7k
AWS発のAIエディタKiroを使ってみた
iriikeita
1
160
奥深くて厄介な「改行」と仲良くなる20分
oguemon
1
440
Microsoft Orleans, Daprのアクターモデルを使い効率的に開発、デプロイを行うためのSekibanの試行錯誤 / Sekiban: Exploring Efficient Development and Deployment with Microsoft Orleans and Dapr Actor Models
tomohisa
0
240
レガシープロジェクトで最大限AIの恩恵を受けられるようClaude Codeを利用する
tk1351
4
1.6k
TDD 実践ミニトーク
contour_gara
1
290
「待たせ上手」なスケルトンスクリーン、 そのUXの裏側
teamlab
PRO
0
290
UbieのAIパートナーを支えるコンテキストエンジニアリング実践
syucream
2
830
Featured
See All Featured
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
9
800
Reflections from 52 weeks, 52 projects
jeffersonlam
352
21k
Producing Creativity
orderedlist
PRO
347
40k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
61k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.4k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
GraphQLとの向き合い方2022年版
quramy
49
14k
Why You Should Never Use an ORM
jnunemaker
PRO
59
9.5k
Git: the NoSQL Database
bkeepers
PRO
431
66k
Building an army of robots
kneath
306
46k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.1k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
3.1k
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アニメーションを作ってください。
実装例
本日はここまで! 次回は • 宿題の解説 • ブラー処理 • シェーダの書き方 について説明を行います。