OpenGL ESテンプレート(5)~GLFunViewControllerクラス(4)

2012. 02. 09
OpenGL ES 2.0の場合)

・『シェーダプログラムの使用

最初にglUseProgramでシェーダプログラムprogramをインストールします。

シェーダプログラムはawakeFromNibでの初期設定の際に後述するloadShadersメソッドで生成されており、そこでuniformインデックスとattributeインデックスは、シェーダプログラムのuniform変数とattribute変数へバインドされています。

・『uniform値の更新

次にglUniformで、OpenGL ESの変数をuniformインデックスとして設定します。

uniform変数はシェーダプログラムにおいて、プリミティブ全体の処理で一定の値のことで、ここでは図形の上下移動を示す定数transYが該当します。

GLFunViewControllerクラスの冒頭で宣言しているuniformインデックスuniforms[UNIFORM_TRANSLATE]にtransYを設定します。
(『OpenGL ESテンプレート(2)~GLFunViewControllerクラス(1)』参照)

そして、次回のdrawFrameメソッドの呼び出し(つまり次のアニメーションフレームの描画)のためにtransYをインクリメントしています。
(この数値を変更することで、フレーム間の図形の移動量が変わります)

・『attribute値の更新

attribute変数は頂点属性を設定するもので、ここではdrawFrameメソッドの冒頭で設定した頂点座標配列squareVerticesと頂点色配列squareColorsを使用して、頂点の座標と色を設定しています。

glVertexAttribPointerはOpenGL ESの頂点属性配列をattributeインデックスとして設定します。

第一引数は頂点属性のインデックスで、頂点座標はATTRIB_VERTEX、頂点色はATTRIB_COLORを指定しています。

第二引数は頂点属性ごとの要素数で、頂点座標はx、y座標を表す2、頂点色はRGBAを表す4を指定しています。

第三引数は各要素のデータ型を指定します。

第四引数はデータを正規化して渡すかどうかを示すもので、0(GL_FALSE)なら値そのまま、1(GL_TRUE)なら値は正規化されて渡されます。
(ATTRIBUTE_COLORのデータ型は符号無しBYTEなので、[0, 1]に正規化されます)

第五引数は頂点属性間のバイトオフセットで、ここでは0を指定しています。

第六引数は頂点属性の最初の要素へのポインタで、ここでは座標と色共にデータは配列の先頭から始まるため、配列名をそのまま指定しています。

頂点属性データの定義後、glEnableVertexAttribArrayで頂点属性配列を有効にします。

・『描画する前にプログラムを検証する。これは良いチェックですが、実際にはデバッグビルドでのみ必要となります。予め用意していない場合、DEBUGマクロはデバッグ構成で定義する必要があります。

『#if defined(DEBUG) ~ #endif』で囲まれているのはデバッグ用のコードで、デバッグモード時のみ実行されます。
(『ブレークポイント』をONにすると、『ビルドと実行』ボタンが『ビルドとデバッグ』に変わり、デバッグモードになります)

ここではプログラムオブジェクトを検証するvalidateProgram:メソッドが呼び出され、検証に失敗した場合はエラーログを出力することになっています。

glUseProgram

void glUseProgram(GLuint program);

現在のレンダリング状態の一部としてプログラムをインストールします。

glUseProgramは、現在のレンダリング状態の一部として、programで指定されたプログラムオブジェクトをインストールします。

プログラムオブジェクト内には、glAttachShaderでアタッチに成功したシェーダオブジェクト、glCompileShaderでコンパイルに成功したシェーダオブジェクト、そしてglLinkProgramでリンクに成功したプログラムオブジェクトが一つ以上実行可能オブジェクトが生成されています。

プログラムオブジェクトには、全てコンパイルとリンクに成功した一つ以上のGL_VERTEX_SHADERタイプのシェーダオブジェクトと、一つ以上のGL_FRAGMENT_SHADERタイプのシェーダオブジェクトが含まれている場合、頂点とフラグメントのプロセッサ上で実行される、実行可能なものが含まれています。

プログラムオブジェクトを使用している間、アプリケーションはアタッチされたシェーダオブジェクトの変更、アタッチされたシェーダオブジェクトのコンパイル、追加のシェーダオブジェクトをアタッチ、そしてシェーダオブジェクトのデタッチや削除を自由に行うことができます。

これらの操作を行っても、現在の状態の一部である実行可能オブジェクトには影響しません。

