簡單的紋理貼圖實例,來學習OpenGL的功能
//main.h
#if !defined_MAIN_H_
#define _MAIN_H_
#include<gl\glut.h>
#define WIDTH 64
#define HEIGHT 64
GLubyte Image[WIDTH][HEIGHT][4];
static GLuint texName;
GLint WinWidth;
GLint WinHeight;
void Initialization(void);
void OnDisplay(void);
void OnReshape(int,int);
void keyboard (unsigned char key, int x, int y);
void MakeImage(void);
void Initialization(void);
#endif
//main.cpp
// 紋理映射實例.cpp : 定義控制檯應用程序的入口點。
//
#include "stdafx.h"
#include "main.h"
#include <stdlib.h>
int main(int argc, char* argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(480,480);
glutInitWindowPosition(100, 100);
glutCreateWindow("繪製sanwei");
Initialization();
glutReshapeFunc(OnReshape);
glutDisplayFunc(OnDisplay);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}
//創建位圖函數
void MakeImage(void)
{
int i,j,c;
for(i=0;i< HEIGHT;i++)
{
for(j=0;j<WIDTH;j++)
{
c=(((i & 0x8) == 0) ^((j & 0x8) == 0)) *255;
//計算紋理顏色
Image[i][j][0] = GLubyte(c);
Image[i][j][1] = GLubyte(c);
Image[i][j][2] = GLubyte(c);
Image[i][j][3] = GLubyte(255);
}
}
}
void Initialization(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);
MakeImage();
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenTextures(1, &texName);
glBindTexture(GL_TEXTURE_2D, texName);
//設置紋理參數
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_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, WIDTH, HEIGHT,
0, GL_RGBA, GL_UNSIGNED_BYTE, Image);
}
//顯示回調函數
void OnDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glBindTexture(GL_TEXTURE_2D, texName);
glBegin(GL_QUADS);
//指定紋理座標
glTexCoord2f(0.0f,0.0f);
glVertex3f(-2.0f,-2.0f,0.0f);
glTexCoord2f(0.0f,1.0f);
glVertex3f(-2.0f,2.0f,0.0f);
glTexCoord2f(1.0f,1.0f);
glVertex3f(2.0f,2.0f,0.0f);
glTexCoord2f(1.0f,0.0f);
glVertex3f(2.0f,-2.0f,0.0f);
/*//其他效果
glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0);
glTexCoord2f(0.0, 1.0); glVertex3f(-2.0, 1.0, 0.0);
glTexCoord2f(1.0, 1.0); glVertex3f(0.0, 1.0, 0.0);
glTexCoord2f(1.0, 0.0); glVertex3f(0.0, -1.0, 0.0);
glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, 0.0);
glTexCoord2f(0.0, 1.0); glVertex3f(1.0, 1.0, 0.0);
glTexCoord2f(1.0, 1.0); glVertex3f(2.41421, 1.0, -1.41421);
glTexCoord2f(1.0, 0.0); glVertex3f(2.41421, -1.0, -1.41421);
*/
glEnd();
glFlush();
glDisable(GL_TEXTURE_2D);
}
//重繪回調函數
void OnReshape(int w,int h)
{
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 30.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0, 0.0, -3.6);
}
//按Esc退出程序
void keyboard (unsigned char key, int x, int y)
{
switch (key) {
case 27:
exit(0);
break;
default:
break;
}
}
效果圖: