検出器 (Leap Motion) から 8 ビットの輝度データを受信しています。Leap Motionのカメラ画像に関する情報を次に示します。これらの画像をビットマップにロードし、フレームごとにテクスチャにロードして、シースルー ビデオの錯覚を作成できるようにします。以前にシェーダーを使用したことがなく、初期のアルファ版で OpenGL 2.0 以降をまだサポートしていない Oculus Rift 用の OpenTK ポートを使用しているため、OpenGL 1.0 に固執したいと思います。また、一般的に、私は OpenGL に不慣れであり、この特定のケースのカラー フォーマットでは、少し迷っています。OpenTK ローディング テクスチャの例を使用し、それを Leap Motion ドキュメントの上記の手順と組み合わせようとしています。
検出器の画像データを使用してビットマップを作成し、それをテクスチャにロードするためのコードを次に示します (これは OnUpdateFrame メソッドで行います)。
//Get brightness data from Leap Motion
Frame frame = CustomController.Instance.Frame();
Leap.Image image = frame.Images [1];
//Load image data to a bitmap
Bitmap bitmap = new Bitmap(image.Width, image.Height, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
//Convert to greyscake
ColorPalette grayscale = bitmap.Palette;
for (int i = 0; i < 256; i++)
{
grayscale.Entries[i] = Color.FromArgb((int)255, i, i, i);
}
bitmap.Palette = grayscale;
//Load bitmap to texture
GL.Hint(HintTarget.PerspectiveCorrectionHint, HintMode.Nicest);
GL.GenTextures(1, out texture);
GL.BindTexture(TextureTarget.Texture2D, texture);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
BitmapData data = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, data.Width, data.Height, 0,
OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0);
bitmap.UnlockBits(data);
これは、OnRenderFrame でテクスチャをロードする方法です。
GL.BindTexture(TextureTarget.Texture2D, texture);
GL.Begin(PrimitiveType.Quads);
GL.TexCoord2(0.0f, 1.0f); GL.Vertex2(-3f, -2f);
GL.TexCoord2(1.0f, 1.0f); GL.Vertex2(3f, -2f);
GL.TexCoord2(1.0f, 0.0f); GL.Vertex2(3f, 2f);
GL.TexCoord2(0.0f, 0.0f); GL.Vertex2(-3f, 2f);
GL.End();
コードを実行すると、テクスチャがあるはずの白いボックスが表示され、コードが System.AccessViolationException でクラッシュします。テクスチャとビットマップに関係があると思いますが、PixelFormat
解決方法がわかりません。に使用する適切なパラメータは何GL.TexImage2D()
ですか?
さらに、データのフレームごとの処理を処理するためのより良い方法はありますか?