OpenGL ESテンプレート(8)~GLFunViewControllerクラス(7)

2012. 02. 12
デバッグ用コード)

『#if defined(DEBUG) ~ #endif』で囲まれているのはデバッグ用のコードで、デバッグモード時のみ実行されます。

ここではシェーダオブジェクトの情報ログを出力するようにしています。

最初に情報ログを格納するメモリを確保するため、glGetShaderivで情報ログの文字列長を示すGL_INFO_LOG_LENGTHを指定し、取得します。

情報ログに何らかの情報がある場合は、文字列数logLength分のメモリを確保し、glGetShaderInfoLogで情報ログを格納し、NSLogで出力します。

glGetShaderiv

シェーダオブジェクトからパラメータを返します。

void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);

glGetShaderivは、params内の指定したシェーダオブジェクトからのパラメータ値を返します。

以下のパラメータが定義されています。

GL_SHADER_TYPE
paramsは、shaderが頂点シェーダオブジェクトの場合はGL_VERTEX_SHADERを、shaderがフラグメントシェーダオブジェクトの場合はGL_FRAGMENT_SHADERを返します。

GL_DELETE_STATUS
shaderが現在削除フラグが立てられている場合、paramsはGL_TRUEを返し、それ以外の場合はGL_FALSEを返します。

GL_COMPILE_STATUS

シェーダコンパイラをサポートする実装の場合、shader上での最後のコンパイル操作が成功した場合はparamsはGL_TRUEを返し、それ以外の場合はGL_FALSEを返します。

GL_INFO_LOG_LENGTH

シェーダコンパイラをサポートする実装の場合、paramsはヌル終端文字を含むshaderの情報ログ内の文字数(すなわち、情報ログを格納するために必要な文字バッファのサイズ)を返します。
shaderが情報ログを持っていない場合、値0を返します。

GL_SHADER_SOURCE_LENGTH
シェーダコンパイラをサポートする実装の場合、paramsはヌル終端文字を含むshaderのためのシェーダソースを作成するソース文字列の連結の長さ(すなわち、シェーダソースを格納するために必要な文字バッファのサイズ)を返します。
ソースコードが存在しない場合は0を返します。

シェーダコンパイラのサポートはオプションであり、したがって引数GL_SHADER_COMPILERでglGetを呼び出すことによって、使用する前に照会する必要があります。

glShaderSourceglCompileShader、glGetShaderPrecisionFormat、そしてglReleaseShaderCompilerは、シェーダコンパイラをサポートしない実装上では、glGetShaderivでGL_COMPILE_STATUS、GL_INFO_LOG_LENGTH、そしてGL_SHADER_SOURCE_LENGTHの照会するのと同様に、GL_INVALID_OPERATIONを発生させます。

このような実装の代わりに、事前にコンパイルされたシェーダバイナリを供給するための代替として、glShaderBinaryが提供されています。

エラーが発生した場合、paramsの内容は変更されません。

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

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

pnameがGL_COMPILE_STATUS、GL_INFO_LOG_LENGTH、またはGL_SHADER_SOURCE_LENGTHで、シェーダコンパイラがサポートされていない場合、GL_INVALID_OPERATIONが発生します。

shaderがシェーダオブジェクトを参照していない場合、GL_INVALID_OPERATIONが発生します。

shader:照会するシェーダオブジェクトを指定します。

pname:オブジェクトのパラメータを指定します。
有効なシンボル名はGL_SHADER_TYPE、GL_DELETE_STATUS、GL_COMPILE_STATUS、GL_INFO_LOG_LENGTH、GL_SHADER_SOURCE_LENGTHです。

params:要求されたオブジェクトのパラメータを返します。

glGetShaderInfoLog

シェーダオブジェクトの情報ログを返します。

void glGetShaderInfoLog(GLuint shader, GLsizei maxLength, GLsizei *length, GLchar *infoLog);

glGetShaderInfoLogは指定されたシェーダオブジェクトの情報ログを返します。

シェーダオブジェクトの情報ログは、シェーダのコンパイル時に変更されます。

返される文字列はヌル終端されます。

glGetShaderInfoLogはmaxLengthの文字の最大まで、できるかぎり多くの情報ログをinfoLog内に返します。

