// 范例P257.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <gl/glut.h>
#define checkImageWidth 64
#define checkImageHeight 64
#define subImageWidth 16
#define subImageHeight 16
static GLubyte subImage[subImageWidth][subImageHeight][4];
static GLubyte checkImage[checkImageWidth][checkImageHeight][4];
static GLuint texName;
static GLuint CoordX,CoordY;
void makeCheckImage(void)
{
int i,j,k,c;
for(i=0;i<checkImageWidth;i++)
for(j=0;j<checkImageHeight;j++)
{
c=(((i&0x8)==0)^((j&0x8)==0))*255;
for(k=0;k<3;k++)
checkImage[i][j][k]=(GLubyte)c;
checkImage[i][j][3]=(GLubyte)255;
}
for(i=0;i<subImageWidth;i++)
for(j=0;j<subImageHeight;j++)
{
c=(((i&0x4)==0)^((j&0x4)==0))*255;
//for(k=0;k<3;k++)
subImage[i][j][0]=(GLubyte)c;
subImage[i][j][1]=(GLubyte)0;
subImage[i][j][2]=(GLubyte)0;
subImage[i][j][3]=255;
}
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glColor3f(1.0,1.0,1.0); //设置画笔白色
glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
glBindTexture(GL_TEXTURE_2D,texName);
glBegin(GL_QUADS);
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);
glFlush(); //立即显示出来
}
void init()
{
glClearColor(0.0,0.0,0.0,0.0); //用黑色清除背景
glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);
makeCheckImage();
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,checkImageWidth,checkImageHeight,0,GL_RGBA,
GL_UNSIGNED_BYTE,checkImage);
}
void reshape(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);
}
// s向后,w向前,a向左,d向右
void keyboard(unsigned char key,int x,int y)
{
switch(key){
case 'w':
case 'W':
CoordY+=4;
break;
case 's':
case 'S':
CoordY-=4;
break;
case 'A':
case 'a':
CoordX-=4;
break;
case 'd':
case 'D':
CoordX+=4;
break;
case 'r':
case 'R':
glBindTexture(GL_TEXTURE_2D,texName);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,checkImageWidth,checkImageHeight,0,GL_RGBA,
GL_UNSIGNED_BYTE,checkImage);
glutPostRedisplay();
return;
}
glBindTexture(GL_TEXTURE_2D,texName);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,checkImageWidth,checkImageHeight,0,GL_RGBA,
GL_UNSIGNED_BYTE,checkImage);
glBindTexture(GL_TEXTURE_2D,texName);
glTexSubImage2D(GL_TEXTURE_2D,0,CoordX,CoordY,subImageWidth,subImageHeight,GL_RGBA,
GL_UNSIGNED_BYTE,subImage);
glutPostRedisplay();
}
int main(int argc,char ** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(250,250); //初始化窗口大小
glutInitWindowPosition(0,0); //初始化窗口位置
glutCreateWindow("hello"); //创建标题为“hello”的窗口
init(); //调用初始化函数
glutDisplayFunc(display); //注册回调函数
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutMainLoop(); //进入主循环处理事件
return 0;
}
评论