GLFun(9)~OpenGLES2DViewクラス(5)

2011. 12. 22
頂点配列の有効化とピクセル演算)

glEnableClientStateはクライアント側の機能を有効にする関数で、引数のGL_VERTEX_ARRAYは頂点配列を表し、これによって頂点配列への書き込みが有効化され、オブジェクトを頂点配列で記述し描画することができます。

この関数はレンダバッファを表示するpresentRenderbuffer:メソッドの前後で2回呼び出されているのですが、この機能はglDisableClientStateを呼び出さない限り持続すると思われること、initWithCoder:内で頂点配列を利用していないことから、何故2回呼び出しているのかは分かりません。
(実際、どちらかをコメントアウトしても動作に問題はありません)

少なくとも図形描画に頂点配列を利用する以上、1回の呼び出しは必須となります。

glBlendFuncはピクセル演算を指定する関数で、この場合は背景に対し(GLFunViewクラスでの図形描画メソッドで)以降に描画する図形をどのように合成するかを指定しています。

ただし、ここでは合成の方法を指定しているだけで、実際に合成を行いたい場合にはサーバ側の機能をglEnableで引数GL_BLENDを渡して有効にする必要があります。
(GLFunViewの描画メソッドでは有効にしていないので、実際には合成は行われません)

glBlendFuncの第一引数は元となる色、第二引数は対象となる色を指定するのですが、今回のGLFunViewのように何も無い背景に対し図形オブジェクトを1つだけ描画する場合、元の色とは後から描画する図形を、対象となる色はそれ以前に描画されている背景色を指します。

第一引数のGL_ONEは指定された色をそのまま表示することを意味し、第二引数のGL_ONE_MINUS_SRC_ALPHAは対象となる色から元の色で指定されたアルファ値を減算した色を乗ずることを意味します。

つまり元の色(図形の色)を(Sr, Sg, Sb, Sa)、対象の色(背景色)を(Dr, Dg, Db, Da)とすると、合成された表示色は、

(Sr * 1, Sg * 1, Sb * 1, Sa * 1) + (Dr * (1 - Sa), Dg * (1 - Sa), Db * (1 - Sa), Da * (1 - Sa))
= (Sr + Dr * (1 - Sa), Sg + Dg * (1 - Sa), Sb + Db * (1 - Sa), Sa + Da * (1 - Sa))

となります。

この辺は言葉では説明し難いので、実際に試したり下記サイトを参照してください。

WisdomSoft/OpenGL入門/混合処理
OpenGL de プログラミング/ブレンディング::計算式の設定
TOBY SOFT wiki/OpenGL/glBlendFuncについて
有限会社ウエスタンビレッジ/OpenGLプログラム
テン*シー*シー/iPhoneアプリ開発、その(105) 星がいっぱいなの
Pentanium Reactor Blog/アルファブレンディング

glEnableClientState

void glEnableClientState(GLenum array);

void glDisableClientState(GLenum array);

クライアント側の機能を有効または無効にします。

glEnableClientStateとglDisableClientStateはクライアント側の機能を個々に有効または無効にします。

デフォルトでは全てのクライアント側の機能が無効になっています。

glEnableClientStateとglDisableClientStateの両方とも、以下の値のいずれか一つの配列を、単一の引数として取ることができます。

GL_COLOR_ARRAY
有効にした場合、カラー配列は書き込みが有効になり、glDrawArraysまたはglDrawElementsが呼び出された時に、レンダリングの間使用することができます。
glColorPointerを参照してください。

GL_NORMAL_ARRAY
有効にした場合、ノーマル配列は書き込みが有効になり、glDrawArraysまたはglDrawElementsが呼び出された時に、レンダリングの間使用することができます。
glNormalPointerを参照してください。

GL_POINT_SIZE_ARRAY_OES

有効にした場合、ポイントサイズ配列はポイントとポイントスプライトのレンダリングに使用するサイズを制御します。
この場合、glPointSizeによって定義されるポイントサイズは無視されます。
ポイントサイズ配列で供給されるポイントサイズは、ポイントとポイントスプライトの両方のレンダリングに使用されるサイズになります。
glPointSizeを参照してください。

GL_TEXTURE_COORD_ARRAY
有効にした場合、テクスチャ座標配列は書き込みが有効になり、glDrawArraysまたはglDrawElementsが呼び出された時に、レンダリングの間使用することができます。
glTexCoordPointerを参照してください。

GL_VERTEX_ARRAY
有効にした場合、頂点配列は書き込みが有効になり、glDrawArraysまたはglDrawElementsが呼び出された時に、レンダリングの間使用することができます。
glVertexPointerを参照してください。

GL_TEXTURE_COORD_ARRAYの有効および無効は、アクティブなクライアントのテクスチャユニットに影響を与えます。

アクティブなクライアントのテクスチャユニットは、glClientActiveTextureで制御されます。

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

array:有効または無効にする機能を指定します。
シンボリック定数は、GL_COLOR_ARRAY、GL_NORMAL_ARRAY、GL_POINT_SIZE_ARRAY_OES、GL_TEXTURE_COORD_ARRAY、そしてGL_VERTEX_ARRAYが指定できます。