実際に返される文字数は、ヌル終端を除いて、lengthによって指定されています。

返される文字列の長さが必要な場合は、引数lengthにNULL値を渡すことができます。

返される情報ログの格納に必要なバッファサイズは、GL_INFO_LOG_LENGTH値でglGetShaderivを呼び出すことによって取得することができます。

シェーダオブジェクトの情報ログは、最後のコンパイル操作に関する診断メッセージ、警告メッセージ、その他の情報を含む文字列です。

シェーダオブジェクトが生成された時、情報ログの文字列長は0になります。

シェーダオブジェクトの情報ログは、コンパイル工程に関する情報を伝達するための、OpenGLの実装における主要な機構です。

したがって、情報ログはコンパイルに成功した場合でも、開発工程中のアプリケーション開発者にとって役立ちます。

アプリケーション開発者は、同一の情報ログを生成するために異なるOpenGLの実装を期待してはいけません。

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

shaderがシェーダオブジェクトでない場合、GL_INVALID_OPERATIONが発生します。

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

shader:情報ログを必要とするシェーダオブジェクトを指定します。

maxLength:返される情報ログを格納するための文字バッファのサイズを指定します。

length:(ヌル終端を除いた)infoLog内に返された文字列の長さを返します。

infoLog:情報ログを返すために使用される文字配列を指定します。

コンパイルの成否判定)

最後に呼び出し側のloadShadersに対し、シェーダプログラムのコンパイルに成功したか否かを返します。

glGetShaderivでコンパイルの成否を示すGL_COMPILE_STATUSを指定し、その値を得ます。

コンパイルに成功した場合はTRUEを返し、失敗した場合はglDeleteShaderでシェーダオブジェクトを削除してFALSEを返します。

glDeleteShader

シェーダオブジェクトを削除します。

void glDeleteShader(GLuint shader);

glDeleteShaderはメモリを解放し、shaderによって指定されたシェーダオブジェクトに関連付けられた名前を無効にします。

このコマンドは、実質的にglCreateShaderの呼び出し効果を取り消します。

削除するシェーダオブジェクトがプログラムオブジェクトにアタッチされている場合、削除フラグが立てられますが、レンダリングコンテキストのプログラムオブジェクトへのアタッチされなくなるまで削除されません。
(すなわち、削除する前にアタッチされているものをデタッチする必要があります。)

shaderが値0の場合は無視されます。

オブジェクトに削除フラグが設定されているかどうかを判断するには、引数shaderとGL_DELETE_STATUSでglGetShaderivを呼び出します。

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

shader:削除するシェーダオブジェクトを指定します。


17)linkProgram:メソッド

- (BOOL)linkProgram:(GLuint)prog
{
    GLint status;

    glLinkProgram(prog);

#if defined(DEBUG)
    GLint logLength;
    glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &logLength);
    if (logLength > 0)
    {
        GLchar *log = (GLchar *)malloc(logLength);
        glGetProgramInfoLog(prog, logLength, &logLength, log);
        NSLog(@"Program link log:\n%s", log);
        free(log);
    }
#endif

    glGetProgramiv(prog, GL_LINK_STATUS, &status);
    if (status == 0)
        return FALSE;

    return TRUE;
}

linkProgram:メソッドはloadShadersメソッドから呼び出されるメソッドで、指定されたシェーダプログラムオブジェクトのリンクを行います。

最初にglLinkProgramでプログラムオブジェクトをリンクします。

その後compileShader:type:file:メソッドと同様に、デバッグ用コードとしてプログラムオブジェクトの情報ログの出力と、リンクの成否判定を行います。

プログラムオブジェクトの情報ログの出力は、glGetProgramivで情報ログの文字列長を示すGL_INFO_LOG_LENGTHを指定し、取得します。

情報ログに何らかの情報がある場合は、文字列数logLength分のメモリを確保し、glGetProgramInfoLogで情報ログを格納し、NSLogで出力します。

リンクの成否判定は、glGetProgramivでリンクの成否を示すGL_LINK_STATUSを指定し、その値を得ます。

リンクに成功した場合はTRUEを返し、失敗した場合はFALSEを返します。

glLinkProgram

プログラムオブジェクトをリンクします。

void glLinkProgram(GLuint program);

