Note that there are some explanatory texts on larger screens.

plurals
  1. POSharpGL & Kinect - Rendering ColorImageFrame Bitmap to OpenGL Texture
    text
    copied!<p>I want to draw a simple 2D quad with a texture from the Kinect's video input but my code isn't working.</p> <p>Here is my ColorFrameReady event:</p> <pre><code> void Sensor_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e) { ColorImageFrame cif = e.OpenColorImageFrame(); if (cif != null) { middleBitmapSource = cif.ToBitmapSource(); cif.Dispose(); } } </code></pre> <p>This is my OpenGL draw method:</p> <pre><code> private void OpenGLControl_OpenGLDraw(object sender, OpenGLEventArgs args) { // Get the OpenGL instance being pushed to us. gl = args.OpenGL; // Clear the colour and depth buffers. gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT); // Enable textures gl.Enable(OpenGL.GL_TEXTURE_2D); // Reset the modelview matrix. gl.LoadIdentity(); // Load textures if (middleBitmapSource != null) { middleBitmap = getBitmap(middleBitmapSource, quadMiddleWidth, quadMiddleHeight); //middleBitmap = new System.Drawing.Bitmap("C:\\Users\\Bobble\\Pictures\\Crate.bmp"); // When I use this texture, it works fine gl.GenTextures(1, textures); gl.BindTexture(OpenGL.GL_TEXTURE_2D, textures[0]); gl.TexImage2D(OpenGL.GL_TEXTURE_2D, 0, 3, middleBitmap.Width, middleBitmap.Height, 0, OpenGL.GL_BGR, OpenGL.GL_UNSIGNED_BYTE, middleBitmap.LockBits(new System.Drawing.Rectangle(0, 0, middleBitmap.Width, middleBitmap.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb).Scan0); gl.TexParameter(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MIN_FILTER, OpenGL.GL_LINEAR); gl.TexParameter(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MAG_FILTER, OpenGL.GL_LINEAR); } // Move back a bit gl.Translate(0.0f, 0.0f, -25.0f); gl.BindTexture(OpenGL.GL_TEXTURE_2D, textures[0]); // Draw a quad. gl.Begin(OpenGL.GL_QUADS); // Draw centre quad gl.TexCoord(0.0f, 0.0f); gl.Vertex(-(quadMiddleWidth / 2), quadMiddleHeight / 2, quadDepthFar); gl.TexCoord(0.0f, 1.0f); gl.Vertex(quadMiddleWidth / 2, quadMiddleHeight / 2, quadDepthFar); gl.TexCoord(1.0f, 1.0f); gl.Vertex(quadMiddleWidth / 2, -(quadMiddleHeight / 2), quadDepthFar); gl.TexCoord(1.0f, 0.0f); gl.Vertex(-(quadMiddleWidth / 2), -(quadMiddleHeight / 2), quadDepthFar); gl.End(); gl.Flush(); } </code></pre> <p>And here is a helper method which converts a BitmapSource to a Bitmap of a given size:</p> <pre><code> private System.Drawing.Bitmap getBitmap(BitmapSource bitmapSource, double rectangleWidth, double rectangleHeight) { double newWidthRatio = rectangleWidth / (double)bitmapSource.PixelWidth; double newHeightRatio = ((rectangleWidth * bitmapSource.PixelHeight) / (double)bitmapSource.PixelWidth) / (double)bitmapSource.PixelHeight; BitmapSource transformedBitmapSource = new TransformedBitmap(bitmapSource, new ScaleTransform(newWidthRatio, newHeightRatio)); int width = transformedBitmapSource.PixelWidth; int height = transformedBitmapSource.PixelHeight; //int stride = width * ((transformedBitmapSource.Format.BitsPerPixel + 7) / 8); int stride = ((width * transformedBitmapSource.Format.BitsPerPixel + 31) &amp; ~31) / 8; // See: http://stackoverflow.com/questions/1983781/why-does-bitmapsource-create-throw-an-argumentexception/1983886#1983886 byte[] bits = new byte[height * stride]; transformedBitmapSource.CopyPixels(bits, stride, 0); unsafe { fixed (byte* pBits = bits) { IntPtr ptr = new IntPtr(pBits); System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap( width, height, stride, System.Drawing.Imaging.PixelFormat.Format32bppArgb, ptr); return bitmap; } } } </code></pre> <p>The quad renders but it is just white, no texture on it.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload