Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
11. Наложение текстуры.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
609.28 Кб
Скачать

Значения параметра param

Параметр

Смысл

GL_NEAREST

Возвращает значение ближайшего от центра пикселя элемента текстуры

GL_LINEAR

Возвращает среднеарифметическое значение четырех элементов текстуры, расположенных в центре пикселя. Сюда также могут входить эле­менты бордюра текстуры, в зависимости от точно­сти наложения текстуры и значений, установлен­ных для GL_TEXTURE_WRAP_S и/или GL_TEXTURE_WRAP_T

GL_NEAREST_MIPMAP_NEAREST

Выбирает уровень детализации, который наиболее точно соответствует размеру пикселя, и использу­ет критерий GL_NEAREST для формирования значения текстуры

GL_LINEAR_MIPMAP_NEAREST

Выбирает уровень детализации, который наиболее точно соответствует размеру пикселя, и использу­ет критерий GL_LINEAR для формирования значе­ния текстуры

GL_NEAREST_MIPMAP_LINEAR

Выбирает два уровня детализации, которые наи­более точно соответствуют размеру пикселя, и использует критерий GL_NEAREST для формирова­ния каждого значения текстуры. Окончательное значение текстуры является среднеарифметиче­ским этих двух значений. Это значение аргумента установлено по умолчанию

GL_LINEAR_MIPMAP_LINEAR

Выбирает два уровня детализации, которые наиболее точно соответствуют размеру пикселя, и использует критерий GL_LINEAR для формирова­ния каждого значения текстуры. Окончательное значение текстуры является среднеарифметиче­ским этих двух значений

Примечание. Линейная фильтрация для четырех ближайших элементов текстуры приме­нима только для двумерного образа. Для одномерного — линейная фильтра­ция применяется только к двум ближайшим элементам. В остальном дейст­вия функций аналогичны для одномерного и двумерного случаев.

11.8. Пример программы с применением текстурирования

Д ля того чтобы проиллюстрировать вызов средств текстурирования, предлагаемых OpenGL, приведено приложение, которое отображает вращающийся тетраэдр. На рис. 11.10 показан один кадр анимации, создаваемой этой программой. Код данного приложения приведен далее в листинге 11.1.

Листинг 11.1. Приложение, осуществляющее вращение текстурированного тетраэдра:

#include <gl\glut.h>

#include <gl\glaux.h>

#pragma comment(lib, "glaux.lib")

GLfloat ratio = 4.0/3.0;

GLfloat angle = 0.0;

void init()

{ glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluPerspective(60.0, ratio, 0.01f, 110.0);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

gluLookAt(0.0, 2.0, -2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

AUX_RGBImageRec *image = auxDIBImageLoad("image.bmp");

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image->sizeX, image->sizeY, 0, 3, GL_UNSIGNED_BYTE, image->data);

glEnable(GL_TEXTURE_2D);

glEnable(GL_DEPTH_TEST);

}

void reshape(int width, int height)

{ if (ratio > width/height) glViewport(0, 0, width, width/ratio);

else glViewport(0, 0, height*ratio, height);

}

void display()

{ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glPushMatrix();

glRotatef(angle, 0.0, 1.0, 0.0);

glBegin(GL_TRIANGLES);

// грань 0

glTexCoord2f(0, 0); glVertex3f(1, 0, 0);

glTexCoord2f(0, 1); glVertex3f(0, 1, 0);

glTexCoord2f(1, 0); glVertex3f(0, 0, 1);

// грань 1

glTexCoord2f(0, 0); glVertex3f(0, 0, 0);

glTexCoord2f(0, 1); glVertex3f(0, 1, 0);

glTexCoord2f(1, 0); glVertex3f(1, 0, 0);

// грань 2

glTexCoord2f(0, 0); glVertex3f(0, 0, 0);

glTexCoord2f(1, 0); glVertex3f(0, 0, 1);

glTexCoord2f(0, 1); glVertex3f(0, 1, 0);

// грань 3

glTexCoord2f(0, 0); glVertex3f(1, 0, 0);

glTexCoord2f(0, 1); glVertex3f(0, 0, 1);

glTexCoord2f(1, 0); glVertex3f(0, 0, 0);

glEnd();

glPopMatrix();

glFlush();

glutSwapBuffers();

}

void idle()

{ angle += 0.5f;

if (angle > 360.0) angle = 0.0;

glutPostRedisplay();

}

int main(int argc, char* argv[])

{ glutInit(&argc, argv);

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);

glutInitWindowPosition(0, 0);

glutInitWindowSize(640, 480);

glutCreateWindow("Пример текстурирования");

glutDisplayFunc(display);

glutReshapeFunc(reshape);

glutIdleFunc(idle);

init();

glutMainLoop();

return 0;

}

В данном примере для загрузки в оперативную память изображения “image.bmp” используется функция библиотеки GLAux (OpenGL Auxiliary Library), прототип которой:

AUX_RGBImageRec * APIENTRY auxRGBImageLoad(LPCTSTR).

Функция возвращает указатель на структуру AUX_RGBImageRec, где sizeX – ширина и sizeY – высота изображения, а data – указатель на загруженные в память данные изображения.

GLUT автоматически подключает библиотеки OpenGL32.lib, GLUT32.lib и другие, при подключении

#include <gl\glut.h>.

В отличие от библиотеки GLUT библиотеке GLAux, кроме подключения #include <gl\glaux.h>, необходимо также подключение библиотеки GLAux.lib, что можно сделать следующим образом:

#pragma comment(lib, "glaux.lib").

15

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]