GLSL~4.1 基本の型

2012. 01. 22
4.1 基本の型

OpenGL ESシェーディング言語がサポートする基本的なデータ型を下表に示します。

 型 意味
 void 値を返さない関数、または空のパラメータリスト用 
 bool 条件型、trueまたはfalseの値を取る
 int 符号付き整数
 float 単精度浮動小数点スカラー
 vec2 2要素の浮動小数点ベクトル
 vec3 3要素の浮動小数点ベクトル
 vec4 4要素の浮動小数点ベクトル
 bvec2 2要素のブールベクトル
 bvec3 3要素のブールベクトル
 bvec4 4要素のブールベクトル
 ivec2 2要素の整数ベクトル
 ivec3 3要素の整数ベクトル
 ivec4 4要素の整数ベクトル
 mat2 2×2の浮動小数点行列
 mat3 3×3の浮動小数点行列
 mat4 4×4の浮動小数点行列
 sampler2D 2Dテクスチャへアクセスするハンドル
 samplerCube  キューブマップテクスチャへアクセスするハンドル 

更に、シェーダはこれらの配列や構造体を使用して結合し、より複雑な型を構築することができます。

これらにポインタ型はありません。


4.1.1 void型

void型は関数の戻り型、または空の形式的、あるいは実際のパラメータリストとしてのみ使用することができます。


4.1.2 ブール型

コードの条件付き実行を容易に表すため、bool型がサポートされています。

ハードウェアが直接この型の変数をサポートしているとは予想していません。

それは真のブール型とは、trueかfalseのどちらかを意味する2つの値の内の1つのみを持っています。

truefalseの2つのキーワードは、ブール定数として使用することができます。

ブール値の宣言とオプションでの初期化は、以下の例のようになります。

bool success;    // ブール値『success』の宣言
bool done = false;    // ブール値『done』の宣言と初期化

代入演算子『=』の右側には、型がboolで表現される式を指定します。

条件分岐(iffor?:whiledo-while)を使用する式では、bool型で評価する必要があります。


4.1.3 整数型

integer型は主にプログラミングの補助としてサポートされています。

ハードウェアレベルでは、実際の整数はループと配列の指標と、テクスチャユニットへの参照を効率的に実装するための補助となります。

しかし、ハードウェア内での整数型への言語マップの、整数としての要件を気にする必要はありません。

基盤となるハードウェアが、整数演算の広い範囲を完全にサポートしているとは予想していません。

OpenGL ESシェーディング言語の実装では、整数を浮動小数点に変換する操作があります。

したがって、移植のラッピング動作はありません。

整数の宣言とオプションでの初期化は以下の例のようになります。

int i, j = 42;

リテラル整数の定数は、下記のように10進数(基数10)、8進数(基数8)、または16進数(基数16)で表すことができます。

整数定数:
 10進数定数
 8進数定数
 16進数定数

10進数定数:
 ゼロ以外の数字
 10進数定数 数字

8進数定数:
 0
 8進数定数 8進数の数字

16進数定数:
 0x 16進数の数字
 0X 16進数の数字
 16進数定数 16進数の数字

数字:
 0
 ゼロ以外の数字

ゼロ以外の数字:いずれか1つ
 1 2 3 4 5 6 7 8 9

8進数の数字:いずれか1つ
 0 1 2 3 4 5 6 7

16進数の数字:いずれか1つ
 0 1 2 3 4 5 6 7 8 9
 a b c d e f
 A B C D E F


空白は整数定数の数字間では許可されておらず、先頭が0の以降、または定数の先頭が0x0Xの以降も含みます。

先頭の単一のマイナス記号『-』は、算術単項反転として解釈され、定数の一部ではありません。

接尾辞文字はありません。


4.1.4 浮動小数点型

float型は、様々なスカラー演算で使用することができます。

浮動小数点変数は以下の例のように定義されています。

float a, b = 1.5;

0で割るような条件の処理の結果は未定義ですが、処理の中断や終了させてはいけません。

浮動小数点定数は以下のように定義されています。

浮動小数点定数:
 少数定数 指数部分opt
 数字数列 指数部分

少数定数:
 数字数列. 数字数列
 数字数列.
 . 数字数列

指数部分:
 e 符号opt 数字数列
 E 符号opt 数字数列

符号:いずれか一つ
 + -

数字数列:
 数字
 数字数列 数字

指数部分が存在する場合、小数点『.』は必要ありません。

空白は小数点定数内の文字間では許可されていません。

先頭の単一のマイナス記号『-』は、算術単項反転として解釈され、定数の一部ではありません。


4.1.5 ベクトル

OpenGL ESシェーディング言語は、浮動小数点値、整数値、またはブール値の2-、3-、4-要素のベクトルを持つ汎用的なデータ型を含んでいます。

浮動小数点ベクトル変数は、色、法線、位置、テクスチャ座標、テクスチャルックアップの結果など、コンピュータグラフィックスで非常に有用な様々な値の格納に使用することができます。

ブールベクトルは、数値ベクトルを要素ごとに比較するために使用することができます。

シェーディング言語の一部としてベクトルを定義すると、ベクトル処理を行うグラフィックスハードウェア上のベクトル操作のマッピングを直接行うことができます。

一般的には、アプリケーションはスカラー値よりもベクトルによる計算を行うことによって、グラフィックスハードウェアでの並列処理を活用することができます。

ベクトルの宣言の例をいくつか示します。

vec2 texcoord1, texcoord2;
vec3 position;
vec4 myRGBA;
ivec2 textureLookup;
bvec3 lessThan;

ベクトルの初期化は、後で簡単に説明するコンストラクタで行うことができます。


4.1.6 行列

