天天看点

【OpenGL】纹理贴图实例-棋盘

简单的纹理贴图实例,来学习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;
	}
}
           

效果图:

【OpenGL】纹理贴图实例-棋盘

继续阅读