glBlendFunc

void glBlendFunc(GLenum sfactor, GLenum dfactor); 

ピクセル演算を指定します。

ピクセルは、元となる値とカラーバッファ(の対象となる値)内にある既存の値をブレンドする関数を使用して描画することができます。

ブレンディングを有効/無効にするには、引数GL_BLENDでglEnableglDisableを使用してください。

ブレンディングの初期状態は無効になっています。

glBlendFuncは、有効になっている時のブレンディング操作を定義しています。

sfactorは、元となる色成分の比率を11のメソッドを使用して指定します。

dfactorは、対象となる色成分の比率を10のメソッドを使用して指定します。

11の有効なメソッドは以下に表で表します。

各メソッドは、赤、緑、青、そしてアルファの4つの比率要素で定義されています。

表とその後の方程式において、元と対象の色成分は(RsGsBsAs)と(RdGdBdAd)として表されています。

これらは0から(kRkGkBkA)間の整数値を持つとすると、

kc = 2mc - 1

と表され、(mRmGmBmA)は、赤、緑、青、そしてアルファのビットプレーン数を示します。

元と対象の比率要素は、(sRsGsBsA)と(dRdGdBdA)として参照されます。

比率要素は表では(fRfGfBfA)と示しており、元または対象の要素を表します。

全ての比率要素の範囲は[0, 1]です。

Parameter (fRfGfBfA)
GL_ZERO (0, 0, 0, 0)
GL_ONE (1, 1, 1, 1)
GL_SRC_COLOR (R/ kRG/ kGB/ kBA/ kA)
GL_ONE_MINUS_SRC_COLOR (1, 1, 1, 1) - (R/ kRG/ kGB/ kBA/ kA)
GL_DST_COLOR (R/ kRG/ kGB/ kBA/ kA)
GL_ONE_MINUS_DST_COLOR (1, 1, 1, 1) - (R/ kRG/ kGB/ kBA/ kA)
GL_SRC_ALPHA (A/ kAA/ kAA/ kAA/ kA)
GL_ONE_MINUS_SRC_ALPHA (1, 1, 1, 1) - (A/ kAA/ kAA/ kAA/ kA)
GL_DST_ALPHA (A/ kAA/ kAA/ kAA/ kA)
GL_ONE_MINUS_DST_ALPHA (1, 1, 1, 1) - (A/ kAA/ kAA/ kAA/ kA)
GL_SRC_ALPHA_SATURATE (iii, 1)

表において、

i = min(AskA - Ad) / kA

ピクセルのブレンド値の決定に、システムは以下の方程式を使用します。

Rd = min(kRRssR + RddR)

Gd = min(kGGssG + GddG)

Bd = min(kBBssB + BddB)

Ad = min(kAAssA + AddA)

ブレンディングは不正確な整数のカラー値で計算するため、上記の方程式の精密な見た目にも関わらず、ブレンディングの計算は正確ではありません。

しかし1に等しくなる必要があるブレンド要素は、その被乗数を変更しないことが保証されており、0に等しいブレンド要素は被乗数を0へ減少させます。

例えばsfactorがGL_SRC_ALPHAで、dfactorがGL_ONE_MINUS_SRC_ALPHA、AskAが等しい場合、方程式は単純なものに置換できます。

Rd = Rs

Gd = Gs

Bd = Bs

Ad = As

全てのピクセル書き込み操作上でのglBlendFuncの操作は、ポイント、ライン、そしてポリゴンの走査変換を含みます。

glBlendFuncはglClearの影響を受けません。

一例として、透明度は最奥から最前にソートされたプリミティブを、glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)を使用して、最も頻繁に実装されます。

この透明度の計算は、カラーバッファのアルファビットプレーンの存在を必要としないことに注意してください。

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)はまた、アンチエイリアシングをしたポイントとラインのレンダリングに便利です。

sfactorまたはdfactorが有効な値でない場合、GL_INVALID_ENUMが発生します。

sfactor:元となる赤、緑、青、そしてアルファのブレンディング要素をどのように計算するかを指定します。
GL_ZERO、GL_ONE、GL_DST_COLOR、GL_ONE_MINUS_DST_COLOR、GL_SRC_ALPHA、GL_ONE_MINUS_SRC_ALPHA、GL_DST_ALPHA、GL_ONE_MINUS_DST_ALPHA、そしてGL_SRC_ALPHA_SATURATEのシンボリック定数を指定できます。
初期値はGL_ONEです。

dfactor:対象となる赤、緑、青、そしてアルファのブレンディング要素をどのように計算するかを指定します。
GL_ZERO、GL_ONE、GL_SRC_COLOR、GL_ONE_MINUS_SRC_COLOR、GL_SRC_ALPHA、GL_ONE_MINUS_SRC_ALPHA、GL_DST_ALPHA、そしてGL_ONE_MINUS_DST_ALPHAの8つのシンボリック定数を指定できます。
初期値はGL_ZEROです。



参考文献

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

OpenGL ES 1.1 Reference Pages

はじめての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 他

商品詳細を見る






Wave SoundTouch music system IV
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
06 | 2017/07 | 08
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

Wave SoundTouch music system IV
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