• 検索結果がありません。

WebGL Safari WebGL WebGL Safari Kageyama (Kobe Univ.) / 5

N/A
N/A
Protected

Academic year: 2021

シェア "WebGL Safari WebGL WebGL Safari Kageyama (Kobe Univ.) / 5"

Copied!
55
0
0

読み込み中.... (全文を見る)

全文

(1)

グラフィックスパイプライン

情報可視化論 第

04

陰山 聡

神戸大学 システム情報学研究科 計算科学専攻 [情報基盤センター分館 第 1 演習室]

2015.05.12

(2)

環境設定

WebGL

環境オン

Safari 立ち上げ 環境設定 → メニューバーに開発メニューを表示 にチェック (開発メニューから “WebGL を有効”)

WebGL

公式ページ

http://www.khronos.org/webgl/ デモ集 http://www.khronos.org/webgl/wiki/Demo_Repository

Safari

でのソースコード表示方法:

開発メニュー → ページのソースを表示

(3)

復習:

WebGL

とは

WebBL =

シェーダを使い、

HTML5

canvas

に、

JavaScript

3D CG

を書くための

API

クロスプラットフォーム

オープンスタンダード

Web

GPU

を使ったレンダリングが可能

開発・利用が容易: プラグイン不要

ソースコードが見える

グラフィックス(

OpenGL

)と

UI

(ウィンドウ管理やイベント処理)

の分離が明白

(4)

WebGL

グラフィックスパイプライン

(5)

WebGL

のグラフィックスパイプライン

Web アプリ HTML + CSS + JavaScript + シェーダソースコード + オブジェクトデータ WebGL JavaScript API 頂点シェーダ プリミティブ組み立て ラスタ化 フラグメントシェーダ シザーテスト マルチサンプリング ステンシルテスト デプステスト アルファブレンディング ディザリング WebGL用描画バッファ cavasの他の画像

(6)

シェーダ(拡大図は次のページ)

Web アプリ HTML + CSS + JavaScript + シェーダソースコード + オブジェクトデータ WebGL JavaScript API 頂点シェーダ プリミティブ組み立て ラスタ化 フラグメントシェーダ シザーテスト マルチサンプリング ステンシルテスト デプステスト アルファブレンディング ディザリング WebGL用描画バッファ スクリーン cavasの他の画像

(7)

シェーダ

頂点シェーダ(バーテックスシェーダ)とフラグメントシェーダ

Web アプリ HTML + CSS + JavaScript + シェーダソースコード + オブジェクトデータ WebGL JavaScript API 頂点シェーダ プリミティブ組み立て ラスタ化 フラグメントシェーダ

(8)

WebGL

アプリケーション

Web

アプリ =

HTML + CSS + JavaScript

WebGL

アプリ =

HTML + CSS + JavaScript +