ただし、現在使用されているプログラムオブジェクトを再リンクすると、リンクの操作が成功した場合、現在のレンダリング状態の一部としてプログラムオブジェクトがインストールされます。
(glLinkProgram参照)

現在使用中のプログラムオブジェクトが再リンクに失敗した場合、リンクのステータスがGL_FALSEに設定されますが、実行可能オブジェクトと関連する状態はglUseProgramが以降呼び出されて使用からそれを削除するまで現在の状態の一部のままになります。

使用から削除された後は、再リンクが成功するまで現在の状態の一部にすることができません。

programが0の場合、現在のレンダリング状態は無効なプログラムオブジェクトを参照しており、全てのglDrawArraysまたはglDrawElementsコマンドによる頂点とフラグメントシェーダの実行結果は未定義になります。

テクスチャオブジェクトやバッファオブジェクトと同様に、プログラムオブジェクトの名前空間はコンテキストのセット間で共有されることがあり、その場合コンテキストのサーバ側と同じアドレス空間を共有します。

名前空間がコンテキスト間で共有されている場合、全てのアタッチされているオブジェクトとそれらのアタッチされているオブジェクトに関連するデータも、同様に共有されます。

アプリケーションは、オブジェクトが異なる実行スレッドからアクセスする場合に、APIの呼び出し間での同期を提供する責任があります。

programが0またはOpenGLによって生成された値でもない場合、GL_INVALID_VALUEが発生します。

programがプログラムオブジェクトでない場合、GL_INVALID_OPERATIONが発生します。

programが現在の状態の一部を作成できなかった場合、GL_INVALID_OPERATIONが発生します。

program:現在のレンダリング状態の一部として使用される、実行可能なプログラムオブジェクトの名前を指定します。

glUniform

現在のプログラムオブジェクトのuniform変数の値を指定します。

void glUniform1f(GLint location, GLfloat v0);

void glUniform2f(GLint location, GLfloat v0, GLfloat v1);

void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);

void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);

void glUniform1i(GLint location, GLint v0);

void glUniform2i(GLint location, GLint v0, GLint v1);

void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);

void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);

location:変更するuniform変数の場所を指定します。

v0v1v2v3:指定されたuniform変数に使用する新しい値を指定します。

void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);

void glUniform2fv(GLint location, GLsizei count, const GLfloat *value);

void glUniform3fv(GLint location, GLsizei count, const GLfloat *value);

void glUniform4fv(GLint location, GLsizei count, const GLfloat *value);

void glUniform1iv(GLint location, GLsizei count, const GLint *value);

void glUniform2iv(GLint location, GLsizei count, const GLint *value);

void glUniform3iv(GLint location, GLsizei count, const GLint *value);

void glUniform4iv(GLint location, GLsizei count, const GLint *value);

location:変更するuniform値の場所を指定します。

count:変更する要素数を指定します。
対象となるuniform変数が配列でない場合は1、配列の場合は1以上である必要があります。

value:指定されたuniform変数を更新するために使用される、count値の配列のポインタを指定します。

void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);

void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);

void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);

location:変更するuniform値の場所を指定します。

count:変更される行列数を指定します。
対象となるuniform値が行列の配列でない場合は1、行列の配列の場合は1以上である必要があります。

transpose:Specifies whether to transpose the matrix as the values are loaded into the uniform variable. Must be GL_FALSE.

value:指定されたuniform値の更新に使用される、count値の配列のポインタを指定します。

glUniformは、uniform変数またはuniform変数配列の値を変更します。

変更するuniform変数の場所はlocationによって指定され、glGetUniformLocationによって返された値である必要があります。

glUniformは、glUseProgramを呼び出すことによって現在の状態の一部に作成されたプログラムオブジェクト上で操作されます。

コマンドglUniform{1|2|3|4}{f|i}は、引数として渡された値を使用して、locationによって指定されたuniform変数の値を変更するために使用されます。

コマンドで指定された数は、指定されたuniform変数(例えば、float、int、boolの場合は1。vec2、ivec2、bvec2の場合は2など)のデータ型の要素数と一致する必要があります。

接尾辞fは浮動小数点値が渡されることを示し、接尾辞iは整数値が渡されることを示し、この型は指定されたuniform変数のデータ型を一致する必要があります。

この関数のiの変形は、int、ivec2、ivec3、ivec4またはこれらの配列として定義されたuniform変数の値の提供に使用する必要があります。

fの変形は、float、vec2、vec3、vec4、またはこれらの配列の型のuniform変数の値の提供に使用する必要があります。

