So I am currently working on a 3D OpenGL game engine in C# using OpenTK, but I ran into a problem when I went to add texture loading
I get this error
An unhandled exception of type 'System.AccessViolationException' occurred in OpenTK.dll Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
I'm not 100% sure why I'm getting a "memory corruption" error, I shouldn't, I've used this code before and I'm just now getting this error.
here is my code:
`
public static int UploadTexture(string pathname)
{
// Create a new OpenGL texture object
int id = GL.GenTexture(); //THIS IS THE LINE VISUAL STUDIO POINTS OUT WHEN I GET THE ERROR
// Select the new texture
GL.BindTexture(TextureTarget.Texture2D, id);
// Load the image
Bitmap bmp = new Bitmap(pathname);
// Lock image data to allow direct access
BitmapData bmp_data = bmp.LockBits(
new Rectangle(0, 0, bmp.Width, bmp.Height),
System.Drawing.Imaging.ImageLockMode.ReadOnly,
System.Drawing.Imaging.PixelFormat.Format32bppArgb);
// Import the image data into the OpenGL texture
GL.TexImage2D(TextureTarget.Texture2D,
0,
PixelInternalFormat.Rgba,
bmp_data.Width,
bmp_data.Height,
0,
OpenTK.Graphics.OpenGL.PixelFormat.Bgra,
OpenTK.Graphics.OpenGL.PixelType.UnsignedByte,
bmp_data.Scan0);
// Unlock the image data
bmp.UnlockBits(bmp_data);
// Configure minification and magnification filters
GL.TexParameter(TextureTarget.Texture2D,
TextureParameterName.TextureMinFilter,
(int)TextureMinFilter.Linear);
GL.TexParameter(TextureTarget.Texture2D,
TextureParameterName.TextureMagFilter,
(int)TextureMagFilter.Linear);
// Return the OpenGL object ID for use
return id;
}
`
Problems like your's are usually associated with out-of-bounds memory access. While C# and the CLI offer a memory safe execution environment OpenGL itself is an unsafe API and unless you're using a wrapper that performs certain validations before calling OpenGL this can happen.
So what's the most likely cause for your trouble? Why would OpenGL access memory out of bounds? One word: Alignment!
By default OpenGL assumes that image rows are aligned to 4 byte boundaries. Say that your actual image data rows are aligned to 1 byte boundaries, your image width is a multiple of 3 but neither 2 nor 4 then OpenGL will read image height times 3 bytes beyond the memory region actually occupied by your image.
The solution is simple: Tell OpenGL the alignment of your image data. For BMP sections it happens to be 1 byte alignments. Add this before your glTexImage2D call:
GL.PixelStore(PixelStoreParameter.UnpackAlignment, 1);