シェーダ言語(

OpenGL

SL

(9)

頂点シェーダ

各頂点に対して処理を行う

並列処理

n

個の頂点があれば

n

個の頂点シェーダプロセッサを同時に実行さ

(10)

頂点シェーダの入出力データ

頂点シェーダ 頂点シェーダ用ソースコード (GLSL) ユーザ定義uniform変数 (変換行列、光源位置) 頂点attribute変数 (座標、色など) 組み込み変数 gl_Position gl_FrontFacing g_lPointSize ユーザ定義の varying変数

(11)

頂点シェーダプログラム

C

言語に似ている。

OpenGL SL (Shading Language)

4

4

列の行列ベクトル演算が組み込み関数

a t t r i b u t e v e c 3 a V e r t e x P o s ; a t r r i b u t e v e c 4 a V e r t e x C o l o r ; u n i f o r m mat4 uMVMatrix ; u n i f o r m mat4 u P M a t r i x ; v a r y i n g v e c 4 v C o l o r ; v o i d main ( ) {

g l P o s i t i o n = u P M a t r i x ∗ uMVMatrix ∗ vec4 ( aVertexPos , 1 . 0 ) ; v C o l o r = a V e r t e x C o l o r ;

(12)

頂点シェーダプログラム

a t t r i b u t e v e c 3 a V e r t e x P o s ; a t r r i b u t e v e c 4 a V e r t e x C o l o r ;

attribute

(属性)変数とは

ユーザが定義する変数

各頂点に固有のデータ(位置や色)

RGBA

4

成分のベクトル

(13)

頂点シェーダプログラム

u n i f o r m mat4 uMVMatrix ; u n i f o r m mat4 u P M a t r i x ;

mat4

は、

4

× 4

の行列の型

uniform

変数とは

ユーザが定義する変数

(その時刻(フレーム)に)全ての頂点で同じ値を持つデータ

(14)

頂点シェーダプログラム

v a r y i n g v e c 4 v C o l o r ;

varing

変数

(varying variable)

とは

フラグメントシェーダに情報を渡すための変数

ユーザが定義できる

組み込み

varying

変数もある

gl Position gl FrontFacing gl PointSize

(15)

頂点シェーダプログラム

v o i d main ( ) {

g l P o s i t i o n = u P M a t r i x ∗ uMVMatrix ∗ vec4 ( aVertexPos , 1 . 0 ) ; v C o l o r = a V e r t e x C o l o r ;

エントリーポイントは

main

返値はなし

1.

今処理している頂点の位置(

3

次元規格化デバイス座標)を

4

次元に

して

2.

モデルビュー変換行列をかけて

3.

射影変換行列をかけて

4.

組み込み

varying

変数である

gl Position

に代入する

最後にこの頂点の色を

varying

変数である

vColor

に書き込む

(16)

プリミティブ組み立て

primitive assembly

プリミティブ

3

角形(

OpenGL 1.x

では沢山のプリミティブがあったがいまは

3

形と線分、点のみ。)

線分

ポイントスプライト

クリッピング処理はここで行われる

(17)

ラスタ化

プリミティブからフラグメントを作る処理

フラグメント

ピクセル(様々なテストに合格したフラグメントだけが

描画ピクセルになる)

フラグメント プリミティブ

(18)

varying

変数の補間

頂点シェーダ からフラグメントシェーダへは

varying

変数を通じて

情報を送る。

各フラグメントの

varying

変数値は自動的に線形補間される。

varyingValue_2 varyingValue_3 varyingValue_1

(19)

フラグメントシェーダの入出力

全てのフラグメントで並列処理。シェーディング言語でプログラム。

フラグメント シェーダ フラグメントシェーダ用 ソースコード (GLSL) ユーザ定義varying変数 組み込み変数 gl_Position gl_FrontFacing g_lPointSize 組み込み変数 gl_FragColor ユニフォーム変数 テクスチャ用サンプラ

(20)

フラグメントシェーダプログラム

p r e c i s i o n mediump f l o a t ; // p r e c i s i o n q u a l i f i e r (精度修飾子) v a r y i n g v e c 4 v C o l o r ; // 補間された値 v o i d main ( ) { g l F r a g C o l o r = v C o l o r ; }

精度修飾子: 最低保証する精度。

(21)

WebGL

のグラフィックスパイプライン(再掲)

Web アプリ HTML + CSS + JavaScript + シェーダソースコード + オブジェクトデータ WebGL JavaScript API 頂点シェーダ プリミティブ組み立て ラスタ化 フラグメントシェーダ シザーテスト マルチサンプリング ステンシルテスト デプステスト アルファブレンディング ディザリング WebGL用描画バッファ cavasの他の画像

(22)

シザーテスト

描画ウィンドウの一部の領域だけを「はさみ(

scissors

)」で切り取る(は

さみといっても任意の形ではない。長方形のみ)。

テストに合格したフラグメントだけ描画。不合格フラグメントはそれ以

降のパイプラインを通らない → 処理の高速化

シザーテストの簡単な例:

OpenGL Super Bible (2011, p.112)

シザーテスト不合格

シザーテスト 合格

(23)

マルチサンプリング

アンチエイリアジング=斜めの線(特にほぼ水平な線)のギザギザをと

る方法

マルチサンプリング=周囲の複数のフラグメントをランダムに選択して

色を混ぜる

(24)

ステンシルテスト

ステンシルバッファの対応する位置の値と比較テストする。

不合格フラグメントは破棄

OpenGL Super Bible (2011, p.399)

参照。

(25)

デプステスト

(26)

アルファブレンディング

半透明な物体の表現

後述

(27)

ディザリング

(28)

WebGL

による三角形の描画

(29)

サンプルコード

WebGL

での三角形の描画

webgl sample triangle 00.html

(30)

3

角形の描画

HTMLで書いたテキスト WebGLで描いた三角形

canvas

(31)

webgl sample triangle 00.html

<!DOCTYPE HTML> <html l a n g=” en ”> <head>

< t i t l e>WebGL Sample T r i a n g l e 00</ t i t l e> <meta c h a r s e t=” u t f−8”> < s t y l e t y p e=” t e x t / c s s ”> c a n v a s { b o r d e r : 2 px s o l i d g r e y ; } . t e x t { p o s i t i o n : a b s o l u t e ; t o p : 40 px ; l e f t : 20 px ; f o n t−s i z e : 1 . 5em ;

(32)

webgl sample triangle 00.html

<!DOCTYPE HTML> <html l a n g=” en ”> <head>

< t i t l e>WebGL Sample T r i a n g l e 00</ t i t l e> <meta c h a r s e t=” u t f−8”> < s t y l e t y p e=” t e x t / c s s ”> c a n v a s { b o r d e r : 2 px s o l i d g r e y ; } . t e x t { p o s i t i o n : a b s o l u t e ; t o p : 40 px ; l e f t : 20 px ; f o n t−s i z e : 1 . 5em ;

(33)

c o l o r : b l a c k ; } </ s t y l e> < s c r i p t t y p e=” t e x t / j a v a s c r i p t ”> v a r g l ; v a r c a n v a s ; v a r s h a d e r P r o g r a m ; v a r v e r t e x B u f f e r ; f u n c t i o n c r e a t e G L C o n t e x t ( c a n v a s ) { v a r names = [ ” w e b g l ” , ” e x p e r i m e n t a l−webgl ” ] ; v a r c o n t e x t = n u l l ; f o r ( v a r i =0; i<names . l e n g t h ; i ++) { t r y {

(34)

c o n t e x t = c a n v a s . g e t C o n t e x t ( names [ i ] ) ; } catch ( e ) {} i f ( c o n t e x t ) { b r e a k ; } } i f ( c o n t e x t ) { c o n t e x t . v i e w p o r t W i d t h = c a n v a s . w i d t h ; c o n t e x t . v i e w p o r t H e i g h t = c a n v a s . h e i g h t ; } e l s e { a l e r t ( ” F a i l e d t o c r e a t e c o n t e x t . ” ) ; } r e t u r n c o n t e x t ; }

(35)

f u n c t i o n l o a d S h a d e r ( t y p e , s h a d e r S o u r c e ) { v a r s h a d e r = g l . c r e a t e S h a d e r ( t y p e ) ; g l . s h a d e r S o u r c e ( s h a d e r , s h a d e r S o u r c e ) ; g l . c o m p i l e S h a d e r ( s h a d e r ) ; i f ( ! g l . g e t S h a d e r P a r a m e t e r ( s h a d e r , g l . COMPILE STATUS ) ) { a l e r t ( ” E r r o r c o m p i l i n g s h a d e r ” + g l . g e t S h a d e r I n f o L o g ( s h a d e r ) ) ; g l . d e l e t e S h a d e r ( s h a d e r ) ; r e t u r n n u l l ; } r e t u r n s h a d e r ; } f u n c t i o n s e t u p S h a d e r s ( ) { v a r v e r t e x S h a d e r S o u r c e =

(36)

v a r f r a g m e n t S h a d e r S o u r c e = ” p r e c i s i o n mediump f l o a t ; \n” + ” v o i d main ( ) { \n” + ” g l F r a g C o l o r = v e c 4 ( 0 . 2 , 0 . 4 , 0 . 6 , 1 . 0 ) ; \n” +} \n” ; v a r v e r t e x S h a d e r = l o a d S h a d e r ( g l . VERTEX SHADER , v e r t e x S h a d e r S o u r c e ) ; v a r f r a g m e n t S h a d e r = l o a d S h a d e r ( g l . FRAGMENT SHADER, f r a g m e n t S h a d e r S o u r c e ) ; s h a d e r P r o g r a m = g l . c r e a t e P r o g r a m ( ) ;

(37)

g l . a t t a c h S h a d e r ( s h a d e r P r o g r a m , v e r t e x S h a d e r ) ; g l . a t t a c h S h a d e r ( s h a d e r P r o g r a m , f r a g m e n t S h a d e r ) ; g l . l i n k P r o g r a m ( s h a d e r P r o g r a m ) ; i f ( ! g l . g e t P r o g r a m P a r a m e t e r ( s h a d e r P r o g r a m , g l . LINK STATUS ) ) { a l e r t ( ” F a i l e d t o s e t u p s h a d e r . ” ) ; } g l . u s e P r o g r a m ( s h a d e r P r o g r a m ) ; s h a d e r P r o g r a m . v e r t e x P o s i t i o n A t t r i b u t e = g l . g e t A t t r i b L o c a t i o n ( s h a d e r P r o g r a m , ” a V e r t e x P o s i t i o n ” ) ; } f u n c t i o n s e t u p B u f f e r s ( ) {

(38)

v e r t e x B u f f e r = g l . c r e a t e B u f f e r ( ) ; g l . b i n d B u f f e r ( g l . ARRAY BUFFER , v e r t e x B u f f e r ) ; v a r t r i a n g l e V e r t i c e s = [ 0 . 0 , 0 . 0 , 0 . 0 , 0 . 8 , 0 . 0 , 0 . 0 , 0 . 0 , 0 . 5 , 0 . 0 ] ;

g l . b u f f e r D a t a ( g l . ARRAY BUFFER , new F l o a t 3 2 A r r a y ( t r i a n g l e V e r t i c e s ) , g l . STATIC DRAW) ; v e r t e x B u f f e r . i t e m S i z e = 3 ; v e r t e x B u f f e r . n u m b e r O f I t e m s = 3 ; } f u n c t i o n draw ( ) { g l . v i e w p o r t ( 0 , 0 , g l . v i e w p o r t W i d t h , g l . v i e w p o r t H e i g h t ) ;

(39)

g l . c l e a r ( g l . COLOR BUFFER BIT ) ; g l . v e r t e x A t t r i b P o i n t e r ( s h a d e r P r o g r a m . v e r t e x P o s i t i o n A t t r i b u t e , v e r t e x B u f f e r . i t e m S i z e , g l . FLOAT , f a l s e , 0 , 0 ) ; g l . e n a b l e V e r t e x A t t r i b A r r a y ( s h a d e r P r o g r a m . v e r t e x P o s i t i o n A t t r i b u t e ) ; g l . d r a w A r r a y s ( g l . TRIANGLES , 0 , v e r t e x B u f f e r . n u m b e r O f I t e m s ) ; } f u n c t i o n s t a r t u p ( ) { c a n v a s = document . g e t E l e m e n t B y I d ( ” myGLCanvas ” ) ; g l = c r e a t e G L C o n t e x t ( c a n v a s ) ; s e t u p S h a d e r s ( ) ; s e t u p B u f f e r s ( ) ; g l . c l e a r C o l o r ( 0 . 8 , 0 . 8 , 0 . 4 , 1 . 0 ) ; draw ( ) ;

(40)

} </ s c r i p t> </ head> <body o n l o a d=” s t a r t u p ( ) ; ”> <c a n v a s i d=” myGLCanvas ” w i d t h=” 480 ” h e i g h t=” 480 ”></ c a n v a s> <d i v c l a s s=” t e x t ”>H e l l o . T h i s i s my f i r s t WebGL p r o g r a m .</ d i v> </ body> </ html>

(41)

コンテキスト作成

HTML5

canvas

要素の

getContext method

を呼ぶ

引数(文字列)は

“experimental-webgl”

を渡す

getContext method

が返すのは

WebGLRenderingContext

オブジェ

クト。

WebGL の変数や関数はこの WebGLRenderingContext のメンバー。

このサンプルプログラムでは gl という変数にこのオブジェクトを 代入。

(42)

シェーダプログラム

頂点シェーダ用の(

GLSL

言語の)ソースコードは、

GPU

に送り、

GPU

にコンパイルさせる。

HTML

(あるいは

JavaScript

)の文脈では

GLSL

ソースコードは単な

る文字列。

ここでは文字列変数

fragmentShaderSource

にソースコード文字列を

代入して送っている。

【注意】普通はこうはしない。もっと便利な方法がある。後述。

(43)

シェーダプログラムの作成

1.

頂点シェーダオブジェクトを作る

1.1 頂点シェーダソースコードを頂点シェーダオブジェクトにロードする 1.2 コンパイルする

2.

フラグメントシェーダオブジェクトを作る

2.1 フラグメントシェーダソースコードをフラグメントシェーダオブジェ クトにロードする 2.2 コンパイルする

3.

プログラムオブジェクトを作る

4.

プログラムオブジェクトに頂点シェーダオブジェクトをアタッチす

る(こちらが先)

5.

プログラムオブジェクトにフラグメントシェーダオブジェクトをア

タッチする

6.

リンクする

7.

このプログラムオブジェクトを

WebGLRenderingContext

に登録する

(44)

GLSL

の)頂点属性について

頂点シェーダ内で定義できる

attribute

変数

float, vec2, vec3, vec4,

mat2, mat3x2, mat4x2,

mat2x3, mat3, mat4x3,

mat4, mat2x4, mat3x4

宣言されていても使われていない

attribute

変数 → アクティブでない

それ以外 → アクティブ

アクティブな

attribute

変数全体はまとめて整数インデックスで管理され

それぞれの

attribute

変数にはこのインデックスで参照する。

最大サイズはMAX VERTEX ATTRIBS

詳細は「OpenGL 4.0グラフィックスシステム[p.60]を参照。

(45)

int BindAttribLocation(unit program, unit index, const char *name);

name

という

attribute

変数を

index

にバインドする(上書き)。

program

はリンクしたプログラムオブジェクトの名前。

自分でバインドしない場合は

GL

が自動的にバインド する。

そのときの

index

は以下の関数で取得できる。

int GetAttribLocation(unit program, const char *name);

attribute

変数名

(name)

を指定して、その変数がどのインデックスにバイ

(46)

シェーダプログラム

gl.useProgram(shaderProgram);

shaderProgram . vertexPositionAttribute =

gl.getAttribLocation(shaderProgram,

aVertexPosition

);

上で、シェーダプログラムの

vertexPositionAttribute

というプロパティ名

は任意。

s h a d e r P r o g r a m . anyNameIsOK = g l . g e t A t t r i b L o c a t i o n ( s h a d e r P r o g r a m , ” a V e r t e x P o s i t i o n ” ) ;

(47)

バッファの作成

f u n c t i o n s e t u p B u f f e r s ( ) { v e r t e x B u f f e r = g l . c r e a t e B u f f e r ( ) ; g l . b i n d B u f f e r ( g l . ARRAY BUFFER , v e r t e x B u f f e r ) ; v a r t r i a n g l e V e r t i c e s = [ 0 . 0 , 0 . 0 , 0 . 0 , 0 . 8 , 0 . 0 , 0 . 0 , 0 . 0 , 0 . 5 , 0 . 0 ] ;

g l . b u f f e r D a t a ( g l . ARRAY BUFFER , new F l o a t 3 2 A r r a y ( t r i a n g l e V e r t i c e s ) ,

g l . STATIC DRAW) ; v e r t e x B u f f e r . i t e m S i z e = 3 ; v e r t e x B u f f e r . n u m b e r O f I t e m s = 3 ;

(48)

バッファの作成

三角形の頂点データをシェーダに送るためにはバッファオブジェク

トを使う。

バッファオブジェクトは

WebGLRenderingContext

createBuffer()

メソッドで作成する。

作成した

WebGLBuffer

オブジェクトを

JavaScript

のグローバル変数

vertexBuffer

に代入

vertexBuffer

を「現在の配列バッファオブジェクト」にバインドする。

後で使えるようにこの頂点配列の情報(頂点数等)も書いておく

(どうやって渡してもよい)。

(49)

描画

f u n c t i o n draw ( ) {

g l . v i e w p o r t ( 0 , 0 , g l . v i e w p o r t W i d t h , g l . v i e w p o r t H e i g h t ) ; g l . c l e a r ( g l . COLOR BUFFER BIT ) ;

g l . v e r t e x A t t r i b P o i n t e r ( s h a d e r P r o g r a m . v e r t e x P o s i t i o n A t t r i b u t e , v e r t e x B u f f e r . i t e m S i z e , g l . FLOAT , f a l s e , 0 , 0 ) ; g l . e n a b l e V e r t e x A t t r i b A r r a y ( s h a d e r P r o g r a m . v e r t e x P o s i t i o n A t t r i b u t e ) ; g l . d r a w A r r a y s ( g l . TRIANGLES , 0 , v e r t e x B u f f e r . n u m b e r O f I t e m s ) ; }

(50)

演習

(51)

頂点シェーダでの演算

頂点シェーダの中で簡単な数値計算をしてみよう。

(52)

webgl sample triangle 01.html

f u n c t i o n s e t u p S h a d e r s ( ) { v a r v e r t e x S h a d e r S o u r c e = ” a t t r i b u t e v e c 3 a V e r t e x P o s i t i o n ; \n” + ” v o i d main ( ) { \n” + ” g l P o s i t i o n = v e c 4 ( a V e r t e x P o s i t i o n , 1 . 0 ) ; \n” + ” g l P o s i t i o n ∗= vec4 ( −0.2 , −1.0 ,1.0 ,1.0) ; // H e r e ! ! \n ” + ”} \n” ;

(53)
(54)

レポート課題

(55)

webgl sample triangle 00.html

の頂点シェーダを変更して元の三角形

とは別の図形(図)を描け。

提出はメールで。添付ファイルは二つ。

1. レポートの PDF ファイル 2. 作成した HTML ファイル

[email protected]

メールのタイトル: 学籍番号_氏名

レポート(

PDF

ファイル形式に限る)には以下を記述すること

学籍番号と氏名 どのような図形を描いたか 描いた図形のキャプチャ図 (オプション: 講義 Web ページでの実名公開が嫌な場合) 氏名のイ ニシャル

締め切り: 来週

5/19

(火)午前

5

参照

関連したドキュメント

東京都は他の道府県とは値が離れているように見える。相関係数はこう

メモ  : 権利の詳細な管理は、 BlackBerry WorkspacesEnterprise ES モード BlackBerry Workspaces およ. び Enterprise ES ( 制限付きフルアクセス )

サーバー API 複雑化 iOS&amp;Android 間で複雑な API

(3) We present a JavaScript library 2 , that contains all the al- gorithms described in this paper, and a Web platform, AGORA 3 (Automatic Graph Overlap Removal Algorithms), in

(4) 現地参加者からの質問は、従来通り講演会場内設置のマイクを使用した音声による質問となり ます。WEB 参加者からの質問は、Zoom

①アプリをアンインストール スタート > 設定 > アプリ > アプリと機能 > Docan Browser5. ②関連ファイル削除(1)

Conditions for transmitter specifications unless otherwise specified with the antenna network from AX−SFUS Application Note: Sigfox Compliant Reference Design and at 902.2 MHz?.

Conditions for transmitter specifications unless otherwise specified with the antenna network from AX−SFEU Application Note: Sigfox Compliant Reference Design and at 868.130