GLFun(14)~Texture2Dクラス(3)
2012. 01. 01
4)initializeメソッド
initializeメソッドはTexture2Dクラスの初期化メソッドで、クラスを利用する際に暗黙的に呼ばれるため明示的に呼び出す必要はありません。
(『詳解 Objective-C 2.0』(最新版『詳解 Objective-C 2.0 第3版』)の『04-05 クラスオブジェクト』にある項目『クラスオブジェクトの初期化』参照)
ここではテクスチャライズに必須な項目、
・テクスチャ画像と貼り付けるプリミティブの合成方法
・テクスチャ座標配列の有効化
を行っています。
このメソッドは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つのテクスチャ関数のいずれかになります。
以下の表でテクスチャのソースコンポーネントへのフィルタリングされたテクスチャ値Rt、Gt、Bt、At、Ltの対応を示します。
CsとAsは、後述するテクスチャ関数によって使用されます。
テクスチャ関数は、フラグメントに適用するテクスチャ画像の値を使用して(glTexParameter参照)フラグメントのRGBAカラーを生成し、フラグメントのテクスチャを決定します。
以下の表は、最初に選択することができる5つのテクスチャ関数が、それぞれどのようにRGBAカラーを生成するかを示しています。
Cは3つのカラー値(RGB)で、Aは関連するアルファ値です。
テクスチャ画像から抽出されたRGBA値の範囲は[0, 1]です。
添字のpは以前のテクスチャステージ(またはテクスチャステージ0の処理の場合は受信フラグメント)から計算される色を、添字sはテクスチャの元の色を、添字cはテクスチャの環境色を、添字vはテクスチャ関数によって生成される値を示します。
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_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のいずれかになります。
以下の表では、どのようにアルファ値が結合されるかを説明します。
以下の表では、値Csは現在バインドされているテクスチャからサンプリングされた色を、Ccは定数のテクスチャ環境色を、Cfは受信フラグメントの元の色を、そしてCpは以前のテクスチャステージから計算された色、またはテクスチャステージ0の処理の場合はCfを表します。
同様に、As、Ac、Af、そしてApはそれぞれのアルファ値を表します。
以下の表では、RGBのソースとオペランドに基づいて、Arg0、Arg1、Arg2に割り当てられる値を説明します。
GL_TEXTUREnのソースの色とアルファはCsとAsで表され、それぞれテクスチャステージnから生成されます。
以下の表では、アルファのソースとオペランドに基づいて、Arg0、Arg1、Arg2に割り当てられる値を説明します。
テクスチャ関数の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)
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
//------------------------------------------------------------------------------
// 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つのテクスチャ関数のいずれかになります。
以下の表でテクスチャのソースコンポーネントへのフィルタリングされたテクスチャ値Rt、Gt、Bt、At、Ltの対応を示します。
CsとAsは、後述するテクスチャ関数によって使用されます。
Texture Base Internal Format | Cs | As |
GL_ALPHA | (0, 0, 0) | At |
GL_LUMINANCE | (Lt, Lt, Lt) | 1 |
GL_LUMINANCE_ALPHA | (Lt, Lt, Lt) | At |
GL_RGB | (Rt, Gt, Bt) | 1 |
GL_RGBA | (Rt, Gt, Bt) | At |
テクスチャ関数は、フラグメントに適用するテクスチャ画像の値を使用して(glTexParameter参照)フラグメントのRGBAカラーを生成し、フラグメントのテクスチャを決定します。
以下の表は、最初に選択することができる5つのテクスチャ関数が、それぞれどのようにRGBAカラーを生成するかを示しています。
Cは3つのカラー値(RGB)で、Aは関連するアルファ値です。
テクスチャ画像から抽出されたRGBA値の範囲は[0, 1]です。
添字のpは以前のテクスチャステージ(またはテクスチャステージ0の処理の場合は受信フラグメント)から計算される色を、添字sはテクスチャの元の色を、添字cはテクスチャの環境色を、添字vはテクスチャ関数によって生成される値を示します。
Texture Base Internal Format | Value | GL_ REPLACE Function | GL_ MODULATE Function | GL_DECAL Function | GL_BLEND Function | GL_ADD Function |
GL_ALPHA | Cv = | Cp | Cp | undefined | Cp | Cp |
Av = | As | ApAs | Av = ApAs | ApAs | ||
GL_LUMINANCE | Cv = | Cs | CpCs | undefined | Cp(1 - Cs) + CcCs | Cp + Cs |
(or 1) | Av = | Ap | Ap | Ap | Ap | |
GL_LUMINANCE _ALPHA | Cv = | Cs | CpCs | undefined | Cp(1 - Cs) + CcCs | Cp + Cs |
(or 2) | Av = | As | ApAs | ApAs | ApAs | |
GL_RGB | Cv = | Cs | CpCs | Cs | Cp(1 - Cs) + CcCs | Cp + Cs |
(or 3) | Av = | Ap | Ap | Ap | Ap | Ap |
GL_RGBA | Cv = | Cs | CpCs | Cp(1 - As) + CsAs | Cp(1 - Cs) + CcCs | Cp + Cs |
(or 4) | Av = | As | ApAs | Ap | ApAs | ApAs |
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_RGB | Texture Function |
GL_REPLACE | Arg0 |
GL_MODULATE | Arg0 × Arg1 |
GL_ADD | Arg0 + Arg1 |
GL_ADD_SIGNED | Arg0 + Arg1 - 0.5 |
GL_INTERPOLATE | Arg0 × Arg2 + Arg1 × (1 - Arg2) |
GL_SUBTRACT | Arg0 - 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_ALPHA | Texture Function |
GL_REPLACE | Arg0 |
GL_MODULATE | Arg0 × Arg1 |
GL_ADD | Arg0 + Arg1 |
GL_ADD_SIGNED | Arg0 + Arg1 - 0.5 |
GL_INTERPOLATE | Arg0 × Arg2 + Arg1 × (1 - Arg2) |
GL_SUBTRACT | Arg0 - Arg1 |
以下の表では、値Csは現在バインドされているテクスチャからサンプリングされた色を、Ccは定数のテクスチャ環境色を、Cfは受信フラグメントの元の色を、そしてCpは以前のテクスチャステージから計算された色、またはテクスチャステージ0の処理の場合はCfを表します。
同様に、As、Ac、Af、そしてApはそれぞれのアルファ値を表します。
以下の表では、RGBのソースとオペランドに基づいて、Arg0、Arg1、Arg2に割り当てられる値を説明します。
GL_SRCn_RGB | GL_OPERANDn_RGB | Argument Value |
GL_TEXTURE | GL_SRC_COLOR | (Cs) |
GL_ONE_MINUS_SRC_COLOR | 1 - (Cs) | |
GL_SRC_ALPHA | (As) | |
GL_ONE_MINUS_SRC_ALPHA | 1 - (As) | |
GL_TEXTUREn | GL_SRC_COLOR | (Cs) |
GL_ONE_MINUS_SRC_COLOR | 1 - (Cs) | |
GL_SRC_ALPHA | (As) | |
GL_ONE_MINUS_SRC_ALPHA | 1 - (As) | |
GL_CONSTANT | GL_SRC_COLOR | (Cc) |
GL_ONE_MINUS_SRC_COLOR | 1 - (Cc) | |
GL_SRC_ALPHA | (Ac) | |
GL_ONE_MINUS_SRC_ALPHA | 1 - (Ac) | |
GL_PRIMARY_COLOR | GL_SRC_COLOR | (Cf) |
GL_ONE_MINUS_SRC_COLOR | 1 - (Cf) | |
GL_SRC_ALPHA | (Af) | |
GL_ONE_MINUS_SRC_ALPHA | 1 - (Af) | |
GL_PREVIOUS | GL_SRC_COLOR | (Cp) |
GL_ONE_MINUS_SRC_COLOR | 1 - (Cp) | |
GL_SRC_ALPHA | (Ap) | |
GL_ONE_MINUS_SRC_ALPHA | 1 - (Ap) |
GL_TEXTUREnのソースの色とアルファはCsとAsで表され、それぞれテクスチャステージnから生成されます。
以下の表では、アルファのソースとオペランドに基づいて、Arg0、Arg1、Arg2に割り当てられる値を説明します。
GL_SRCn_ALPHA | GL_OPERANDn_ALPHA | Argument Value |
GL_TEXTURE | GL_SRC_ALPHA | (As) |
GL_ONE_MINUS_SRC_ALPHA | 1 - (As) | |
GL_TEXTUREn | GL_SRC_ALPHA | (As) |
GL_ONE_MINUS_SRC_ALPHA | 1 - (As) | |
GL_CONSTANT | GL_SRC_ALPHA | (Ac) |
GL_ONE_MINUS_SRC_ALPHA | 1 - (Ac) | |
GL_PRIMARY_COLOR | GL_SRC_ALPHA | (Af) |
GL_ONE_MINUS_SRC_ALPHA | 1 - (Af) | |
GL_PREVIOUS | GL_SRC_ALPHA | (Ap) |
GL_ONE_MINUS_SRC_ALPHA | 1 - (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版 (2011/12/28) 荻原 剛志 商品詳細を見る |
はじめてのiPhone3プログラミング (2009/12/17) Dave Mark、Jeff LaMarche 他 商品詳細を見る |
Beginning Ios 6 Development: Exploring the Ios Sdk (2012/12/26) David Mark、Jack Nutting 他 商品詳細を見る |