OpenGL ESテンプレート(11)~シェーダプログラム

2012. 02. 15
Xcodeの『グループとファイル』ペインの『Shaders』下にあるファイルは、OpenGL ES 2.0で利用するプログラマブルシェーダ用のシェーダプログラムファイルで、拡張子vshが頂点シェーダ、fshがフラグメントシェーダのプログラムです。


●Shader.vsh頂点シェーダプログラム

頂点シェーダプログラムShader.vshでは、頂点座標配列と頂点色配列、そして図形移動用の変数の設定を行っています。

attribute vec4 position;
attribute vec4 color;

varying vec4 colorVarying;

uniform float translate;

void main()
{
    gl_Position = position;
    gl_Position.y += sin(translate) / 2.0;

    colorVarying = color;
}

7742

attribute変数)

attribute修飾子は頂点ごとのOpenGL ESと頂点シェーダで連関するパラメータに使用されます。
(『GLSL~4.3 ストレージ修飾子』参照)

vec4は4つの要素を持つ浮動小数点ベクトルを表しています。
(『GLSL~4.1 基本の型』参照)

頂点座標配列の場合、OpenGL ES側の頂点座標配列squareVerticesは二次元座標(xとy)しか指定していないため、4つの要素を持つvec4(x、y、z、w)の変数positionにした際、zとwをどのように決定しているのかはよく分かりませんが、おそらくデフォルトは『z = 0.0、w = 1.0』になっていると思われます。

zはz軸方向、つまり視点(カメラ)から見て奥行きを表し、wは同次座標系における移動倍率を表しています。
(同次座標については『IMURA Masataka/OpenGL/OpenGLの座標系』や『Markun Bear/Let's Learn/コンピューターグラフィックス/第6章 3次元空間と座標変換/第1節 座標系』、『イースマイル株式会社/2006年2月25日  『 3Dプログラミング概論 第5週』/同次座標』などを参照してください)

試しに『床井研究室/第3回 シェーダプログラム』を参考に、頂点座標変数の宣言を『attribute vec2 position;』と2要素にし、頂点シェーダ特殊変数を『gl_Position = vec4(position, 0.0, 1.0);』としてみたところ描画に変化はありませんでした。

7762

そこでzを-1.0~1.0に変更しても表示図形の大きさに変化が無かったことから、透視投影ではなく平行投影と推測できるかと思います。

また、-1.0~1.0を超えると図形が表示されなくなるので、ビューボリュームのnearは-1.0、farは1.0であることが分かります。

7759

同次座標はあまり理解していないので説明し難いのですが、wが1.0の場合は通常の三次元座標と同じようです。

試しにwを0.7とすると図形が拡大し、

7761

wを2.0にすると図形が縮小します。

7760

wに応じてビューボリュームも比例して変化し、w = 2.0の場合、near = -2.0、far = 2.0となります。

また頂点色配列の場合、OpenGL ES側の頂点色配列squareColorsは4要素(RGBA)ですので、そのまま設定されます。

varying変数)

varying修飾子は、頂点シェーダとフラグメントシェーダ間で連関するパラメータに使用されます。
(『GLSL~4.3 ストレージ修飾子』参照)

uniform変数)

uniform修飾子はプリミティブの処理で変更しない値で、OpenGLとシェーダ間で連関するパラメータに使用されます。
(『GLSL~4.3 ストレージ修飾子』参照)

ここでは図形が上下に反復移動するパラメータtranslateをuniform変数としています。

gl_Position)

gl_Positionは頂点シェーダ特殊変数で、頂点シェーダで扱う頂点座標値を格納します。
(『GLSL~7 組み込み変数』参照)

ここでは図形(プリミティブ)を組み立てるための頂点座標positionと、図形を移動させる sin関数を用いた式を指定しています。
(sin関数に付いては『GLSL~8.1 角度と三角関数』を参照してください)


●Shader.fshフラグメントシェーダプログラム

フラグメントシェーダプログラムShader.fshでは、varying変数とした頂点色配列の設定を行っています。

varying lowp vec4 colorVarying;

void main()
{
    gl_FragColor = colorVarying;
}

7741

lowp変数)

iOSデバイスのような組み込みデバイスではハード要件が厳しいので、必要以上に精度の高い変数を使用し、GPUの演算やメモリなどのリソースを抑える必要があります。

そのため各シェーダはデフォルトの精度を定義しなければならないと『iOS OpenGL ESプログラミングガイド』の『第11章 シェーダのベストプラクティス/精度ヒントを使用する』に書かれています。

頂点データは高精度にする必要がありますが、色には低精度の値が推奨されていることから、頂点色の変数colorVaryingには低精度を示す精度修飾子lowpが指定されています。
(『GLSL~4.5.2 精度修飾子』参照)

gl_FragColor)

gl_FragColorはフラグメントシェーダ特殊変数で、フラグメントシェーダで扱う頂点色値を格納します。
(『GLSL~7 組み込み変数』参照)

ここでは頂点シェーダでvarying変数に設定された頂点色colorVaryingを受け取り、指定しています。

各頂点間のピクセルは、頂点色を補間する値で塗られます。
(『Double Slash/4K Procedural Gfx Monitor/4KBプロシージャルGFX入門講座 2時限目』参照)



参考文献

iOS OpenGL ESプログラミングガイド

The OpenGL ES Shading Language 1.0.17

IMURA Masataka/OpenGL/OpenGLの座標系

Markun Bear/Let's Learn/コンピューターグラフィックス/第6章 3次元空間と座標変換/第1節 座標系

イースマイル株式会社/2006年2月25日  『 3Dプログラミング概論 第5週』/同次座標

床井研究室/第3回 シェーダプログラム

Double Slash/4K Procedural Gfx Monitor/4KBプロシージャルGFX入門講座 2時限目






Bose Solo 5 TV sound system
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
07 | 2017/08 | 09
Sun Mon Tue Wed Thu Fri Sat
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

ボーズ・オンラインストア
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR