GLFun(14)~Texture2Dクラス(3)

2012. 01. 01
4)initializeメソッド

initializeメソッドはTexture2Dクラスの初期化メソッドで、クラスを利用する際に暗黙的に呼ばれるため明示的に呼び出す必要はありません。
(『詳解 Objective-C 2.0』(最新版『詳解 Objective-C 2.0 第3版』)の『04-05 クラスオブジェクト』にある項目『クラスオブジェクトの初期化』参照)

ここではテクスチャライズに必須な項目、
・テクスチャ画像と貼り付けるプリミティブの合成方法
・テクスチャ座標配列の有効化
を行っています。

//------------------------------------------------------------------------------
// BEGIN CHANGES - From here to END CHANGES are not part of the original
// Apple sample code, modification made as allowed by license
// JDL - August 1, 2008 JDL
//
// This code is necessary if this class is being used in a program that has
// drawing done both with and without textures. This code needs tog get called
// once before any texture is drawn, but if you attempt to draw without a
// texture after these have been called and before any drawing with a texture
// happens, it crashes.
//------------------------------------------------------------------------------
+ (void) initialize {

    // These calls need to get called once for the class to work, but if they are called before OpenGL knows about any textures, it crashes,
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
}
//------------------------------------------------------------------------------
// END CHANGES
//------------------------------------------------------------------------------

このメソッドはApple社による元のサンプルコードには無く、後から追加されたものとの説明があります。

initializeメソッドはオリジナルのAppleのサンプルコードの一部ではなく、JDLによって許可された変更です。
このコードは、このクラスを使用するプログラム上で、描画にテクスチャを利用するかしないか両方に対応する場合に必要になります。
このコードはテクスチャを描画する前に一度だけ呼び出す必要がありますが、これらを呼び出した後でテクスチャを付加した描画を行う前にテクスチャ無しの描画を試みるとクラッシュします。


これらの呼び出しは、作業するクラスで一度だけ呼び出す必要がありますが、OpenGLのテクスチャについて知る前に呼び出すとクラッシュします。

テクスチャ画像と貼り付けるプリミティブの合成方法)

glTexEnvでテクスチャ環境(テクスチャと貼り付けるプリミティブの表面属性との合成方法)を設定します。
(『可視化技法 2011/8 テクスチャマッピング』参照)

第一引数targetはテクスチャ環境で、GL_TEXTURE_ENVかGL_POINT_SPRITE_OESを指定します。
今回は通常のテクスチャの貼付けなので、GL_TEXTURE_ENVを指定します。

GL_POINT_SPRITE_OESはポイントスプライト、つまりGL_POINTSで描画する点にテクスチャを貼る場合に指定します。
(『床井研究室/第3回 テクスチャの合成』、『床井研究室/Point Sprite を使ってみる』参照)

第二引数pnameはテクスチャ環境パラメータのシンボリック名で、GL_TEXTURE_ENV_MODEがデフォルトになっています。

第三引数paramは単一のシンボリック定数で、pnameがGL_TEXTURE_ENV_MODEの場合、paramはGL_ADD、GL_MODULATE、GL_DECAL、GL_BLEND、GL_REPLACE、GL_COMBINEのいずれかになります。

GL_REPLACEはプリミティブの表面属性を無視してテクスチャの色に置換されます。
(『青空の果て/読み物/【プログラム】OpenGL ~テクスチャα~ (2004.07.15)』)

テクスチャ座標配列の有効化)

glEnableClientStateでクライアント側の機能を有効にします。

GL_TEXTURE_COORD_ARRAYはテクスチャ座標配列の書き込みを有効にするもので、glDrawArrayが呼び出された時にレンダリングで使用されます。

これが有効になっていないとテクスチャ座標が未定義となり、テクスチャを貼ることができません。

glTexEnv

void glTexEnvf(GLenum target, GLenum pname, GLfloat param);