iまたはfの変形のいずれかが、bool、bvec2、bvec2、bvec4、またはこれらの配列の型のuniform変数の値の提供に使用されることがあります。

uniform変数は、入力値が0または0.0fの場合はfalseに設定され、それ以外の場合はtrueに設定されます。

プログラムオブジェクト内で定義されている全てのアクティブなuniform変数は、プログラムオブジェクトがリンクに成功している場合に0で初期化されています。

これらが再び0に初期化されている場合、次の成功したリンク操作がプログラムオブジェクト上で発生するまで、glUniformの呼び出しによってそれらに関連付けられた値は保持されます。

コマンドglUniform{1|2|3|4}{f|i}vは、単一のuniform変数またはuniform変数配列を変更するために使用されます。

これらのコマンドは、uniform変数またはuniform変数配列に読み込まれる値をカウントし、ポインタを渡します。

単一のuniform値の値を変更する場合は1のカウントを使用する必要があり、配列全体または配列の一部を変更する場合は1以上のカウントを使用することができます。

uniform変数配列内の任意の位置mから始まるn個の要素を読み込む場合、配列内の要素m + n -1は新しい値で置換されます。

m + n -1がuniform変数配列のサイズより大きい場合、配列の終端を超える全ての配列要素の値は無視されます。

コマンドの名前で指定された数はvalue内の各要素の成分数を示し、指定されたuniform変数(例えば、float、int、boolの場合は1、vec2、ivec2、bvec2の場合は2など)のデータ型の成分数と一致する必要があります。

コマンドの名前で指定されたデータ型は、glUniform{1|2|3|4}{f|i}のため、前述のように指定されたuniform変数のデータ型と一致する必要があります。

uniform変数配列の場合、配列の各要素はコマンドの名前で示される型であるとみなされます。
(例えば、glUniform3fまたはglUniform3fvは、vec3型のuniform変数配列の読み込みに使用することができます)

変更するuniform変数配列の要素数は、countで指定します。

コマンドglUniformMatrix{2|3|4}fvは、行列または行列の配列の変更に使用します。

コマンド名の数は行列の次元として解釈されます。

数2は2×2行列(すなわち4つの値)、数3は3×3行列(すなわち9つの値)、数4は4×4行列(すなわち16個の値)を示します。

各行列は列優先の順序で指定されていると仮定しています。

引数countは渡される行列の数を示します。

単一の行列の値を変更する場合は1のカウントを使用する必要があり、行列の配列の変更する場合は1以上のカウントを使用することができます。

glUniform1iとglUniform1ivは、サンプラータイプとして定義されているuniform変数の読み込みに使用することができる唯2つの関数です。

他の関数とサンプラーを読み込むと、GL_INVALID_OPERATIONエラーが発生します。

countが1より大きく、uniform変数が配列を示していない場合、GL_INVALID_OPERATIONエラーが発生し、指定されたuniform変数は変更されません。

前述の例外を除き、シェーダで定義されているuniform変数の型とサイズが、その値の読み込み使用されているコマンドの名前で指定された型とサイズに一致しない場合、GL_INVALID_OPERATIONエラーが発生し、指定されたuniform変数は変更されません。

locationが-1以外の値で、現在のプログラムオブジェクトで有効なuniform変数の場所を表していない場合、エラーが発生し、現在のプログラムオブジェクトのuniform変数のストレージは変更されません。

locationが-1の場合、渡されたデータは無視され、指定されたuniform変数は変更されません。

現在のプログラムオブジェクトが存在しない場合は、GL_INVALID_OPERATIONが発生します。

シェーダで宣言されたuniform変数がglUniformコマンドによって示されているサイズと一致しない場合、GL_INVALID_OPERATIONが発生します。

この関数の整数の変形の一つが、型float、vec2、vec3、vec4、またはこれらの配列のuniform変数の読み込みに使用された場合、あるいはこの関数の浮動小数点の変形の一つが、型int、ivec2、ivec3、ivec4、またはそれらの配列のuniform変数の読み込みに使用された場合は、GL_INVALID_OPERATIONが発生します。

locationが現在のプログラムオブジェクトの無効なuniformの場所で、locationが-1で無い場合、GL_INVALID_OPERATIONが発生します。

countが0未満の場合、GL_INVALID_VALUEが発生します。

transposeがGL_FALSEでない場合、GL_INVALID_VALUEが発生します。

