GLSL~4.3 ストレージ修飾子

2012. 01. 23
4.3 ストレージ修飾子

変数の宣言は、型の前に指定した修飾子を持つ場合があります。

これらの要約を下表に示します。

修飾子意味
< none: default>ローカルでのメモリへの読み込み/書き込み、または関数への入力パラメータ
constコンパイル時の定数、または読み込みのみの関数のパラメータ
attributeOpenGL ESの頂点単位のデータと、頂点シェーダ間で連関するパラメータ
uniformプリミティブの処理において変更しない値で、uniformはアプリケーションと
OpenGL ES、シェーダ間で連関するパラメータ
varyingデータ補間のため、頂点シェーダとフラグメントシェーダ間で連関するパラメータ

ローカル変数は、ストレージ修飾子constのみ使用することができます。

関数のパラメータは、constストレージ修飾子のみ使用することができます。

パラメータの修飾子についての詳細は、『項6.1.1 関数呼び出しの規約』で説明しています。

関数の戻り型と構造体のフィールドにストレージ修飾子を使用しないでください。

あるシェーダの実行から次の実行への伝達(フラグメントシェーダ間または頂点シェーダ間の伝達)のためのデータ型は存在しません。

これにより、複数の頂点またはフラグメントの同じシェーダ上での並列実行を防ぐことができます。

ストレージ修飾子を持たないグローバルの宣言、または単なるconst修飾子はイニシャライザを含めることができ、その場合はmain()関数の最初の行が実行される前に初期化されます。

イニシャライザは定数式である必要があります。

アプリケーションによって初期化されていない、または宣言で初期化されていないストレージ修飾子を持たないグローバル変数はOpenGL ESで初期化せず、むしろ未定義値はmain()で入力します。

uniform、attribute、varyingはイニシャライザを持っていない場合があります。


4.3.1 デフォルトのストレージ修飾子

グローバル変数に修飾子が無い場合、その変数はアプリケーション、または他のプロセッサ上で実行されているコンパイルユニットとの連関を持っていません。

グローバルまたはローカルの非修飾変数の宣言では、ターゲットとするプロセッサに関連付けられたメモリが割り当てられます。

この変数は、割り当てられたメモリへの読み込み/書き込みアクセスを提供します。


4.3.2 const修飾子

名付けられたコンパイル時の定数は、const修飾子を使用して宣言することができます。

定数として修飾された全ての変数は、コンパイルユニットのための読み込みのみの変数です。

定数として宣言された変数は、組み込み数値定数を使用するよりも、より分かり易いシェーダにすることができます。

const修飾子は、基本のデータ型の全てで使用することができます。

宣言外でconst変数に書き込みを行うとエラーになるので、宣言時に初期化する必要があります。

例:

const vec3 zAxis = vec3 (0.0, 0.0, 1.0);

構造体のフィールドは、constで修飾されていない場合があります。

構造体変数はconstとして宣言し、構造体のコンストラクタで初期化することができます。

constのイニシャライザの宣言は、定数式である必要があります。

配列を含む配列と構造体は、初期化できないために定数宣言されていない場合があります。

『5.10 定数式』を参照してください。


4.3.3 attribute

attribute修飾子は、頂点ごとにOpenGL ESから頂点シェーダへ渡される変数の宣言に使用されます。

頂点シェーダ以外のシェーダのタイプでattribute変数を宣言するとエラーになります。

attribute変数は、頂点シェーダに関しては読み込みのみとなっています。

attribute変数の値は、OpenGL ESの頂点APIを介して、または頂点配列の一部として頂点シェーダに渡されます。

頂点シェーダに頂点属性を伝達すると、全ての頂点シェーダの実行上で変更されると期待されています。

attribute修飾子は、floatvec2vec3vec4mat2mat3、そしてmat4のデータ型でのみ使用することができます。

attribute変数は、配列または構造体として宣言することはできません。

宣言の例:

attribute vec4 position;
attribute vec3 normal;
attribute vec2 texCoord;

グラフィックスハードウェアは、頂点属性を渡すための固定された場所の数が少ないと予想されます。

したがって、OpenGL ESシェーディング言語は4つの浮動小数点値(すなわち、vec4)までの空間を持つものとして各非行列の属性変数を定義しています。

使用することができるattribute値の数は実装依存で制限されており、それを超えた場合はリンクエラーが発生します。
(宣言したattribute値が使用されていない場合は、この制限に対してカウントされません)

