{
Текстуры могут значительно сэкономить процессорное время. Хаха, но этот раздел занял у меня много времени:(
Поскольку используется вспомогательная библиотека OpenGL, функциями этой библиотеки сейчас мало кто пользуется, но я все же ее нашел. Благодаря zdcnow (Magnetic Effect) он предоставил мне Delphi-версию этой вспомогательной библиотеки. Прежде чем изучать этот раздел, скачайте файлы glaux.dll и Glaux.pas онлайн и добавьте их в проект.
Хорошо, продолжим путь OPENGL.
Сначала нам нужно добавить модуль SysUtils, поскольку в этом разделе мы собираемся использовать файловые операции, а также нам нужно добавить модуль Glaux.
Затем мы добавляем несколько переменных xrot, yrot и zrot, исходя из первого урока. Эти переменные используются для вращения куба вокруг осей X, Y и Z. текстура[] выделяет место для хранения текстуры. Если вам нужно более одной текстуры, вам следует изменить цифру 1 на нужную вам цифру.
}
ВАР
h_RC: HGLRC; // Контекст рендеринга (таблица описания затенения).
h_DC: HDC // Контекст устройства (таблица описания устройства)
h_Wnd: HWND // дескриптор окна;
h_Instance: HINST // Экземпляр программы (экземпляр).
клавиши: Array[0..255] Boolean // Массив для клавиатурных процедур;
xrot, // величина поворота по оси X (новое)
yrot, // величина вращения по оси Y (новое)
zrot : GLfloat // Величина поворота по оси Z (новое);
Текстура: Array[0..1] Of GLuint // Сохраняем текстуру (новая);
{Затем загрузите два процесса в opengl32.dll, нам нужно их использовать}
PROcedure glGenTextures (n: GLsizei; Var текстуры: GLuint external);
opengl32;
Процедура glBindTexture (цель: GLenum; текстура: GLuint);
opengl32;
{Далее нам нужно добавить новую функцию для повторного ввода изображения. Тип возвращаемого значения этой функции определен в Glaux.pas следующим образом:
TAUX_RGBImageRec= запись
размерX, размерY: GLint;
данные: указатель;
конец;
PTAUX_RGBImageRec= ^TAUX_RGBImageRec;
Конкретное значение будет раскрыто позже}
Функция LoadBmp (имя файла: pchar): PTAUX_RGBImageRec;
Вар
BitmapFile: Thandle // дескриптор файла;
Начинать
//Следующая проверка, указано ли имя файла
If Filename = '' Тогда // Убедитесь, что указано имя файла.
результат := Nil // Если не указано, возвращаем NULL;
//Затем проверяем, существует ли файл.
BitmapFile := FileOpen(Filename, fmOpenWrite); //Попытаемся открыть файл.
//Если мы можем открыть файл, очевидно, что файл существует.
Если BitmapFile > 0 Тогда // Существует ли файл?
Начинать
//Закрываем файл.
FileClose(BitmapFile); //Дескриптор закрытия
//auxDIBImageLoad(Filename) считывает данные изображения и возвращает их.
result := auxDIBImageLoadA(filename); //Загружаем растровое изображение и возвращаем указатель
Конец
Еще
//Если мы не можем открыть файл, мы вернем NiL.
результат := Nil // Если загрузка не удалась, верните NiL;
Конец;
//Далее создаем новую функцию для загрузки карты текстур
Функция LoadTexture: логическое значение;
//Переменная состояния. Мы используем это, чтобы отслеживать, можно ли загрузить растровое изображение и можно ли создать текстуру.
// По умолчанию статус установлен в FALSE (что указывает на то, что ничего не загружается и не создается).
//Переменная TextureImage типа PTAUX_RGBImageRec хранит запись изображения растрового изображения.
//Эта запись содержит ширину, высоту и данные растрового изображения.
Вар
Статус: логическое значение;
Текстурное изображение: Массив [0..1] PTAUX_RGBImageRec;
Начинать
Статус: = ложь;
ZeroMemory(@TextureImage, sizeof(TextureImage)); // Устанавливаем указатель в NULL
TextureImage[0] := LoadBMP('Texture.bmp');
Если TextImage[0] <> Nil Тогда
Начинать
Статус := ИСТИНА // Установить статус ИСТИНА;
//Теперь используем данные из TextImage[0] для создания текстуры.
//glGenTextures(1,texture[0]) сообщает OpenGL, что мы хотим сгенерировать имя текстуры
//(Если вы хотите загрузить несколько текстур, увеличьте число).
//glBindTexture(GL_TEXTURE_2D,texture[0]) сообщает OpenGL связать имя текстурыtexture[0] с целевой текстурой.
//2D-текстуры имеют только высоту (по оси Y) и ширину (по оси X).
//Основная функция присваивает имя текстуры данным текстуры.
//В этом примере мы сообщаем OpenGL, что память в &texture[0] доступна.
//Текстура, которую мы создаем, будет храниться в области памяти, на которую указывает &texture[0].
glGenTextures(1, текстура[0]); // Создаем текстуру
glBindTexture(GL_TEXTURE_2D,texture[0]); //Используем типичную текстуру, сгенерированную из растровых данных
//Внизу создаём настоящую текстуру.
//Следующая строка сообщает OpenGL, что эта текстура является 2D-текстурой (GL_TEXTURE_2D).
//Число ноль представляет уровень детализации изображения, который обычно остается равным нулю.
//Цифра три — это количество компонентов данных. Потому что изображение состоит из трех компонентов: красных данных, зеленых данных и синих данных.
//TextureImage[0].sizeX — ширина текстуры.
//Если вы знаете ширину, вы можете указать ее здесь, но компьютер легко вычислит это за вас.
//TextureImage[0].sizey — высота текстуры.
//Число ноль — это значение границы, обычно ноль.
// GL_RGB сообщает OpenGL, что данные изображения состоят из данных красного, зеленого и синего цветов.
//GL_UNSIGNED_BYTE означает, что данные, составляющие изображение, имеют тип беззнакового байта.
//Наконец... TextureImage[0].data сообщает OpenGL источник данных текстуры.
//Этот пример указывает на данные, хранящиеся в записи TextureImage[0].
// Генерируем текстуру
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0].sizeX,
TextureImage[0].sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE,
ТекстурноеИзображение[0].data);
//Следующие две строки сообщают OpenGL при отображении изображения,
//Когда она больше увеличенной исходной текстуры (GL_TEXTURE_MAG_FILTER)
// Или метод фильтрации, используемый OpenGL, когда текстура уменьшается до размера, меньшего, чем исходная текстура (GL_TEXTURE_MIN_FILTER).
//Обычно я использую GL_LINEAR в обоих случаях. Это позволяет текстурам плавно отображаться как издалека, так и очень близко к экрану.
//Использование GL_LINEAR требует, чтобы процессор и видеокарта выполняли больше операций.
//Если ваша машина медленная, вам, вероятно, следует использовать GL_NEAREST.
//Когда отфильтрованная текстура увеличена, она выглядит очень мозаично (мозаичной).
//Вы также можете комбинировать эти два метода фильтрации. Используйте GL_LINEAR, когда находитесь рядом, и GL_NEAREST, когда далеко.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Линейная фильтрация;
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Линейная фильтрация;
Конец;
//Теперь мы освобождаем память, ранее использовавшуюся для хранения растровых данных.
//Сначала мы проверяем, хранятся ли данные растрового изображения.
//Если да, проверяем, сохранились ли данные.
//Если он был сохранен, удалите его.
//Затем освобождаем структуру изображения TextureImage[0], чтобы гарантировать освобождение всей памяти.
Если назначено(TextureImage[0]) Тогда // Существует ли текстура
Если присвоено(TextureImage[0].data) Тогда // Существует ли изображение текстуры
TextureImage[0].data := Nil // Освободите память, занятую изображением текстуры;
TextureImage[0] := Nil // Освобождаем структуру изображения;
//Наконец возвращаем переменную статуса. Если все в порядке, переменная Статус имеет значение ИСТИНА. В противном случае ЛОЖЬ
результат := Статус // Возвращаемый статус;
Конец;