
- •11. Наложение текстуры
- •11.1. Общие положения
- •11.2. Наложение текстуры на грань
- •11.3. Визуализация текстуры
- •11.4. Взаимодействие текстуры с объектом
- •11.5. Генерация текстурных координат
- •11.6. Функции OpenGl для задания текстурного изображения
- •11.7. Функции OpenGl для установки параметров текстуры
- •Значения параметра param
- •11.8. Пример программы с применением текстурирования
Значения параметра 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").