glLinkProgramはprogramで指定されたプログラムオブジェクトをリンクします。

programにアタッチされたGL_VERTEX_SHADERタイプのシェーダオブジェクトは、プログラマブル頂点プロセッサ上で実行される実行可能オブジェクトの生成に使用します。

programにアタッチされたGL_FRAGMENT_SHADERタイプのシェーダオブジェクトは、プログラマブルフラグメントプロセッサ上で実行される実行可能オブジェクトの生成に使用します。

リンク操作の状態は、プログラムオブジェクトの状態の一部として保存されます。

この値は、プログラムオブジェクトがエラー無しでリンクされ、使用準備ができた場合はGL_TRUEに設定され、それ以外の場合はGL_FALSEになります。

引数にprogramとGL_LINK_STATUSを渡してglGetProgramivを呼び出すことによって、照会することができます。

リンク操作が成功すると、programに属する全てのアクティブなユーザ定義のuniform変数は0に初期化され、プログラムオブジェクトのアクティブなuniform変数はそれぞれglGetUniformLocationを呼び出すことによって照会することができる場所に割り当てられます。

また、汎用頂点属性インデックスにバインドされていない全てのアクティブなユーザ定義のattribute変数は、この一時にバインドされます。

プログラムオブジェクトのリンクは、『OpenGL ES Shading Language Specification』によって指定されたいくつかの理由で失敗することがあります。

リンクエラーが発生するいくつかの条件の一部を以下に示します。

  • 頂点シェーダとフラグメントシェーダが、プログラムオブジェクトに両方とも存在しない。

  • 実装でサポートしているアクティブなattribute変数の数を超えている。

  • uniform変数のストレージ制限を超えている。

  • 実装でサポートしているアクティブなuniform変数の数を超えている。

  • 頂点シェーダまたはフラグメントシェーダの主要関数が欠落している。

  • フラグメントシェーダで実際に使用されている様々な変数が頂点シェーダと同じ方法で宣言されていない(または全てが宣言されていない)。

  • 関数または変数名への参照が未定になっている。

  • 共有グローバルが2つの異なる型で宣言されている、または初期値が異なる。

  • 一つ以上のアタッチされたシェーダオブジェクトが、(glCompileShaderによる)コンパイル、または(glShaderBinaryによる)事前コンパイルされたシェーダバイナリの読み込みに成功していない。

  • 汎用属性行列のバインディングで、行列のいくつかの行がGL_MAX_VERTEX_ATTRIBSの最大許容値を超えている。

  • 十分に連続されていない頂点属性の位置が、属性行列のバインドで結合できていない。

プログラムオブジェクトがリンクに成功した場合、プログラムオブジェクトはglUseProgramを呼び出すことによって現在の状態の一部を作成することができます。

リンク操作の成功/失敗に関わらず、プログラムオブジェクトの情報ログは上書きされます。

情報ログは、glGetProgramInfoLogを呼び出すことによって取得することができます。

リンク操作が成功した場合、glLinkProgramはまた、現在のレンダリング状態の一部として生成された実行可能オブジェクトをインストールし、指定されたプログラムオブジェクトは、glUseProgramを呼び出す前の結果として、既に現在使用されています。

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

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

プログラムオブジェクトの情報ログは更新され、プログラムはリンク操作の時に生成されます。

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

これらの操作を行っても、情報ログまたはプログラムオブジェクトの一部であるプログラムには影響しません。

リンク操作が失敗した場合、program上の以前のリンク操作についての情報は失います。
(すなわち、失敗したリンクはprogramの古い状態に復元されません)

特定の情報はリンク操作に失敗した後でもprogramから取得することができます。

インスタンスのglGetActiveAttribとglGetActiveUniformを参照してください。

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

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

program:リンクするプログラムオブジェクトのハンドルを指定します。

glGetProgramiv

プログラムオブジェクトからパラメータを返します。

void glGetProgramiv(GLuint program, GLenum pname, GLint *params);

glGetProgramivは、params内の指定したプログラムオブジェクトからパラメータの値を返します。

以下のパラメータが定義されています。

GL_DELETE_STATUS
paramsは、programが現在削除フラグが立てられている場合はGL_TRUE、それ以外の場合はGL_FALSEを返します。