void glTexEnvi(GLenum target, GLenum pname, GLint param);

void glTexEnvx(GLenum target, GLenum pname, GLfixed param);

target
テクスチャ環境を指定します。
GL_TEXTURE_ENVまたはGL_POINT_SPRITE_OESになります。

pname
単一の値となるテクスチャ環境パラメータのシンボリック名を指定します。
GL_TEXTURE_ENV_MODE、GL_COMBINE_RGB、GL_COMBINE_ALPHA、GL_SRC0_RGB、GL_SRC1_RGB、GL_SRC2_RGB、GL_SRC0_ALPHA、GL_SRC1_ALPHA、GL_SRC2_ALPHA、GL_OPERAND0_RGB、GL_OPERAND1_RGB、GL_OPERAND2_RGB、GL_OPERAND0_ALPHA、GL_OPERAND1_ALPHA、GL_OPERAND2_ALPHA、GL_RGB_SCALE、GL_ALPHA_SCALE、GL_COORD_REPLACE_OESのいずれかになります。

param
単一のシンボリック定数を指定します。
GL_ADD、GL_ADD_SIGNED、GL_DOT3_RGB、GL_DOT3_RGBA、GL_INTERPOLATE、GL_MODULATE、GL_DECAL、GL_BLEND、GL_REPLACE、GL_SUBTRACT、GL_COMBINE、GL_TEXTURE、GL_CONSTANT、GL_PRIMARY_COLOR、GL_PREVIOUS、GL_SRC_COLOR、GL_ONE_MINUS_SRC_COLOR、GL_SRC_ALPHA、GL_ONE_MINUS_SRC_ALPHA、ポイントスプライトのテクスチャ座標の代わりとして単一のブール値、あるいはGL_RGB_SCALEまたはGL_ALPHA_SCALEが指定された時には1.0、2.0、4.0のいずれか一つになります。

void glTexEnvfv(GLenum target, GLenum pname, const GLfloat * params);

void glTexEnviv(GLenum target, GLenum pname, const GLint * params);

void glTexEnvxv(GLenum target, GLenum pname, const GLfixed * params);

target
テクスチャ環境を指定します。
GL_TEXTURE_ENVまたはGL_POINT_SPRITE_OESになります。

pname
単一の値となるテクスチャ環境パラメータのシンボリック名を指定します。
GL_TEXTURE_ENV_MODE、GL_TEXTURE_ENV_COLOR、GL_COMBINE_RGB、GL_COMBINE_ALPHA、GL_SRC0_RGB、GL_SRC1_RGB、GL_SRC2_RGB、GL_SRC0_ALPHA、GL_SRC1_ALPHA、GL_SRC2_ALPHA、GL_OPERAND0_RGB、GL_OPERAND1_RGB、GL_OPERAND2_RGB、GL_OPERAND0_ALPHA、GL_OPERAND1_ALPHA、GL_OPERAND2_ALPHA、GL_RGB_SCALE、GL_ALPHA_SCALE、GL_COORD_REPLACE_OESのいずれかになります。

params
RGBAカラーを含むパラメータ配列へのポインタか、単一のシンボリック定数を指定します。
GL_ADD、GL_ADD_SIGNED、GL_DOT3_RGB、GL_DOT3_RGBA、GL_INTERPOLATE、GL_MODULATE、GL_DECAL、GL_BLEND、GL_REPLACE、GL_SUBTRACT、GL_COMBINE、GL_TEXTURE、GL_CONSTANT、GL_PRIMARY_COLOR、GL_PREVIOUS、GL_SRC_COLOR、GL_ONE_MINUS_SRC_COLOR、GL_SRC_ALPHA、GL_ONE_MINUS_SRC_ALPHA、ポイントスプライトのテクスチャ座標の代わりとして単一のブール値、あるいはGL_RGB_SCALEまたはGL_ALPHA_SCALEが指定された時には1.0、2.0、4.0のいずれか一つになります。 

