Работа с текстурами
Перед тем как приступить к использованию текстур в программе предлагается скачать библиотеку SOIL.
Ее описание можно найти на странице www.lonesock.net/soil.html.
Скачать архив библиотеки можно здесь www.lonesock.net/files/soil.zip.
Установка достаточна проста, в полученном архиве находим папку src и копируем из него заголовочный файл soil.h, затем для получения lib файла soil.lib, необходимо зайти в папку project и скомпилировать ее для соответствующей версии Visual Studio.
Получив статическую библиотеку и хедер запишите их в соответствующие папки Visual Studio.
Пример#6 Наложение текстуры на плоскость
#define _USE_MATH_DEFINES
#include <string.h>
#include <windows.h>
#include <iostream>
#include <stdio.h>
#include <gl\gl.h> // Header File For The OpenGL32 Library
#include <gl\glu.h> // Header File For The GLu32 Library
#include <glut.h>
#include <soil.h>
#include <cmath>
#pragma comment(lib,"soil.lib")
#define obj 1//количество текстурируемых объектов
int main_window=0;
int screen_width=640;
int screen_height=480;
using namespace std;
GLuint texture[1];// массив для текстур
float Rotate = 0.1f;
#define drawOneLine(x1,y1,z1,x2,y2,z2) glBegin(GL_LINES); \
glVertex3f(x1,y1,z1); glVertex3f (x2,y2,z2); glEnd();
void drawString (char *s)
{
unsigned int i;
for (i = 0; i < strlen (s); i++)
glutBitmapCharacter (GLUT_BITMAP_HELVETICA_18, s[i]);
}
int LoadGLTextures()
{
char *pics[1] = {"grass_.jpg"};
for (int i=0;i<obj;++i)
{
texture[i] = SOIL_load_OGL_texture(
pics[i],
SOIL_LOAD_AUTO,
SOIL_CREATE_NEW_ID,
SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB
| SOIL_FLAG_COMPRESS_TO_DXT );
if(texture[i] == 0)
return false;
// Typical Texture Generation Using Data From The Bitmap
glBindTexture(GL_TEXTURE_2D, texture[i]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
}
return true;
}
void init()
{
LoadGLTextures(); // Загрузка текстур
glClearColor(0.0, 0.0, 0.0, 0.0); // This clear the background color to black
glShadeModel(GL_SMOOTH); // Type of shading for the polygons
// Viewport transformation
glViewport(0,0,screen_width,screen_height);
// Projection transformation
glMatrixMode(GL_PROJECTION); // Specifies which matrix stack is the target for matrix operations
glLoadIdentity(); // We initialize the projection matrix as identity
gluPerspective(60.0f,(GLfloat)screen_width/(GLfloat)screen_height,1.0f,100.0f); // We define the "viewing volume"
glEnable(GL_DEPTH_TEST); // We enable the depth test (also called z buffer)
glPolygonMode (GL_FRONT_AND_BACK, GL_FILL); // Polygon rasterization mode (polygon filled)
glEnable(GL_TEXTURE_2D); // This Enable the Texture mapping
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void DrawCoordinate(void)
{
glLineWidth(1.0);
glDisable(GL_TEXTURE_2D);
glColor3f (1.0F, 1.0F, 1.0F);
glRasterPos3f(1.1f, 0.0f, 0.0f);
drawString ("+X");
glRasterPos3f(-1.1f, 0.0f, 0.0f);
drawString ("-X");
glRasterPos3f(0.0f, 1.1f, 0.0f);
drawString ("+Y");
glRasterPos3f(0.0f, -1.1f, 0.0f);
drawString ("-Y");
glRasterPos3f(0.0f, 0.0f, 1.1f);
drawString ("+Z");
glRasterPos3f(0.0f, 0.0f, -1.1f);
drawString ("-Z");
glBegin(GL_LINES);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 0.0f, 0.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 1.0f, 0.0f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 1.0f);
glEnd();
glEnable (GL_LINE_STIPPLE);
glLineStipple (1.5, 0x00FF);
glColor3f(1.0f, 0.0f, 0.0f);
drawOneLine (0.0, 0.0, 0.0, -1.0, 0.0, 0.0);
glColor3f(0.0f, 1.0f, 0.0f);
drawOneLine (0.0, 0.0, 0.0, 0.0, -1.0, 0.0);
glColor3f(0.0f, 0.0f, 1.0f);
drawOneLine (0.0, 0.0, 0.0, 0.0, 0.0, -1.0);
glLineWidth (1.0);
glDisable (GL_LINE_STIPPLE);
glEnable(GL_TEXTURE_2D);
glColor3f(1.0f, 1.0f, 1.0f);
}
void DrawField(void)
{
float l=4;
glBindTexture(GL_TEXTURE_2D, texture[0]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-2*l, -1.2*l, 0);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 2*l, -1.2*l, 0);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 2*l, 1.2*l, 0);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-2*l, 1.2*l, 0);
glEnd();
}
void myGlutDisplay( void )
{
glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glMatrixMode(GL_MODELVIEW);//glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glColor3f(0.0, 0.0, 0.0);
glPushMatrix();
glTranslatef(0,0,-15);
glRotatef(-70,1,0,0);//+Z сверху c наклоном
glRotatef(225,0,0,1);//XY к пользователю
//установка точки обзора
gluLookAt( 0, 0, 1, 0, 0, 0, 1, 1, 0);//from, to, up-vector
DrawCoordinate();
DrawField();
glPopMatrix();
glLoadIdentity()
Rotate += 0.4;
if (Rotate > 360) Rotate = 0;
glutSwapBuffers();
glutPostRedisplay();
glFlush();
}
void mouse(int button,int state,int x,int y)
{
switch(button)
{
case GLUT_MIDDLE_BUTTON:
exit(0);
}
}
int main(int argc, char* argv[])
{
setlocale(0,"RUS");
glutInit(&argc, argv);
glutInitDisplayMode( GLUT_DOUBLE|GLUT_RGBA |GLUT_DEPTH );
glutInitWindowPosition( 200, 200 );
glutInitWindowSize( 800, 600 );
main_window = glutCreateWindow( "texture" );
init();
glutDisplayFunc( myGlutDisplay );
glutMouseFunc(mouse);
glutMainLoop();
}
Для самостоятельной работы:
1. Нарисуйте куб и нанесите текстуры на его грани.
2. Создайте лунную поверхность.
3. Нарисуйте солнечную батарею и нанесите на нее текстуру.