0

検出器 (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()ですか?

さらに、データのフレームごとの処理を処理するためのより良い方法はありますか?

4

0 に答える 0