テクスチャ環境のパラメータを設定します。

テクスチャ環境はフラグメントがテクスチャの時にテクスチャ値がどのように解釈されるかを指定します。

targetがGL_POINT_SPLITE_OESの時、pnameはGL_COORD_REPLACE_OESにする必要があります。

targetがGL_TEXTURE_ENVの時、pnameはGL_TEXTURE_ENV_MODE、GL_TEXTURE_ENV_COLOR、GL_COMBINE_RGB、GL_COMBINE_ALPHA、GL_RGB_SCALE、GL_ALPHA_SCALE、GL_OPERAND0_RGB、GL_OPERAND1_RGB、GL_OPERAND2_RGB、GL_OPERAND0_ALPHA、GL_OPERAND1_ALPHA、GL_OPERAND2_ALPHA、GL_SRC0_RGB、GL_SRC1_RGB、GL_SRC2_RGB、GL_SRC0_ALPHA、GL_SRC1_ALPHA、GL_SRC2_ALPHAのいずれかにすることができます。

pnameがGL_TEXTURE_ENV_MODEの時、paramsはテクスチャ関数のシンボル名(またはポインタ)で、GL_ADD、GL_MODULATE、GL_DECAL、GL_BLEND、GL_REPLACE、GL_COMBINEの6つのテクスチャ関数のいずれかになります。

以下の表でテクスチャのソースコンポーネントへのフィルタリングされたテクスチャ値RtGtBtAtLtの対応を示します。

CsAsは、後述するテクスチャ関数によって使用されます。

Texture Base Internal FormatCsAs
GL_ALPHA(0, 0, 0)At
GL_LUMINANCE(LtLtLt)1
GL_LUMINANCE_ALPHA(LtLtLt)At
GL_RGB(RtGtBt)1
GL_RGBA(RtGtBt)At

テクスチャ関数は、フラグメントに適用するテクスチャ画像の値を使用して(glTexParameter参照)フラグメントのRGBAカラーを生成し、フラグメントのテクスチャを決定します。

以下の表は、最初に選択することができる5つのテクスチャ関数が、それぞれどのようにRGBAカラーを生成するかを示しています。

Cは3つのカラー値(RGB)で、Aは関連するアルファ値です。

テクスチャ画像から抽出されたRGBA値の範囲は[0, 1]です。

添字のpは以前のテクスチャステージ(またはテクスチャステージ0の処理の場合は受信フラグメント)から計算される色を、添字sはテクスチャの元の色を、添字cはテクスチャの環境色を、添字vはテクスチャ関数によって生成される値を示します。

Texture Base 
Internal
Format
ValueGL_
REPLACE
Function
GL_
MODULATE
Function
GL_DECAL
Function
GL_BLEND
Function
GL_ADD
Function
GL_ALPHACv =CpCpundefinedCpCp
 Av =AsApAs Av = ApAsApAs
GL_LUMINANCECv =CsCpCsundefinedCp(1 - Cs) + CcCsCp + Cs
(or 1)Av =ApAp ApAp
GL_LUMINANCE
_ALPHA
Cv =CsCpCsundefinedCp(1 - Cs) + CcCsCp + Cs
(or 2)Av =AsApAs ApAsApAs
GL_RGBCv =CsCpCsCsCp(1 - Cs) + CcCsCp + Cs
(or 3)Av =ApApApApAp
GL_RGBACv =CsCpCsCp(1 - As) + CsAsCp(1 - Cs) + CcCsCp + Cs
(or 4)Av =AsApAsApApAsApAs

pnameがGL_TEXTURE_ENV_MODEで、paramsがGL_COMBINEの場合、テクスチャ関数の形式はGL_COMBINE_RGBとGL_COMBINE_ALPHAの値に依存します。