GL_LINK_STATUS
paramsは、program上の最後のリンク操作が成功した場合はGL_TRUE、それ以外の場合はGL_FALSEを返します。

GL_VALIDATE_STATUS

paramsは、program上の最後の検証操作が成功した場合はGL_TRUE、それ以外の場合はGL_FALSEを返します。

GL_INFO_LOG_LENGTH
paramsは、ヌル終端文字を含むprogramの情報ログ内にある文字数(すなわち、情報ログを格納するために必要な文字バッファのサイズ)を返します。
programが情報ログを持っていない場合、値0を返します。

GL_ATTACHED_SHADERS
paramsは、programにアタッチされているシェーダオブジェクトの数を返します。

GL_ACTIVE_ATTRIBUTES
paramsは、programのアクティブなattribute変数の数を返します。

GL_ACTIVE_ATTRIBUTE_MAX_LENGTH
paramsは、ヌル終端文字を含むprogramの最長のアクティブなattribute名(すなわち、最長のattribute名を格納するために必要な文字バッファのサイズ)を返します。
アクティブなattributesが存在しない場合、0を返します。

GL_ACTIVE_UNIFORMS
paramsは、programのアクティブなuniform変数の数を返します。

GL_ACTIVE_UNIFORM_MAX_LENGTH
paramsは、ヌル終端文字を含むprogramの最長のアクティブなuniform名(すなわち、最長のuniform変数名を格納するために必要な文字バッファのサイズ)を返します。
アクティブなuniform変数が存在しない場合、0を返します。

エラーが発生した場合、paramsの内容は変更されません。

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

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

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

program:照会するプログラムオブジェクトを指定します。

pname:オブジェクトパラメータを指定します。
有効なシンボリック名はGL_DELETE_STATUS、GL_LINK_STATUS、GL_VALIDATE_STATUS、GL_INFO_LOG_LENGTH、GL_ATTACHED_SHADERS、GL_ACTIVE_ATTRIBUTES、GL_ACTIVE_ATTRIBUTE_MAX_LENGTH、GL_ACTIVE_UNIFORMS、GL_ACTIVE_UNIFORM_MAX_LENGTHです。

params:要求されたオブジェクトパラメータを返します。

glGetProgramInfoLog

プログラムオブジェクトの情報ログを返します。

void glGetProgramInfoLog( GLuint program, GLsizei maxLength, GLsizei *length, GLchar *infoLog);

glGetProgramInfoLogは、指定されたプログラムオブジェクトの情報ログを返します。

プログラムオブジェクトの情報ログは、プログラムオブジェクトがリンクまたは検証された時に変更されます。

文字列はヌル終端で返されます。

glGetProgramInfoLogは、maxLength文字の最大まで、できるかぎり多くの情報ログをinfoLog内に返します。

実際に返される文字数は、ヌル終端を除いて、lengthによって指定されています。

返される文字列の長さが必要な場合は、引数lengthにNULL値を渡すことができます。

返される情報ログの格納に必要なバッファサイズは、GL_INFO_LOG_LENGTH値でglGetProgramivを呼び出すことによって取得することができます。

プログラムオブジェクトの情報ログは、空の文字列、または最後のリンク操作についての情報を含む文字列、あるいは最後の検証操作についての情報を含む文字列のいずれかになります。

それには診断メッセージ、警告メッセージ、その他の情報が含まれている場合があります。

プログラムオブジェクトが生成されると、情報ログは長さ0の文字列になります。

プログラムオブジェクトの情報ログは、リンクや検証に関する情報を伝達するための、OpenGLの実装における主要な機構です。

したがって、情報ログはこれらの操作に成功した場合でも、開発工程中のアプリケーション開発者にとって役立ちます。

アプリケーション開発者は、同一の情報ログを生成するために異なるOpenGLの実装を期待してはいけません。

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

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

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

program:情報ログを必要とするプログラムオブジェクトを指定します。

maxLength:返される情報ログを格納するための文字バッファのサイズを指定します。

length:(ヌル終端を除いた)infoLog内に返された文字列の長さを返します。

infoLog:情報ログを返すために使用されている文字配列を指定します。



参考文献

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

OpenGL ES 2.0 Reference Pages






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