ドキュメントを詳細に読み直している最中に、ふと、マテリアルを使えば…という事を思いつき、なんとかプリミティブに動的にアルファを設定する問題が解決しました。


以下のソースに赤文字で示したマテリアルのアルファ設定を変更することで、動的にアルファ値を変更することができるようになります。


============================ ここから ============================


// ライト有効
device.RenderState.Lighting = true;

// アルファブレンド方法を設定する
device.RenderState.AlphaBlendEnable = true;
device.RenderState.AlphaBlendOperation
 = BlendOperation.Add;
device.RenderState.SourceBlend
 = Blend.SourceAlpha;
device.RenderState.DestinationBlend
 = Blend.InvSourceAlpha;
device.RenderState.BlendOperation
 = BlendOperation.Add;

device.TextureState[0].AlphaOperation
 = TextureOperation.Modulate;
device.TextureState[0].AlphaArgument1
 = TextureArgument.Diffuse;
device.TextureState[0].AlphaArgument2
 = TextureArgument.TextureColor;

// アルファ成分を設定したマテリアル使用
Material mat2 = new Material();
mat2.Diffuse = Color.FromArgb(192, 255, 255, 255);
mat2.Ambient = Color.FromArgb(192, 255, 255, 255);
device.Material = mat2;

// テクスチャーをセット
device.SetTexture(0, this._texture);

// 頂点バッファをデバイスのデータストリームにバインド
device.SetStreamSource(0, this._vertexBuffer, 0);

// 描画する頂点のフォーマットをセット
device.VertexFormat
 = CustomVertex.PositionTextured.Format;

// テクスチャーを貼り付けた矩形を回転させるためのY軸回転
Matrix rotateMatrix
 = Matrix.RotationY(Environment.TickCount / 1000.0f);
device.SetTransform(
 TransformType.World,
 rotateMatrix * 
 Matrix.Translation(new Vector3(0.0f, 0.0f, 0.0f)));

// レンダリング(描画)
device.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2);

============================ ここまで ============================


解説

ポイントは、アルファ成分を持ったマテリアルを使うところです。


そこに気が付けば、あとは、マテリアルとテクスチャのアルファ値を掛け合わせるようにRenderState と AlphaOperation を設定すればOKです。


ここで注意すべき点は、ライトを有効にすることです。


ライトを有効にしないと、ブレンド処理が実行されません。


以下、サンプル画像です。


真琴が半透明になって、後ろのティーポットが透けて見えています。



アニメとか好きだから-動的アルファ設定