BitmapData data = bitmap2.LockBits(new System.Drawing.Rectangle(x, y, weight, height),
ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
Тут получается память изображения. Формат пикселя в
data
будет XRGB с шириной 32 бита.
Внимание здесь следует обратить на то, что формат указан как RGB32. Это
значит что alpha-канал в формате никак не представлен и, скорее всего, у каждого пикселя будет нулевым т.к. место под него в формате заявлено.
Далее.
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, data.Width, data.Height, 0,
OpenTK.Graphics.OpenGL.PixelFormat.Rgba, PixelType.UnsignedByte, data.Scan0);
PixelInternalFormat.Rgba
означает что в памяти GPU текстура будет представлена в формате RGBA с каналами
float
с нормализацией.
OpenTK.Graphics.OpenGL.PixelFormat.Rgba
означает что формат
data.Scan0
нужно воспринимать как RGBA, а
PixelType.UnsignedByte
означает что каналы в
data.Scan0
нужно воспринимать как
unsigned byte
.
Тут на лицо несовпадение формата считанного из файла изображения и формата создаваемой текстуры. И если размеры и число каналов между форматами совпадают, то трактовка самих каналов - нет.
XRGB != RGBA
.
Все нужно привести к единому формату. Например, из файла читать формат
Format32bppArgb
. Но в этом случае есть вероятность ошибиться с порядком каналов между
Format32bppArgb
и
OpenTK.Graphics.OpenGL.PixelFormat.Rgba
.
Еще, как вариант, можно инициализировать незадействованный канал в исходных данных.
Одним словом, после чтения из файла, данные будущей текстуры нужно подогнать под желаемый формат текстуры.