countが1より大きく、示されているunifoem変数が配列変数でない場合、GL_INVALID_OPERATIONが発生します。

サンプラーがglUniform1iとglUniform1iv以外のコマンドを使用して読み込まれた場合、GL_INVALID_OPERATIONが発生します。

glVertexAttribPointer

汎用頂点属性データの配列を定義します。

void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid * pointer);

glVertexAttribPointerは、レンダリング時に使用するインデックスindexにある汎用頂点属性の配列の、場所とデータフォーマットを指定します。

sizeは属性ごとの要素数を指定し、1、2、3、または4である必要があります。

typeは各要素のデータ型を指定し、strideはある属性から次の属性へのバイトストライドを指定しており、頂点と属性を単一の配列内にまとめたり、別々の配列に格納することができます。

GL_TRUEが設定されている場合、normalizedは[-1, 1](符号有り値の場合)または[0, 1](符号無し値の場合)の範囲にマップされた整数フォーマット内に格納された値を示し、アクセス時に浮動小数点に変換されます。

それ以外の場合、値は正規化されず、直接浮動小数点に変換されます。

汎用頂点属性配列が指定されている間、非ゼロで名付けられたバッファオブジェクトがGL_ARRAY_BUFFERターゲット(glBindBuffer参照)にバインドされている場合、pointerはバッファオブジェクトのデータストアへのバイトオフセットとしてみなされます。

また、バッファオブジェクトのバインディング(GL_ARRAY_BUFFER_BINDING)は、インデックスindexのための汎用頂点属性配列のクライアント側の状態(GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING)として保存されます。

汎用頂点属性配列が指定されている場合、sizetypenormalizedstride、そしてpointerはクライアント側の状態として保存され、現在の頂点配列のバッファオブジェクトのバインディングに追加されます。

汎用頂点属性配列の有効/無効には、indexでglEnableVertexAttribArrayやglDisableVertexAttribArrayを呼び出します。

有効にした場合、glDrawArraysやglDrawElementsが呼び出された時に、汎用頂点属性配列が使用されます。

各汎用頂点属性配列は初期状態で無効であり、glDrawElementsやglDrawArraysが呼び出された時にアクセスすることができません。

glVertexAttribPointerは、通常クライアント側に実装されます。

typeが有効な値でない場合、GL_INVALID_ENUMが発生します。

indexがGL_MAX_VERTEX_ATTRIBS以上の場合、GL_INVALID_VALUEが発生します。

sizeが1、2、3、または4でない場合、GL_INVALID_VALUEが発生します。

strideが負の場合、GL_INVALID_VALUEが発生します。

index:変更する汎用頂点属性のインデックスを指定します。

size:汎用頂点属性ごとの要素数を指定します。
1、2、3、または4である必要があります。
初期値は4です。

type:配列内の各要素のデータ型を指定します。
シンボリック定数はGL_BYTE、GL_UNSIGNED_BYTE、GL_SHORT、GL_UNSIGNED_SHORT、GL_FIXED、GL_FLOATが使用できます。
初期値はGL_FLOATです。

normalized:アクセス時に、固定小数点データ値が正規化されたもの(GL_TRUE)か固定小数点値として直接変換されたものか(GL_FALSE)を指定します。

stride:連続した汎用頂点属性間のバイトオフセットを指定します。
strideが0の場合、汎用頂点属性は配列内で隙間無く格納されていると解釈されます。
初期値は0です。

pointer:配列内の最初の汎用頂点属性の最初の要素へのポインタを指定します。
初期値は0です。

glEnableVertexAttribArray

汎用頂点属性配列を有効または無効にします。

void glEnableVertexAttribArray(GLuint index);

void glDisableVertexAttribArray(GLuint index);

glEnableVertexAttribArrayは、indexによって指定された汎用頂点属性配列を有効にします。

glDisableVertexAttribArrayは、indexによって指定された汎用頂点属性配列を無効にします。

デフォルトでは、全ての汎用頂点属性配列を含めて、全てのクライアント側の機能は無効になっています。

有効にした場合、汎用頂点属性配列の値にアクセスし、glDrawArraysやglDrawElementsなどの頂点配列を作成するコマンドが呼び出された時にレンダリングに使用されます。

indexがGL_MAX_VERTEX_ATTRIBS以上の場合、GL_INVALID_VALUEが発生します。

index:有効または無効にする汎用頂点属性配列のインデックスを指定します。



参考文献

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

OpenGL ES 2.0 Reference Pages






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