1.2 色彩と材質
著者:梅谷 武
語句:色彩と材質にかかわる手法について記す。
材質, D3DMATERIAL9構造体, RGB表色系, HSV表色系, テクスチャマッピング, 透明化, アルファブレンディング
作成:2010-09-28
更新:2011-03-08
 3次元コンピュータグラフィックスにおいて図形に色を付けることは、図形を構成する各面の材質ざいしつ, materialを指定することに他ならない。DirectXの内部において、これはD3DMATERIAL9構造体D3DMATERIAL9こうぞうたいで定義される。
typedef struct _D3DMATERIAL9 {
D3DCOLORVALUE Diffuse;        // 拡散反射色(Dr,Dg,Db,Da)
D3DCOLORVALUE Ambient;        // 環境反射色(Ar,Ag,Ab,Aa)
D3DCOLORVALUE Specular;       // 鏡面反射色(Sr,Sg,Sb,Sa)
D3DCOLORVALUE Emissive;       // 発光色(Er,Eg,Eb,Ea)
float Power;                  // 鏡面反射係数
} D3DMATERIAL9;
 実際にレンダリングされたときの色は、この材質パラメータの他、照明の位置・方向と照明光のパラメータ、さらには視点・視方向・視野角から成るカメラパラメータによって決定される。
 dxSetMaterial関数はDirectXに直接D3DMATERIAL9構造体の値を渡して、設定する関数である。

dxSetMaterial

書式 dxSetMaterial(Dr,Dg,Db,Da,Ar,Ag,Ab,Aa,Sr,Sg,Sb,Sa,Er,Eg,Eb,Ea,power)
 SetMaterial関数は材質をLuaの配列として渡すようにしたものである。

SetMaterial

書式 SetMaterial( 材質配列 )
 幾何ライブラリには次の材質配列が既定値として定義されている。
emerald
jade
obsidian
pearl
ruby
turquoise
brass
bronze
chrome
copper
gold
silver
plastic_black
plastic_cyan
plastic_green
plastic_red
plastic_white
plastic_yellow
rubber_black
rubber_cyan
rubber_green
rubber_red
rubber_white
rubber_yellow

sample124.lua

package.path = "std/?.lua"
require( "Geometry" )
 
SetMaterial( emerald )
dxTeapot()
 
tnNewObject()
sample124.lua
 dxSetColor関数はRGB表色系RGBひょうしょくけい, RGB color systemにより材質を設定する。

dxSetColor

書式(1) dxSetColor( R成分, G成分, B成分 )
書式(2) dxSetColor( R成分, G成分, B成分, A成分 )
 dxSetColor関数はHSV表色系HSVひょうしょくけい, HSV color systemにより材質を設定する。

dxSetColorHSV

書式(1) dxSetColorHSV( H成分, S成分, V成分 )
書式(2) dxSetColorHSV( H成分, S成分, V成分, A成分 )

sample125.lua

package.path = "std/?.lua"
require( "Geometry" )
 
function Square()
RotateZ( 45.0 )
RotateX( 90.0 )
dxPolygon( 0.6, 4 )
end
 
for arg = 0.0, 345.0, 15.0 do
PushMatrix()
RotateZ( -arg )
Translate( 0.0, 3.5, 0.0 )
dxSetColorHSV( arg, 1.0, 1.0 )
Square()
PopMatrix()
end
 
tnNewObject()
sample125.lua
テクスチャマッピングてくすちゃまっぴんぐ, texture mappingはテクスチャ座標が設定されたメッシュに対してdxSetTexture関数によりテクスチャ画像を設定して行なう。一旦、dxSetTextureによりテクスチャ画像が設定されるとそれ以降の処理すべてでマッピングされるので、処理終了後、テクスチャをクリアしておくことが望ましい・

dxSetTexture

書式 dxSetTexture( テクスチャ画像ファイル名 )

sample126.lua

dxSetColor( 0.8, 0.8, 0.8 )
dxSetTexture( "media/DSC_0036.JPG" )
HeightMesh(
0.0, 0.0, 1.0, 1.0, 4, 3, {
0.1, 0.2, 0.3, 0.2,
0.2, 0.3, 0.2, 0.1,
0.3, 0.2, 0.1, 0.0
} )
dxSetTexture( "" )
 
tnNewObject()
sample126.lua
 図形の透明化とうめいか, make transparentアルファブレンディングあるふぁぶれんでぃんぐ, alpha blendingにより行なう。このためにはdxSetRenderState関数により、一時的にレンダリング状態を変更する。
 アルファブレンディングは描画順序に依存し、完全な透明処理は実現できない。完全な透明処理が必要な場合はレイトレーシング法等を利用する。

dxSetRenderState

書式 dxSetRenderState( デバイス状態名, 状態値 )
 デバイス状態名と状態値の詳細については、MSDNのIDirect3DDevice9::SetRenderStateの項目を参照すること。幾何ライブラリにはDirectXのすべてのデバイス状態名と状態値が定義されている。

sample127.lua

package.path = "std/?.lua"
require( "Geometry" )
 
function Square()
RotateZ( 45.0 )
RotateX( 90.0 )
dxPolygon( 0.6, 4 )
end
 
dxSetRenderState( D3DRS_ALPHABLENDENABLE, 1 )
dxSetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA )
dxSetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA )
PushMatrix()
Translate( 0.0, 0.0, -0.5 )
dxSetColor( 0.8, 0.0, 0.0, 1.0 )
Square()
PopMatrix()
PushMatrix()
Translate( 0.0, 0.0, 0.5)
dxSetColor( 0.8, 0.8, 1.0, 0.5 )
Square()
PopMatrix()
dxSetRenderState( D3DRS_ALPHABLENDENABLE, 0 )
 
tnNewObject()
sample127.lua
語  句
材質 ざいしつ, material
D3DMATERIAL9構造体 D3DMATERIAL9こうぞうたい
RGB表色系 RGBひょうしょくけい, RGB color system
HSV表色系 HSVひょうしょくけい, HSV color system
テクスチャマッピング てくすちゃまっぴんぐ, texture mapping
透明化 とうめいか, make transparent
アルファブレンディング あるふぁぶれんでぃんぐ, alpha blending
 
Published by SANENSYA Co.,Ltd.