float attributeはvec4としてこの制限に対して同じ量をカウントするので、アプリケーションは基盤をなすハードウェアの機能をより良く利用するため、vec4に関連の無い4つのfloat attributeをグループにパックしてまとめる検討をしてください。

mat4 attributeは4つのvec4 attribute変数の場所に相当する分を消費し、mat3は3つのattribute変数の場所に相当する分を消費、そしてmat2は2つのattribute変数の場所を消費します。

行列によってこの空間をどのように利用しているかはAPIと言語を介して実装によって隠蔽されています。

attribute変数はグローバルスコープを持っている必要があります。


4.3.4 uniform

uniform修飾子は、プリミティブ全体の処理に渡って同じ値となるグローバル変数の宣言に使用します。

全てのuniform変数は読み込みのみで、APIコマンドによってアプリケーションで直接、またはOpenGL ESによって間接的に初期化されます。

宣言の例:

uniform vec4 lightPosition;

uniform修飾子は基本的なデータ型や型が構造体またはこれらの配列の宣言で使用することができます。

シェーダの各タイプで使用することができるuniformのストレージ量は実装依存で制限されており、 
それを超えた場合はコンパイル時またはリンク時にエラーが発生します。

宣言したuniform変数が静的に使用されていない場合は、この制限に対してカウントされません。

静的な使用とは、シェーダが事前処理後の変数への参照を含むことを意味します。

シェーダ内で静的に使用できるユーザ定義のuniform変数の数と組み込みのuniform変数の数は、利用できるuniformストレージを超えるかどうかを判断するために一緒に追加されます。

頂点とフラグメントのシェーダが一緒にリンクされている場合、単一のグローバルuniform名前空間を共有することになります。

したがって、同名のuniformの型と精度は、単一の実行可能オブジェクトにリンクされている全てのシェーダ間で一致している必要があります。


4.3.5 varying

varying変数は、頂点シェーダ、フラグメントシェーダ、そして固定機能間のインターフェイスを提供します。

頂点シェーダは頂点ごとに(色やテクスチャ座標などの)値を計算し、varying修飾子で宣言された変数に書き込みます。

また頂点シェーダはvarying変数が書き込まれた同じ値を取得し、読み込むことができます。

頂点シェーダ内のvarying変数の読み込みは、書き込み前に読み込みを行うと未定義を返します。

定義により、varying変数はプリミティブを透視変換補正したレンダリングで、頂点ごとに設定されます。

シングルサンプリングの場合、補間値はフラグメントの中央になります。

マルチサンプリングの場合、補間値はフラグメントの中央またはフラグメントサンプルの一つを含め、ピクセル内のどこでもできます。

フラグメントシェーダはプリミティブ内のフラグメントの位置の関数として、varying変数から読み込み、読み込んだ値を補間値にすることができます。

フラグメントシェーダはvarying変数に書き込むことはできません。

頂点シェーダとフラグメントシェーダの両方で宣言されている同名のvarying変数の型は一致している必要があり、でなければリンクコマンドが失敗します。

varying変数の精度は一致する必要はありません。

フラグメントシェーダで静的使用(すなわち、読み込み)のみのvarying変数は、頂点シェーダ内で宣言する必要があります。
(頂点シェーダ内での余剰なvarying変数の宣言は許容されています)

頂点とフラグメントのシェーダ内でvaryingを照合する規約の要約を下表に示します。

 フラグメントシェーダ
参照無し宣言:非静的使用宣言:静的使用
頂点シェーダ参照無し許可許可エラー
宣言:非静的使用許可許可許可(値は未定義)
宣言:静的使用許可許可許可(値は潜在的に未定義)

静的な使用とは、シェーダが事前処理後にvaryingにアクセスする文が、たとえその文が実際に実行されることはなくても、少なくとも一つ含まれることを意味します。

varying変数は以下のように宣言されます。

varying vec3 normal;

varying修飾子は、floatvec2vec3vec4mat2mat3mat4、またはこれらの配列のデータ型でのみ使用することができます。

構造体はvaryingにすることはできません。

varying変数はグローバルスコープを持っている必要があります。



参考文献

The OpenGL ES Shading Language 1.0.17






Bose QuietComfort 20
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
08 | 2017/09 | 10
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
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

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

Wish List
WACOM


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

Bose QuietComfort 20
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