GLSL~4.5.2 精度修飾子

2012. 01. 31
4.5.2 精度修飾子

浮動小数点や整数の宣言は、型の前に精度修飾子を一つ持つことができます。

修飾子意味
highp上記で述べた頂点言語の最小要件を満たします。
オプションでフラグメント言語を入れられます。
mediump上記のフラグメント言語の最小要件を満たしています。
範囲と精度は、lowpで提供された以上でhighpで提供された以下になります。
lowpmediump未満の範囲と精度ですが、全てのカラーチャンネルの全ての色値を
表現できるように意図しています。

例:

lowp float color;
varying mediump vec2 Coord;
lowp ivec2 foo(lowp mat3);
highp mat4 m;

精度修飾子は、基盤となる実装で変数を格納する時に使用する必要がある、最小範囲と精度を宣言します。

実装では要求よりも大きな範囲と精度が使用されますが、変わりありません。

特定の精度修飾子の実装に使用される増加の範囲と精度の量は、変数、および変数に関する操作と、他の実装依存の詳細に依存することができます。

精度修飾子に必要な最小範囲と精度は、

修飾子浮動小数点の範囲浮動小数点の大きさの範囲浮動小数点の精度整数の範囲
highp(-262, 262)(2-62, 262)相対: 2-16(-216, 216)
mediump(-214, 214)(2-14, 214)相対: 2-10(-210, 210)
lowp(-2, 2)(2-8, 2)絶対: 2-8(-28, 28)

ここで浮動小数点の大きさの範囲とは、ゼロ以外の値の大きさの範囲です。

浮動小数点の精度の場合は、全てのゼロ以外の値のため、任意の値からその値へ相対的に比較した相対精度を意味します。

全ての精度レベルで、ゼロを正確に表現する必要があります。

整数型の場合は、指定された範囲内の全ての整数値を表す必要があります。

実装がコンパイルユニット内の変数のストレージのために宣言された精度を提供できない場合、結果をコンパイルまたはリンクエラーにする必要があります。

高と中精度では、整数の範囲は同じ精度修飾子の浮動小数点値に対応することによって、正確に表現できるようにする必要があります。

つまりhighp inthighp floatで表すことができ、mediump intmediump floatで表すことができます。

ただし、lowp intlowp floatで表すことはできません。

頂点言語は、lowpmediump、そしてhighpのいずれを使用してコンパイルとリンクを行っても、エラー無しである必要があります。

フラグメント言語は、lowpmediumpを使用してコンパイルしてもエラー無しである必要があります。

highpのサポートはオプションです。

実装によって提供される実際の範囲と精度は、APIを介して照会することができます。

リテラル定数には精度修飾子はありません。

どちらもブール変数は実行しません。

コンストラクタの引数が精度修飾子を持っていない場合、浮動小数点値コンストラクタも整数コンストラクタも実行されません。

この項の場合、『演算』は演算子、組み込み関数、コンストラクタを含み、『オペランド』は関数の引数とコンストラクタの引数を含みます。

精度は内部的に数値を求める演算に使用され、その精度の能力はその後に続くその結果として生じる中間値に関連付けされるため、演算によって消費されるオペランドの能力は少なくとも最高精度と同じ高さにする必要があります。

精度が定義されていない定数式と部分式の場合、評価は実行時の、またはサポートされているターゲット(mediumpまたはhighpのどちらか)の精度の最高以上で実行されます。

定数式の評価は不変である必要があり、通常はコンパイル時に実行されます。

オペランドが適切な精度修飾子を持っていない場合、精度の能力は他のオペランドから取得します。

オペランドが精度修飾子を持っていない場合、式中の次に消費される演算のオペランドの精度の能力が使用されます。

このルールは精度修飾されたオペランドが見つかるまで、再帰的に適用されます。

必要に応じて、割り当てのためのl値や、イニシャライザのための宣言された変数、関数呼び出しの引数の仮パラメータ、または関数が返す関数の戻り値の型といった精度の能力が含まれます。

精度がこの方法によって決定することができない、すなわち式全体が精度修飾子を持たないオペランドのみで構成されている場合、結果は割り当てられない、または引数として渡されず、型のデフォルトの精度以上で評価されます。

フラグメントシェーダでこれが発生する場合、デフォルトの精度を定義する必要があります。

例えば、文を考えてみます。

uniform highp float h1;     
highp float h2 = 2.3 * 4.7;// 演算と結果がhighp精度
mediump float m; 
m = 3.7 * h1 * h2;// 全ての演算がhighp精度
h2 = m * h1;// 演算はhighp精度
m = h2 – h1;// 演算はhighp精度
h2 = m + m;// 加算と結果はmediump精度
void f(highp float p); 
f(3.3);// 3.3はhighp精度で渡されます

浮動小数点演算の結果が格納に必要な精度より大きい(小さい)場合、結果はその精度が表現できる最大値(最小値)、あるいは無限大(負の無限大)表現にすることができます。

それ結果は、動作のラッピングや、NaN(Not a Number:非数)の発生、または例外条件などになることができません。

同様に、結果が結果の精度を格納できるよりもゼロに近い場合、結果はゼロまたは(正確に符号を付けられた)無限小値の表現である必要があります。

整数がオーバーフローした結果は未定義の値です。

それはラップされる、またはラップされない可能性があります。

精度修飾子は他の修飾子と同様に、変数の基本型に影響しません。

特に、精度の変換にはコンストラクタは無く、コンストラクタは型のみを変換します。

また精度修飾子は他の修飾子と同様に、パラメータの型に基づく関数のオーバーロードに寄与しません。

次章で説明するように、関数の入力と出力はコピーを介して行われるので、修飾子が一致する必要はありません。



参考文献

The OpenGL ES Shading Language 1.0.17

Wikipedia/NaN






Bose QuietComfort 20
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
08 | 2017/09 | 10
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

Bose QuietComfort 20
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