您的位置:首页 > 运维架构

孙其功陪你学之——opengl纹理贴图(例程)

2013-08-09 15:13 459 查看
本人亲测例程(Opengl宝典提供——略有修改),仅供学习参考

#include <glut.h>//此头文件需注意

#include "glext.h"//此头文件位置需注意

#include <math.h>

#ifndef M_PI

# define M_PI 3.141592649

#endif /* !M_PI */

#include "bitmap.h"

#include "bitmap.c"

/*

* Globals...

*/

int Width; /* Width of window */

int Height; /* Height of window */

BITMAPINFO *TexInfo; /* Texture bitmap information */

GLubyte *TexBits; /* Texture bitmap pixel bits */

static GLfloat xRot = 0.0f;

static GLfloat yRot = 0.0f;

/*

* Functions...

*/

void Redraw(void);

void Resize(int width, int height);

void SpecialKeys(int key, int x, int y)

{

if(key == GLUT_KEY_UP)

xRot-= 5.0f;

if(key == GLUT_KEY_DOWN)

xRot += 5.0f;

if(key == GLUT_KEY_LEFT)

yRot -= 5.0f;

if(key == GLUT_KEY_RIGHT)

yRot += 5.0f;

if(key > 356.0f)

xRot = 0.0f;

if(key < -1.0f)

xRot = 355.0f;

if(key > 356.0f)

yRot = 0.0f;

if(key < -1.0f)

yRot = 355.0f;

// Refresh the Window

glutPostRedisplay();

}

void SetupRC()

{

// Black background

glClearColor(1.0f, 0.0f, 1.0f, 1.0f );

// Set drawing color to green

//glColor3f(0.0f, 1.0f, 0.0f);

}

/*

* 'main()' - Open a window and display a textured sky.

*/

int /* O - Exit status */

main(int argc, /* I - Number of command-line arguments */

char *argv[]) /* I - Command-line arguments */

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH);

glutInitWindowSize(792, 573);

glutCreateWindow("冰心玉壶");

glutSpecialFunc(SpecialKeys);

glutReshapeFunc(Resize);

glutDisplayFunc(Redraw);

TexBits = LoadDIBitmap("poot.bmp", &TexInfo);

SetupRC();

glutMainLoop();

return (0);

}

/*

* 'Redraw()' - Redraw the window...

*/

void

Redraw(void)

{

static GLfloat dark[4] = { 0.0, 0.0, 0.0, 1.0 };

static GLfloat normal[4] = { 0.5, 0.5, 0.5, 1.0 };

static GLfloat bright[4] = { 1.0, 1.0, 1.0, 1.0 };

static GLfloat pos[4] = { -0.2588, 0.0, 0.9659, 0.0 };

/* Clear the window */

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

/* Setup for drawing... */

glDepthFunc(GL_LEQUAL);

glEnable(GL_DEPTH_TEST);

glEnable(GL_LIGHTING);

glEnable(GL_LIGHT0);

glPushMatrix();

glTranslatef(0.0, 0.0, -50.0);

glRotatef(xRot, 1.0f, 0.0f, 0.0f);

glRotatef(yRot, 0.0f, 1.0f, 0.0f);

/* First draw the pot without texturing and with specular highlights */

glDisable(GL_BLEND);

glDisable(GL_TEXTURE_2D);

glLightModelfv(GL_LIGHT_MODEL_AMBIENT, dark);

glLightfv(GL_LIGHT0, GL_DIFFUSE, dark);

glLightfv(GL_LIGHT0, GL_SPECULAR, bright);

glLightfv(GL_LIGHT0, GL_POSITION, pos);

glMaterialfv(GL_FRONT, GL_AMBIENT, dark);

glMaterialfv(GL_FRONT, GL_DIFFUSE, dark);

glMaterialfv(GL_FRONT, GL_SPECULAR, bright);

glMateriali(GL_FRONT, GL_SHININESS, 128);

glColor3f(1.0, 1.0, 1.0);

glutSolidTeapot(10.0);

/* Define the 2D texture image. */

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexImage2D(GL_TEXTURE_2D, 0, 3, TexInfo->bmiHeader.biWidth,

TexInfo->bmiHeader.biHeight, 0, GL_BGR_EXT,

GL_UNSIGNED_BYTE, TexBits);

/* Draw the teapot with texturing, adding the textured colors... */

glBlendFunc(GL_ONE, GL_ONE);

glEnable(GL_BLEND);

glEnable(GL_TEXTURE_2D);

glLightModelfv(GL_LIGHT_MODEL_AMBIENT, normal);

glLightfv(GL_LIGHT0, GL_AMBIENT, normal);

glLightfv(GL_LIGHT0, GL_DIFFUSE, normal);

glLightfv(GL_LIGHT0, GL_SPECULAR, dark);

glMaterialfv(GL_FRONT, GL_AMBIENT, normal);

glMaterialfv(GL_FRONT, GL_DIFFUSE, normal);

glMaterialfv(GL_FRONT, GL_SPECULAR, dark);

glMateriali(GL_FRONT, GL_SHININESS, 0);

glutSolidTeapot(10.0);

glPopMatrix();

glFinish();

}

void

Resize(int width, /* I - Width of window */

int height) /* I - Height of window */

{

/* Save the new width and height */

Width = width;

Height = height;

/* Reset the viewport... */

glViewport(0, 0, width, height);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluPerspective(30.0, (float)width / (float)height, 0.1, 1000.0);

glMatrixMode(GL_MODELVIEW);

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: