3ds Max 2014 では、MAXScript のビットマップ ガンマの処理が見直され、長い間放置されていたいくつかの問題が解決されました。
3ds Max 2014 より前のバージョンの MAXScript では、ファイルからロードされた、スクリプトによって作成された、あるいはさまざまなフォーマットでディスク ビットマップ ファイルに保存されたビットマップ値のガンマ設定へのアクセスが制限されていました。
問題のいくつかを以下に示します。
.gamma
プロパティは、ロード用のガンマと保存用のガンマの両方を表現しようと試みましたが、多くの場合は不正確または誤った動作につながるものでした。getPixels()
関数によってピクセル データにアクセスする場合は、常に未加工データを扱うため、ガンマの設定に従うことはできませんでした。compareBitmaps()
関数は、JPG (2.2 のガンマでロードされる)と自分自身のコピー(1.0 のガンマ)と比較した場合 False を生成します。上記の問題を解決するため、3ds Max 2014 では、ビットマップ値のガンマをスクリプトが適切に処理できるように MAXScript が拡張されました。
いずれの場合も、追加は拡張機能として実装されます。すなわち、古いスクリプトも構文上正しいものとしてそのまま残ります。
3ds Max 2014 以降では、ビットマップ値のガンマは #auto
、#default
あるいは上書きの 3 つの方法によって制御することができます。
#auto
は、新しいインテリジェント モードです。 ファイル情報があればそれを使用し、あるいはファイルが浮動小数点かどうかに基づいてガンマをインテリジェントに選択します。 既定値は、この設定です。#default
は実際は古いレガシー モードで、すべてのモードを用意しておくため、また古いファイルをロードするためにのみ存在します。次の拡張機能が実装されました:
openBitmap()
関数は、オプションの gamma:
キーワード引数を受け付けるようになり、次のように使用することができます。
例:
a = openBitmap "test.jpg" gamma:#auto -- auto mode b = openBitmap "test.exr" gamma:1.0 -- an override
同様に、ビットマップ save()
メソッドはオプションの gamma:
キーワードにより拡張され、次のように使用することができます。
save a gamma:#auto -- auto mode
save b gamma:1.0 -- an override
また、save()
関数はオプションのキーワード metadata:
を提供します。これは、さまざまなビットマップ ファイル名選択関数である SelectSaveBitmap()
、getBitmapSaveFilename()
および getBitmapOpenFilename()
から取得されたダイアログ設定を渡すために使用することができます。 詳細については、このページの以降の部分を参照してください。
render()
関数を使用してファイルをレンダリングする場合は、オプションの gamma:
キーワードを使用してガンマを設定することもできます。
例:
render filename:"something.exr" gamma:#auto -- auto mode render filename:"somotherthing.jpg" gamma:1.0 -- an override
既存の .gamma
プロパティはビットマップの実際のガンマを表現するように修正されました。 以前は、出力と入力のガンマが 1 つのパラメータに含まれていて、問題の原因となっていました。
これを解決するため、2 つの新しいプロパティが追加され、入力ガンマおよびそのガンマがどのように取得されたかを明示的に処理するようになりました。
.inputGamma
はロードされたファイルのガンマを通知します。 これは #auto、#default、あるいは上書きの値を返します。 これは、たとえばガンマ情報がどこから取得されたかなどを表示するために使用することができます。 また、たとえば、ロードされたビットマップを確実に保存するために使用することもできます。
.inputGammaValue
は、使用された実際の値を返します。たとえば、#auto の場合はファイル タイプに応じて 1.0 または 2.2、#default の場合は 2.2、上書きの場合は上書き値を返します。
オプションの by-reference 出力パラメータとしてガンマ値、およびダイアログのセットアップ データを返す機能が MAXScript ビットマップ ファイル ダイアログに追加されました。
これらのオプションのパラメータを使用する場合、ガンマ オプションが表示され、有効になります。 使用しない場合、ガンマ オプションは、ファイル ダイアログ内でグレー表示になります。
拡張された機能を以下に示します。
getBitmapOpenFilename()
getBitmapSaveFilename()
SelectSaveBitmap()
これらの各関数では、オプションのキーワード引数 gamma:
は、#auto
、#default
あるいは数値を返す by-reference 変数を参照することができます。
例:
x = SelectSaveBitmap caption:"Select a file" gamma:&gma
関数が正常に返った場合、変数 'gma' にはダイアログからのガンマ値が含まれています。
同様に、ビットマップの[保存] (Save)ダイアログは、[設定] (Setup)ボタンによって格納されたメタデータを、by-reference のオプションの引数 metadata:
を介して要求することによって返すことができます。
例:
x = SelectSaveBitmap caption:"Select a file" gamma:&gma metadata:&data
成功した場合、'gma' 変数はガンマを含み、'data' 変数はビットマップ プラグインによって格納されたデータの配列を含みます。 このデータを、たとえばビットマップの保存操作に使用することができます。
bitmap.filename = SelectSaveBitmap caption:"Select a file" gamma:&gma metadata:&data if (bitmap.filename) do save bitmap gamma:gma metadata:data
関数 getPixels()
は、オプションのブール演算パラメータ linear:
により拡張されました。
例:
a = openBitmap "hello.jpg" gamma:#auto --this will set gamma to 2.2 p = getPixels a [0,0] 50 linear:true --get the linear pixel values (gamma 1.0) p[1].r *= 2.0 --make first pixel twice as red...
次のスクリプト例はすべてのビットマップ テクスチャに適用され、#default
(レガシー モード)に設定された場合は、ガンマを 2.2 の上書きに変更します。
ビットマップ値のガンマ(ロード時に書き込まれる)を変更することはできませんのでご注意ください。新しいガンマを使用して元のソース ファイルから再ロードすることは可能です。
スクリプト:
for tmap in (getClassInstances BitmapTexture) where (tmap.bitmap.inputGamma == #default) do tmap.bitmap = openBitmap tmap.bitmap.filename gamma:2.2