【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;
	}
}
效果圖:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章