以下にGL_SRC0_RGB、GL_SRC1_RGB、GL_SRC2_RGB、GL_SRC0_ALPHA、GL_SRC1_ALPHA、そしてGL_SRC2_ALPHAによって指定されたテクスチャのソースが、どのように最終的なテクスチャ色を生成する際に結合されるかを説明します。

以下の表では、GL_SRC0_cをArg0、GL_SRC1_cをArg1、そしてGL_SRC2_cをArg2と表します。

GL_COMBINE_RGBは、GL_REPLACE、GL_MODULATE、GL_ADD、GL_ADD_SIGNED、GL_INTERPOLATE、GL_SUBTRACT、GL_DOT3_RGB、GL_DOT3_RGBAのいずれかになります。

GL_COMBINE_RGBTexture Function
GL_REPLACEArg0
GL_MODULATEArg0 × Arg1
GL_ADDArg0 + Arg1
GL_ADD_SIGNEDArg0 + Arg1 - 0.5
GL_INTERPOLATEArg0 × Arg2 + Arg1 × (1 - Arg2)
GL_SUBTRACTArg0 - Arg1
GL_DOT3_RGB
or
GL_DOT3_RGBA
4 × ((((Arg0r) - 0.5) × ((Arg1r) - 0.5)) + (((Arg0g) - 0.5) × 
((Arg1g) - 0.5)) + (((Arg0b) - 0.5) × ((Arg1b) - 0.5)))

GL_DOT3_RGBとGL_DOT3_RGBAのスカラ結果は、出力の3つ(RGB)または4つ(RGBA)の各要素に置かれます。

同様にGL_COMBINE_ALFAは、GL_REPLACE、GL_MODULATE、GL_ADD、GL_ADD_SIGNED、GL_INTERPOLATE、GL_SUBTRACTのいずれかになります。

以下の表では、どのようにアルファ値が結合されるかを説明します。

GL_COMBINE_ALPHATexture Function
GL_REPLACEArg0
GL_MODULATEArg0 × Arg1
GL_ADDArg0 + Arg1
GL_ADD_SIGNEDArg0 + Arg1 - 0.5
GL_INTERPOLATEArg0 × Arg2 + Arg1 × (1 - Arg2)
GL_SUBTRACTArg0 - Arg1

以下の表では、値Csは現在バインドされているテクスチャからサンプリングされた色を、Ccは定数のテクスチャ環境色を、Cfは受信フラグメントの元の色を、そしてCpは以前のテクスチャステージから計算された色、またはテクスチャステージ0の処理の場合はCfを表します。

同様に、AsAcAf、そしてApはそれぞれのアルファ値を表します。

以下の表では、RGBのソースとオペランドに基づいて、Arg0Arg1Arg2に割り当てられる値を説明します。

GL_SRCn_RGBGL_OPERANDn_RGBArgument Value
GL_TEXTUREGL_SRC_COLOR(Cs)
 GL_ONE_MINUS_SRC_COLOR1 - (Cs)
 GL_SRC_ALPHA(As)
 GL_ONE_MINUS_SRC_ALPHA1 - (As)
GL_TEXTUREnGL_SRC_COLOR(Cs)
 GL_ONE_MINUS_SRC_COLOR1 - (Cs)
 GL_SRC_ALPHA(As)
 GL_ONE_MINUS_SRC_ALPHA1 - (As)
GL_CONSTANTGL_SRC_COLOR(Cc)
 GL_ONE_MINUS_SRC_COLOR1 - (Cc)
 GL_SRC_ALPHA(Ac)
 GL_ONE_MINUS_SRC_ALPHA1 - (Ac)
GL_PRIMARY_COLORGL_SRC_COLOR(Cf)
 GL_ONE_MINUS_SRC_COLOR1 - (Cf)
 GL_SRC_ALPHA(Af)
 GL_ONE_MINUS_SRC_ALPHA1 - (Af)