行列はコンピュータグラフィックスにおけるもう一つの有用なデータ型で、OpenGL ESシェーディング言語は浮動小数点値の2×2、3×3、そして4×4行列のサポートを定義しています。

行列は列優先順で読み込みと書き込みを行います。

行列宣言の例:

mat2 mat2D;
mat3 optMatrix;
mat4 view, projection;

行列値の初期化はコンストラクタで行われます。
(『項5.4 コンストラクタ』で説明しています)


4.1.7 サンプラ

sampler2Dなどの)サンプラ型は、効果的なテクスチャへの不透過なハンドルです。

これらはテクスチャへのアクセスを指定する、(『項8.7 テクスチャルックアップ関数』で説明している)組み込みのテクスチャ関数で使用されています。

これらは関数のパラメータやuniform(『項4.3.4 uniform』参照)としてのみ宣言することができます。

テクスチャルックアップ関数のパラメータ、配列のインデックス、構造体のフィールドの選択と挿入以外では、サンプラは式中のオペランドとして許可していません。

サンプラはl-値として扱ったり、outまたはinout関数のパラメータとして使用することはできません。

これらの制限はまた、サンプラ型を含む構造体にも適用されます。

uniformとしては、これらはOpenGL ES APIで初期化されます。

関数パラメータとしては、サンプラは一致する型のサンプラへのみ渡すことができます。

シェーダが実行される前に、シェーダのテクスチャのアクセスとOpenGL ESのテクスチャの状態との間で、整合性のチェックが可能になります。


4.1.8 構造体

ユーザ定義型は、structキーワードを使用して、構造体に他の既に定義された型を集約して定義することができます。

例えば、

struct light {
    float intensity;
    vec3 position;
} lightVar;

この例では、lightは新しい型名となり、lightVarはlight型の変数となります。

新しい型の変数を宣言するには、(structキーワードを除いて)名前を使用します。

light lightVar2;

より正式には、構造体は以下のように宣言されています。

ただし、完全に正確な文法は『節9 シェーディング言語文法』に記述されています。

構造体定義:
 修飾子opt struct 名前opt { メンバリスト } 宣言子opt;

メンバリスト:
 メンバ宣言;
 メンバ宣言 メンバリスト;

メンバ宣言:
 基本型 宣言子;

名前はユーザ定義型で、この新しい型になる変数の宣言に使用することができます。

名前は、他の変数、型や関数と同じ名前空間を共有します。

名前が不可視な変数、型、コンストラクタ、または関数は、全て予め可視になります。

オプションの修飾子は宣言でのみ適用され、名前のために定義される型の一部ではありません。

構造体は少なくとも一つのメンバを宣言する必要があります。

メンバの宣言子は精度の修飾子を含めることができますが、他の修飾子を含めることはできません。

ビットフィールドはサポートされていません。

メンバ型は事前に(前方参照と組み込み定義が無いもので)定義されている必要があります。

メンバ宣言は初期化を含めることができません。

メンバ宣言は配列を含めることができます。

配列はサイズを指定し、そのサイズはゼロより大きい整数定数式である必要があります。
(※原文では『項4.3.3 整数定数式』を参照とありますが、『項4.3.3』は『attribute修飾子』であり、『整数定数式』に該当するような項目はありません)

各構造体のレベルは、メンバ宣言内で指定された名前のための独自の名前空間を持ち、名前は名前空間内で一意である必要があります。

匿名構造体の宣言(型が構造体のメンバ宣言であるが、宣言されていない)はサポートされていません。

struct S
{
    int x;
};

struct T
{
    S;    // エラー:匿名構造体は許可されていない
    int y;
};

組み込み構造体の宣言はサポートされていません。

例1:

struct S
{
    struct T    // エラー:組み込み構造体の定義はサポートされていない
    {
        int a;
    } t;
    int b;
};

例2:

struct T
{
    int a;
};

struct S
{
    T t;    // ok.
    int b;
};

構造体は、『項5.4.3 構造体のコンストラクタ』で説明されているように、宣言時にコンストラクタを使用して初期化することができます。

型や修飾子の使用に関する制限もまた、その型や修飾子を含む構造体に適用されます。

これは再帰的に適用されます。


4.1.9 配列

同じ型の変数は名前に続けてサイズを角括弧『[ ]』で囲む宣言によって、配列に集約することができます。

配列のサイズはゼロより大きい整数定数式である必要があります。
(※原文では『項4.3.3 整数定数式』を参照とありますが、『項4.3.3』は『attribute修飾子』であり、『整数定数式』に該当するような項目はありません)

宣言されたサイズ以上の整数定数式の配列インデックスは受け付けません。

また、負の定数式の配列インデックスも受け付けません。

関数宣言内の仮パラメータとして配列を宣言する場合は、サイズを定義する必要があります。

一次元配列のみ宣言することができます。

全ての基本型と構造体は、配列を作ることができます。

いくつかの例を以下に示します。

float frequencies[3];
uniform vec4 lightPosition[4];

const int numLights = 2;
light lights[numLights];

シェーダ内で宣言時に配列を初期化する機構はありません。

非定数インデックスの配列からの読み込み、または配列への書き込みで、ゼロ未満または配列サイズ以上の場合、動作の結果は未定義です。

この未定義の動作の結果は、プラットフォームに依存します。

基盤システムが不安定になったり、メモリの破損に繋がる可能性があります。

しかし、特定のプラットフォームではそのような事態になる動作を起こさない場合があります。



参考文献

The OpenGL ES Shading Language 1.0.17






QuietControl 30 wireless headphones
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
04 | 2017/05 | 06
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

QuietControl 30 wireless headphones
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