1. Предисловие:
Для Delphi, если вы хотите рисовать картинки, вам нужно сначала их обработать, а также ссылаться на другие модули, которые не входят в Delphi, поэтому вам нужно скачать Gl.pas отдельно. Модуль OpenGl, часто встречающийся в Интернете, инкапсулирован в версию 1.0, и эта функция не объявлена. Блоки Gl.pas можно найти в Интернете. Кроме того, требуются модуль Glaux.pas и glaux.dll, которые являются вспомогательными библиотеками. Загрузка будет предоставлена в конце этой статьи.
2. Процесс реализации:
Рисование картин требует следующих процессов. Собственный рисунок окна основан на растровых изображениях, таких как png, jpg и т. д. При рисовании его можно преобразовать в bmp, а затем нарисовать.
1. Загрузите изображения в формате bmp: используйте auxDIBImageLoadA или другие функции.
2. Преобразование в текстуру: glGenTextures -> glBindTexture -> glTexImage2D, glTexParameteri используется для установки связанных параметров.
3. Рисуем текстуру: glBindTexture -> glBegin(GL_QUADS) -> glTexCoord2f -> glVertex2f -> glEnd
3. Нарисуйте, используя функцию glDrawPixels.
glDrawPixels имеет следующие 5 параметров:
width: ширина изображения таблицы
height: высота изображения таблицы.
формат: формат хранения данных изображений таблиц
тип: неизвестен
пиксели: указатель на данные DIB
Пример кода выглядит следующим образом:
процедура TForm1.Draw;var Bmp: TBitmap;begin Bmp := Bmp.LoadFromFile(ExtractFilePath(ParamStr(0)) + '1.bmp'); // Очищаем буфер gl_COLOR_BUFFER_BIT или GL_DEPTH_BUFFER_BIT); / / Данные изображения TBitmap постоянно хранятся в памяти в обратном порядке строк. Первый адрес, который является адресом буфера изображения, можно получить через TBitmap.ScanLine[TBitmap.Height-1] // Цвет изображения bmp. хранится в bgr, поэтому вам нужно выбрать GL_BGR_EXT в качестве параметра glDrawPixels(Bmp.Width, Bmp.Height, GL_BGR_EXT, GL_UNSIGNED_BYTE, Bmp.ScanLine[Bmp.Height - 1]); SwapBuffers(FDC.Free;end;
Вам не нужно включать наложение текстур для рисования изображений указанным выше методом. Вы можете использовать функцию glPixelZoom для масштабирования изображения. Положение отображения находится в левом нижнем углу окна (я не знаю, как изменить изображение). положение на данный момент.)
3. Используйте рисунок текстуры
Если вы хотите управлять положением отображения и масштабированием изображения, вы можете использовать следующие методы.
1. В соответствии с процессом мы сначала загружаем изображение в программу и получаем соответствующую информацию об изображении .
Чтобы загрузить изображения в текстуры, посетите этот сайт://www.VeVB.COm/article/52125.htm.
Загрузка растрового изображения в Delphi очень проста и может быть загружена следующими способами:
(1) Загрузите изображение с помощью функции auxDIBImageLoadA вспомогательной библиотеки. Возвратом является указатель данных PTAUX_RGBImageRec, а формат данных DIB — RGB.
// Структура данных RGB TAUX_RGBImageRec = размер записи .bmp')); // Как выпустить п? Ни Dispose, ни Freemem не могут управлять этим концом указателя;
(2) Загрузите изображения через TBitmap.LoadFromFile. Delphi поставляется с ним. Судя по сравнению эффективности, производительность такая же, как у auxDIBImageLoadA, но формат данных DIB — BGR, а указатель DIB — TBitmap.ScanLine[Bmp.Height - 1].
var Bmp: TBitmap;begin Bmp := TBitmap.Create; TBitmap.LoadFromFile(ExtractFilePath(ParamStr(0)) + '1.bmp'); // делаем что-нибудь // Release Bmp.Free;end;
2. Создайте текстуру , включая glGenTextures и glBindTexture, в Gl.pas.
// Создаем область текстуры glGenTextures(1, @texture); // Привязываем область текстуры glBindTexture(GL_TEXTURE_2D, текстура // Используем растровое изображение для создания текстуры изображения glTexImage2D( GL_TEXTURE_2D, // Текстура представляет собой 2D-текстуру GL_TEXTURE_2D); 0, // Уровень детализации изображения по умолчанию равен 0 3, // Количество компонентов данных. Поскольку изображение состоит из красного, зеленого и синего цветов, значение по умолчанию равно 3 Bmp.Width, // Ширина текстуры Bmp.Height, // Высота текстуры равна 0, /. / Значение границы по умолчанию равно 0 GL_BGR_EXT, // Формат данных bmp использует bgr GL_UNSIGNED_BYTE, // Данные, составляющие изображение, представляют собой беззнаковый байт типа Bmp.ScanLine[Bmp.Height - 1] // Данные DIB. указатель); // Следующие две строки позволяют opengl использовать метод фильтрации, который OpenGL использует при увеличении исходной текстуры (GL_TEXTURE_MAG_FILTER) или уменьшении исходной текстуры (GL_TEXTURE_MIN_FILTER). // GL_LINEAR использует линейную фильтрацию для сглаживания обработки изображения, но требует больше памяти и ЦП gl_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Линейная фильтрация glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Линейная фильтрация
3. Рисуем текстуру
Перед рисованием текстуры необходимо уведомить OpenGL о включении отображения текстур glEnable(GL_TEXTURE_2D). При включении рисование без текстур работать не будет. Просто не забудьте закрыть его, когда закончите его использовать.
// Ниже показано рисование с использованием четырехугольника // Включить наложение текстуры, если glIsEnabled(GL_TEXTURE_2D) = 0, then glEnable(GL_TEXTURE_2D); // Очистить буфер gl_COLOR_BUFFER_BIT или GL_DEPTH_BUFFER_BIT); l := t; := 10; ш := 200; // Увеличить изображение до 200*200 // Выбрать текстуру. Если в сцене используется несколько текстур, текстуру невозможно связать между glBegin() и glBindTexture(GL_TEXTURE_2D,texture); //Третий; glTexCoord2f Одним из параметров является координата X. // 0.0 — левая сторона текстуры. 0,5 — это середина текстуры, а 1,0 — правая сторона текстуры. //Вторым параметром glTexCoord2f является координата Y. // 0.0 — нижняя часть текстуры. 0,5 — это середина текстуры, а 1,0 — верх текстуры. glTexCoord2f(0, 1); glTexCoord2f(1, 1); glTexCoord2f(1, 0); glTexCoord2f(l + w, t + w); 0, 0 glVertex2f(л, т + ш); глКонец();
Рисунок выше закончен. Ниже приведен полный код Draw. Вам не нужно ссылаться на вспомогательную библиотеку Glaux.pas.
процедура TForm1.Draw;var Bmp: TBitmap; текстура: GLuint; l, t, w: Integer;begin Bmp := TBitmap.Create; Bmp.LoadFromFile(ExtractFilePath(ParamStr(0)) + '1.bmp'); / Создать область текстуры glGenTextures(1, @texture); // Привязываем область текстуры glBindTexture(GL_TEXTURE_2D,texture); // Используем растровое изображение для создания текстуры изображения glTexImage2D( GL_TEXTURE_2D, // Текстура представляет собой 2D-текстуру GL_TEXTURE_2D 0, // Уровень детализации изображения по умолчанию равен 0 3, / / Количество компонентов данных. Поскольку изображение состоит из красного, зеленого и синего цветов, значение по умолчанию равно 3 Bmp.Width, // Ширина текстуры Bmp.Height, // Высота текстуры равна 0, // Значение границы по умолчанию равно 0 GL_BGR_EXT, // Формат данных bmp использует bgr GL_UNSIGNED_BYTE, // Данные, из которых состоит изображение это беззнаковый тип байта Bmp.ScanLine[Bmp .Height - 1] // указатель данных DIB); Следующие две строки позволяют opengl использовать метод фильтрации, который OpenGL использует при увеличении исходной текстуры (GL_TEXTURE_MAG_FILTER) или уменьшении исходной текстуры (GL_TEXTURE_MIN_FILTER). // GL_LINEAR использует линейную фильтрацию для сглаживания обработки изображений, но требует больше памяти и процессора glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Линейная фильтрация glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Линейная фильтрация// Ниже показано рисование с использованием четырехугольника // Включить наложение текстуры, если glIsEnabled(GL_TEXTURE_2D) = 0, то glEnable(GL_TEXTURE_2D); // Очистить буфер gl_COLOR_BUFFER_BIT или GL_DEPTH_BUFFER_BIT); l := t :=; 10; ш := 200; // Увеличить изображение до 200*200 // Выбрать текстуру. Если в сцене используется несколько текстур, текстуру нельзя связать между glBegin() и glBindTexture(GL_TEXTURE_2D,texture); //Третий; glTexCoord2f Одним из параметров является координата X. // 0.0 — левая сторона текстуры. 0,5 — это середина текстуры, а 1,0 — правая сторона текстуры. //Вторым параметром glTexCoord2f является координата Y. // 0.0 — нижняя часть текстуры. 0,5 — это середина текстуры, а 1,0 — верх текстуры. glTexCoord2f(0, 1); glTexCoord2f(1, 1); glTexCoord2f(1, 0); glTexCoord2f(l + w, t + w); 0, 0 glVertex2f(л, т + ш); glEnd(); Bmp.Free; SwapBuffers (ФДК); конец;
Полный код этого примера можно скачать здесь.