public void Draw(Common common, GraphicsDeviceManager graphics, float width, float height, int mode, int textureNumber) { // 描画する頂点データの定義を設定 graphics.GraphicsDevice.VertexDeclaration = this.vertexDeclaration; // 描画に使用する頂点バッファをセット graphics.GraphicsDevice.Vertices[0].SetSource( this.vertexBuffer, 0, // VertexPositionNormalTexture.SizeInBytes VertexPositionNormalTextureSample.SizeInBytes ); // インデックスバッファをセット graphics.GraphicsDevice.Indices = this.indexBuffer; // 描画するプリミティブの数 int primitiveCount = (int)((width - 3.0f) * (height - 3.0f) * 2); // ビュー座標変換行列 Matrix view = Matrix.CreateLookAt( // カメラ位置(ビューカメラ座標基準値) common.ReferenceValueOfCameraPosition(), // カメラ注視点(ビューカメラ注視点基準値) common.ReferenceValueOfCameraTarget(), // カメラ上方向 Vector3.Up ); this.mapEffect.Parameters["View"].SetValue(view); // ワールド座標変換行列 Matrix world = Matrix.CreateScale(1.0f) // 拡大・縮小 * Matrix.CreateRotationY(MathHelper.ToRadians(0f)) // 回転 * Matrix.CreateTranslation(new Vector3(1, 0, 0)); // 移動 this.mapEffect.Parameters["World"].SetValue(world); // 環境光(ambient color) Vector4 amb = new Vector4(this.basicEffect.AmbientLightColor, 1.0f); this.mapEffect.Parameters["Amb"].SetValue(amb); // 拡散反射光0(diffuse color) Vector4 diff0 = new Vector4(this.basicEffect.DirectionalLight0.DiffuseColor, 1.0f); this.mapEffect.Parameters["Diff0"].SetValue(diff0); // 方向0(direction) Vector4 dir0 = new Vector4(this.basicEffect.DirectionalLight0.Direction, 1.0f); this.mapEffect.Parameters["Dir0"].SetValue(dir0); // 拡散反射光1(diffuse color) Vector4 diff1 = new Vector4(this.basicEffect.DirectionalLight1.DiffuseColor, 1.0f); this.mapEffect.Parameters["Diff1"].SetValue(diff1); // 方向1(direction) Vector4 dir1 = new Vector4(this.basicEffect.DirectionalLight1.Direction, 1.0f); this.mapEffect.Parameters["Dir1"].SetValue(dir1); // 拡散反射光2(diffuse color) Vector4 diff2 = new Vector4(this.basicEffect.DirectionalLight2.DiffuseColor, 1.0f); this.mapEffect.Parameters["Diff2"].SetValue(diff2); // 方向2(direction) Vector4 dir2 = new Vector4(this.basicEffect.DirectionalLight2.Direction, 1.0f); this.mapEffect.Parameters["Dir2"].SetValue(dir2); // テクスチャを整数区切りごとに反転する this.basicEffect.GraphicsDevice.SamplerStates[0].AddressU = TextureAddressMode.Mirror; this.basicEffect.GraphicsDevice.SamplerStates[0].AddressV = TextureAddressMode.Mirror; // エフェクトの使用を開始する this.mapEffect.Begin(); // パスの数だけ繰り替えし描画 (といっても BasicEffect は通常1回) foreach (EffectPass pass in this.mapEffect.CurrentTechnique.Passes) { // パスの開始 pass.Begin(); // インデックスを使用してポリゴンを描画する graphics.GraphicsDevice.DrawIndexedPrimitives( PrimitiveType.TriangleList, // primitiveType:描画するプリミティブタイプ 0, // baseVertex:描画に使用する頂点データの開始オフセット。「2」と指定した場合、インデックス2の頂点データがインデックス0とみなされる(後続の頂点データも同様に引かれる) 0, // minVertexIndex:呼び出しで使われる頂点の最小頂点インデックス。使うと混乱するのでお勧めしない vertexCount, // numVertices:使用される頂点データの数。指定できる最大値は「頂点データの数 - baseVertex - minVertexIndex」 0, // startIndex:頂点インデックスの開始オフセット ((int)height - 3) * ((int)width - 3) * 2 // primitiveCount:描画するプリミティブの数。指定できる最大値は「頂点インデックスの数÷プリミティブの頂点数 - startIndex」 ); // パスの終了 pass.End(); } // エフェクトの使用を終了する this.mapEffect.End(); }