GL_PREVIOUSGL_SRC_COLOR(Cp)
 GL_ONE_MINUS_SRC_COLOR1 - (Cp)
 GL_SRC_ALPHA(Ap)
 GL_ONE_MINUS_SRC_ALPHA1 - (Ap)

GL_TEXTUREnのソースの色とアルファはCsAsで表され、それぞれテクスチャステージnから生成されます。

以下の表では、アルファのソースとオペランドに基づいて、Arg0Arg1Arg2に割り当てられる値を説明します。

GL_SRCn_ALPHAGL_OPERANDn_ALPHAArgument Value
GL_TEXTUREGL_SRC_ALPHA(As)
 GL_ONE_MINUS_SRC_ALPHA1 - (As)
GL_TEXTUREnGL_SRC_ALPHA(As)
 GL_ONE_MINUS_SRC_ALPHA1 - (As)
GL_CONSTANTGL_SRC_ALPHA(Ac)
 GL_ONE_MINUS_SRC_ALPHA1 - (Ac)
GL_PRIMARY_COLORGL_SRC_ALPHA(Af)
 GL_ONE_MINUS_SRC_ALPHA1 - (Af)
GL_PREVIOUSGL_SRC_ALPHA(Ap)
 GL_ONE_MINUS_SRC_ALPHA1 - (Ap)

テクスチャ関数のRGBとアルファの結果は、GL_RGB_SCALEとGL_ALPHA_SCALE値によってそれぞれ増加し、[0, 1]の範囲にクランプされます。

pnameがGL_TEXTURE_ENV_COLORの場合、paramsは4つの値で構成されるRGBAカラーを保持する配列へのポインタです。

整数の色成分は、正の整数の最大値が1.0、負の整数の最小値が-1.0になるよう、線形にマップされます。

それらは指定された時に[0, 1]の範囲にクランプされます。

Ccはこれら4つの値をとります。

GL_TEXTURE_ENV_MODEはデフォルトでGLMODULATEに、GL_TEXTURE_ENV_COLORはデフォルトで(0, 0, 0, 0)になっています。

targetがGL_POINT_SPRITE_OESで、pnameがGL_COORD_REPLACE_OESの場合、指定されたブール値はポイントスプライトのテクスチャ座標の置換を有効または無効にするために使用されます。

デフォルト値はGL_FALSEです。

glTexEnvは、glActiveTextureで選択された現在のアクティブなテクスチャユニットのためのテクスチャ環境を制御します。

GL_POINT_SPRITE_OESとGL_COORD_REPLACE_OESは、OpenGL ESのバージョン1.1以降で使用することができます。

GL_INVALID_ENUMは、targetまたはpnameが定義されている有効な値でない場合、またはparamsが必要とする(pnameの値に基づく)定義された定数値を持たない場合に発生します。

GL_INVALID_VALUEは、GL_RGB_SCALEまたはGL_ALPHA_SCALEのためのparamsの値が1.0、2.0、4.0のいずれかでない場合に発生します。



参考文献

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

OpenGL ES 1.1 Reference Pages

可視化技法 2011/8 テクスチャマッピング

床井研究室/第3回 テクスチャの合成

床井研究室/Point Spriteを使ってみる

青空の果て/読み物/【プログラム】OpenGL ~テクスチャα~ (2004.07.15)

詳解 Objective-C 2.0 第3版詳解 Objective-C 2.0 第3版
(2011/12/28)
荻原 剛志

商品詳細を見る

はじめてのiPhone3プログラミングはじめてのiPhone3プログラミング
(2009/12/17)
Dave Mark、Jeff LaMarche 他

商品詳細を見る

Beginning Ios 6 Development: Exploring the Ios SdkBeginning Ios 6 Development: Exploring the Ios Sdk
(2012/12/26)
David Mark、Jack Nutting 他

商品詳細を見る






SoundLink Mini Bluetooth speaker_ii_limited
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
05 | 2017/06 | 07
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

SoundLink Mini Bluetooth speaker_ii_limited
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