@Re7r0

Как загрузить картинку в OpenTK c# с прозрачным фоном, при чём сам фон и так прозрачный?

Как загрузить картинку в OpenTK c# с прозрачным фоном, при чём сам фон и так прозрачный?
загрузка спрайта:
public int LoadTexture(Bitmap bitmap2, int x, int y, int weight, int height)
            {
                int tex;
                GL.Hint(HintTarget.PerspectiveCorrectionHint, HintMode.Nicest);

                GL.GenTextures(1, out tex);
                GL.BindTexture(TextureTarget.Texture2D, tex);

                BitmapData data = bitmap2.LockBits(new System.Drawing.Rectangle(x, y, weight, height),
                    ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
                

                GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, data.Width, data.Height, 0,
                    OpenTK.Graphics.OpenGL.PixelFormat.Rgba, PixelType.UnsignedByte, data.Scan0);
                bitmap2.UnlockBits(data);

                GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
                GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);

                return tex;
            }


отображение:
public static void DrawImage(int image, float x, float y, int weight, int height)
            {
                GL.MatrixMode(MatrixMode.Projection);
                GL.PushMatrix();
                GL.LoadIdentity();



                GL.Ortho(-x, 1920-(x+weight), 1080-(y+height), -y, 1, -1.0f);

                GL.MatrixMode(MatrixMode.Modelview);
                GL.PushMatrix();
                GL.LoadIdentity();

                GL.Disable(EnableCap.Lighting);

                GL.Enable(EnableCap.Texture2D);


                GL.BindTexture(TextureTarget.Texture2D, image);

                GL.Begin(BeginMode.Quads);

                GL.TexCoord2(0, 0);
                GL.Vertex3(0, 0, 0);

                GL.TexCoord2(1, 0);
                GL.Vertex3(256, 0, 0);

                GL.TexCoord2(1, 1);
                GL.Vertex3(256, 256, 0);

                GL.TexCoord2(0, 1);
                GL.Vertex3(0, 256, 0);

                GL.End();

                GL.Disable(EnableCap.Texture2D);
                GL.PopMatrix();

                GL.MatrixMode(MatrixMode.Projection);
                GL.PopMatrix();

                GL.MatrixMode(MatrixMode.Modelview);
            }
  • Вопрос задан
  • 398 просмотров
Решения вопроса 1
@MarkusD
все время мелю чепуху :)
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.
Еще, как вариант, можно инициализировать незадействованный канал в исходных данных.

Одним словом, после чтения из файла, данные будущей текстуры нужно подогнать под желаемый формат текстуры.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы