MonoGame/クラスライブラリ/SurfaceFormat列挙体
SurfaceFormat列挙体は、サーフェイス(Texture2DやRenderTarget2D)のデータ形式を指定するための列挙体である。
名前空間 編集
Microsoft.Xna.Framework.Graphics名前空間
構文 編集
public enum SurfaceFormat
フィールド 編集
値 | 概要 |
---|---|
Alpha8 | 8ビットアルファのみ |
Bgr32 | WPF D3DImageが採用している形式。詳しくは知らん。 |
Bgr32SRgb | 青緑赤それぞれ8ビットと未使用8ビットの計32ビットのsRGB形式。 |
Bgr565 | 青5ビット、緑6ビット、赤5ビットの計16ビット |
Bgra32 | WPF D3DImageが採用している形式。詳しくは知らん。 |
Bgra32SRgb | 青緑赤が各8ビットとアルファ8ビットの計32ビットのsRGB形式。 |
Bgra4444 | 青緑赤アルファが各4ビットの計16ビット形式 |
Bgra5551 | 青緑赤が各5ビットとアルファが1ビットの計16ビット形式 |
Color | 定番の32ビットABGR形式。古いXNAはARGB並びだったが末期のXNAとMonoGameはABGR。SurfaceFormatを指定しないTexture2DやRenderTarget2Dはこれになる。最重要形式。 |
ColorSRgb | 32ビットRGBA形式。sRGB |
Dxt1 | DXT1圧縮形式。 |
Dxt1SRgb | DXT1圧縮形式。 |
Dxt1a | DXT1圧縮形式。 |
Dxt3 | DXT3圧縮形式。 |
Dxt3SRgb | DXT3圧縮形式。 |
Dxt5 | DXT5圧縮形式。 |
Dxt5SRgb | DXT5圧縮形式。 |
HalfSingle | 16ビットR浮動小数点数形式。 |
HalfVector2 | 32ビットRG浮動小数点数形式。 |
HalfVector4 | 64ビットARGB浮動小数点数形式。 |
HdrBlendable | HDR浮動小数点数形式 |
NormalizedByte2 | U8ビット、V8ビットの計16ビットのバンプマップ形式。符号付き整数な点に注意。 |
NormalizedByte4 | U16ビット、V16ビットの計32ビットのバンプマップ形式。符号付き整数な点に注意。 |
Rg32 | 32ビットRG形式 |
RgbEtc1 | エリクソンのテクスチャ圧縮形式(Android)。 |
RgbPvrtc2Bpp | PowerVRテクスチャ圧縮形式(iOSとAndroid)。 |
RgbPvrtc4Bpp | PowerVRテクスチャ圧縮形式(iOSとAndroid)。 |
Rgba1010102 | 32ビットRGBA形式、赤緑青が各10ビット、アルファチャンネルが2ビット。Radeon系が推していたディープカラー形式。 |
Rgba64 | 64ビットRGBA形式、赤緑青アルファが各16ビット。GeForce系が推していたディープカラー形式。 |
RgbaAtcExplicitAlpha | ATC/ATITC圧縮形式(Android) |
RgbaAtcInterpolatedAlpha | ATC/ATITC圧縮形式(Android) |
RgbaPvrtc2Bpp | PowerVRテクスチャ圧縮形式(iOSとAndroid)。 |
RgbaPvrtc4Bpp | PowerVRテクスチャ圧縮形式(iOSとAndroid)。 |
Single | IEEE32ビットR浮動小数点数フォーマット。 各チャンネルは32ビット浮動小数点数(float)。 |
Vector2 | IEEE64ビットRG浮動小数点数フォーマット。 各チャンネルは32ビット浮動小数点数(float)。 |
Vector4 | IEEE128ビットRGBA浮動小数点数フォーマット。 各チャンネルは32ビット浮動小数点数(float)。 |
使用例 編集
SurfaceFormat.Color形式のデータを動的に作る。 データの並びは「ABGR」なので注意。
TitleContainerクラスあたりでJPEGやPNGなどの画像ファイルを開き、自前でデコードしてビットマップからテクスチャを作る場合などはこの方法を使う。たとえばスマホゲームでよくある初回起動時に画像などを別途ダウンロードさせる方式は、アプリに素材を埋め込むコンテンツパイプライン方式では対応できないため、面倒でもこの方法を使う必要がある。
using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
namespace CreateDataSample
{
public class Game1 : Game
{
GraphicsDeviceManager _graphics;
SpriteBatch _spriteBatch;
Texture2D _texture;
public Game1()
{
_graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
}
protected override void Initialize()
{
// マウスカーソルを表示する
this.IsMouseVisible = true;
// ウインドウサイズを変更する
_graphics.PreferredBackBufferWidth = 640;
_graphics.PreferredBackBufferHeight = 480;
_graphics.ApplyChanges();
base.Initialize();
}
protected override void LoadContent()
{
_spriteBatch = new SpriteBatch(GraphicsDevice);
// テクスチャのサイズは「2の倍数」でなくても怒られない
int w = _graphics.PreferredBackBufferWidth;
int h = _graphics.PreferredBackBufferHeight;
// テクスチャを生成する
_texture = new Texture2D(GraphicsDevice, w, h);
// ビットマップを生成
// ここではint配列を使っているが、実際にはColor構造体配列を使った方がいい。
var data = new int[w * h];
for (int y = 0, k = 0; y < h; y++)
{
for (int x = 0; x < w; x++, k++)
{
// MonoGameのSurfaceFormat.Colorは「ABGR並び」
byte a = 0xFF;
byte r = (byte)(0xFF * ((float)x / w));
byte g = (byte)(0xFF * ((float)y / h));
byte b = 0;
data[k] = (a << 24) | (b << 16) | (g << 8) | (r << 0);
}
}
// テクスチャにぶち込む
_texture.SetData(data);
}
protected override void Update(GameTime gameTime)
{
#if !__IOS__ && !__TVOS__
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))
Exit();
#endif
base.Update(gameTime);
}
protected override void Draw(GameTime gameTime)
{
_graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
_spriteBatch.Begin();
_spriteBatch.Draw(_texture, new Vector2(0, 0), Color.White);
_spriteBatch.End();
base.Draw(gameTime);
}
}
}