一、绘图
void GLPolygon::draw()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(-1.5f, 0.0f, -6.0f);
glBegin(GL_TRIANGLES);
glVertex3f( 0.0f, 1.0f, 0.0f);
glVertex3f(-1.0f,-1.0f, 0.0f);
glVertex3f( 1.0f,-1.0f, 0.0f);
glEnd();
glTranslatef(3.0f, 0.0f, 0.0f);
glBegin(GL_QUADS);
glVertex3f(-1.0f, 1.0f, 0.0f);
glVertex3f( 1.0f, 1.0f, 0.0f);
glVertex3f( 1.0f,-1.0f, 0.0f);
glVertex3f(-1.0f,-1.0f, 0.0f);
glEnd();
}
二、着色
void GLPolygon::draw()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(-1.5f, 0.0f, -6.0f);
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 1.0f, 0.0f); glVertex3f( 0.0f, 1.0f, 0.0f);
glColor3f(1.0f, 0.0f, 1.0f); glVertex3f(-1.0f,-1.0f, 0.0f);
glColor3f(0.0f, 1.0f, 1.0f); glVertex3f( 1.0f,-1.0f, 0.0f);
glEnd();
glTranslatef(3.0f, 0.0f, 0.0f);
glBegin(GL_QUADS);
glColor3f(0.0f, 0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 0.0f);
glColor3f(1.0f, 0.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 0.0f);
glColor3f(1.0f, 1.0f, 1.0f); glVertex3f( 1.0f,-1.0f, 0.0f);
glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(-1.0f,-1.0f, 0.0f);
glEnd();
}
三、旋转
void GLPolygon::draw()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(-1.5f, 0.0f, -6.0f);
glRotatef(rTri, 0.0f, 1.0f, 0.0f);
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 1.0f, 0.0f); glVertex3f( 0.0f, 1.0f, 0.0f);
glColor3f(1.0f, 0.0f, 1.0f); glVertex3f(-1.0f,-1.0f, 0.0f);
glColor3f(0.0f, 1.0f, 1.0f); glVertex3f( 1.0f,-1.0f, 0.0f);
glEnd();
glLoadIdentity();
glTranslatef(1.5f, 0.0f, -6.0f);
glRotatef(rQuad, 1.0f, 0.0f, 0.0f);
glBegin(GL_QUADS);
glColor3f(0.0f, 0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 0.0f);
glColor3f(1.0f, 0.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 0.0f);
glColor3f(1.0f, 1.0f, 1.0f); glVertex3f( 1.0f,-1.0f, 0.0f);
glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(-1.0f,-1.0f, 0.0f);
glEnd();
rTri += 0.5f;
rQuad -= 0.3f;
}
四、立体图形
void NeHeTutorials::init()
{
glShadeModel(GL_SMOOTH); // 启用阴影平滑
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // 黑色背景
glClearDepth(1.0f); // 设置深度缓存
glEnable(GL_DEPTH_TEST); // 启用深度测试
glDepthFunc(GL_LEQUAL); // 所作深度测试的类型
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
// 真正精细的透视修正
}
void NeHeTutorials::draw()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(-1.5f, 0.0f, -6.0f);
GLfloat triA[] = { 0.0f, 1.0f, 0.0f };
GLfloat triB[] = {-0.866f,-0.5f,-0.5f };
GLfloat triC[] = { 0.866f,-0.5f,-0.5f };
GLfloat triD[] = { 0.0f,-0.5f, 1.0f };
GLfloat colorA[] = { 1.0f, 0.0f, 0.0f };
GLfloat colorB[] = { 0.0f, 1.0f, 0.0f };
GLfloat colorC[] = { 0.0f, 0.0f, 1.0f };
GLfloat colorD[] = { 1.0f, 1.0f, 1.0f };
glRotatef(rTri, 1.0f, 1.0f, 0.0f);
glBegin(GL_TRIANGLES);
glColor3fv(colorA); glVertex3fv(triA);
glColor3fv(colorB); glVertex3fv(triB);
glColor3fv(colorC); glVertex3fv(triC);
glColor3fv(colorA); glVertex3fv(triA);
glColor3fv(colorD); glVertex3fv(triD);
glColor3fv(colorB); glVertex3fv(triB);
glColor3fv(colorA); glVertex3fv(triA);
glColor3fv(colorC); glVertex3fv(triC);
glColor3fv(colorD); glVertex3fv(triD);
glColor3fv(colorB); glVertex3fv(triB);
glColor3fv(colorC); glVertex3fv(triC);
glColor3fv(colorD); glVertex3fv(triD);
glEnd();
GLfloat quadA0[] = {-1.0f, 1.0f,-1.0f };
GLfloat quadB0[] = {-1.0f,-1.0f,-1.0f };
GLfloat quadC0[] = { 1.0f,-1.0f,-1.0f };
GLfloat quadD0[] = { 1.0f, 1.0f,-1.0f };
GLfloat quadA1[] = {-1.0f, 1.0f, 1.0f };
GLfloat quadB1[] = {-1.0f,-1.0f, 1.0f };
GLfloat quadC1[] = { 1.0f,-1.0f, 1.0f };
GLfloat quadD1[] = { 1.0f, 1.0f, 1.0f };
GLfloat colorQuadB1[] = { 0.0, 0.0, 0.0 };
GLfloat colorQuadB0[] = { 1.0, 0.0, 0.0 };
GLfloat colorQuadC1[] = { 0.0, 1.0, 0.0 };
GLfloat colorQuadA1[] = { 0.0, 0.0, 1.0 };
GLfloat colorQuadA0[] = { 1.0, 0.0, 1.0 };
GLfloat colorQuadD1[] = { 0.0, 1.0, 1.0 };
GLfloat colorQuadC0[] = { 1.0, 1.0, 0.0 };
GLfloat colorQuadD0[] = { 1.0, 1.0, 1.0 };
glLoadIdentity();
glTranslatef(1.5f, 0.0f, -7.0f);
glRotatef(rQuad, 1.0f, 1.0f, 1.0f);
glBegin(GL_QUADS);
glColor3fv(colorQuadA0); glVertex3fv(quadA0);
glColor3fv(colorQuadB0); glVertex3fv(quadB0);
glColor3fv(colorQuadC0); glVertex3fv(quadC0);
glColor3fv(colorQuadD0); glVertex3fv(quadD0);
glColor3fv(colorQuadA1); glVertex3fv(quadA1);
glColor3fv(colorQuadD1); glVertex3fv(quadD1);
glColor3fv(colorQuadC1); glVertex3fv(quadC1);
glColor3fv(colorQuadB1); glVertex3fv(quadB1);
glColor3fv(colorQuadA0); glVertex3fv(quadA0);
glColor3fv(colorQuadA1); glVertex3fv(quadA1);
glColor3fv(colorQuadB1); glVertex3fv(quadB1);
glColor3fv(colorQuadB0); glVertex3fv(quadB0);
glColor3fv(colorQuadA1); glVertex3fv(quadA1);
glColor3fv(colorQuadA0); glVertex3fv(quadA0);
glColor3fv(colorQuadD0); glVertex3fv(quadD0);
glColor3fv(colorQuadD1); glVertex3fv(quadD1);
glColor3fv(colorQuadD1); glVertex3fv(quadD1);
glColor3fv(colorQuadD0); glVertex3fv(quadD0);
glColor3fv(colorQuadC0); glVertex3fv(quadC0);
glColor3fv(colorQuadC1); glVertex3fv(quadC1);
glColor3fv(colorQuadB0); glVertex3fv(quadB0);
glColor3fv(colorQuadB1); glVertex3fv(quadB1);
glColor3fv(colorQuadC1); glVertex3fv(quadC1);
glColor3fv(colorQuadC0); glVertex3fv(quadC0);
glEnd();
rTri += 0.5f;
rQuad -= 0.3f;
}
五、纹理映射
void NeHeTutorials::init()
{
glShadeModel(GL_SMOOTH); // 启用阴影平滑
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // 黑色背景
glClearDepth(1.0f); // 设置深度缓存
glEnable(GL_DEPTH_TEST); // 启用深度测试
glDepthFunc(GL_LEQUAL); // 所作深度测试的类型
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
// 真正精细的透视修正
loadTexture("data/0.bmp", texture[0]);
loadTexture("data/1.bmp", texture[1]);
loadTexture("data/2.bmp", texture[2]);
loadTexture("data/3.bmp", texture[3]);
loadTexture("data/4.bmp", texture[4]);
loadTexture("data/5.bmp", texture[5]);
glEnable(GL_TEXTURE_2D);
}
void NeHeTutorials::loadTexture( char* fileName, GLuint &text )
{
AUX_RGBImageRec *TextureImage = NULL; // 创建纹理的存储空间
memset( &TextureImage, 0, sizeof(void *) ); // 将指针设为 NULL
TextureImage = auxDIBImageLoad( fileName );
glGenTextures( 1, &text ); // 创建纹理
glBindTexture( GL_TEXTURE_2D, text ); // 使用来自位图数据生成 的典型纹理
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST );
gluBuild2DMipmaps( GL_TEXTURE_2D, 3, TextureImage->sizeX,
TextureImage->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage->data );
free( TextureImage->data ); // 释放纹理图像占用的内存
free( TextureImage ); // 释放图像结构
}
// 纹理映射
void NeHeTutorials::draw()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
GLfloat quadA0[] = {-1.0f, 1.0f,-1.0f };
GLfloat quadB0[] = {-1.0f,-1.0f,-1.0f };
GLfloat quadC0[] = { 1.0f,-1.0f,-1.0f };
GLfloat quadD0[] = { 1.0f, 1.0f,-1.0f };
GLfloat quadA1[] = {-1.0f, 1.0f, 1.0f };
GLfloat quadB1[] = {-1.0f,-1.0f, 1.0f };
GLfloat quadC1[] = { 1.0f,-1.0f, 1.0f };
GLfloat quadD1[] = { 1.0f, 1.0f, 1.0f };
glTranslatef(0.0f, 0.0f, -7.0f);
glRotatef(rQuad, 1.0f, 1.0f, 1.0f);
glBindTexture( GL_TEXTURE_2D, texture[0]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f); glVertex3fv(quadA0);
glTexCoord2f(0.0f, 0.0f); glVertex3fv(quadB0);
glTexCoord2f(1.0f, 0.0f); glVertex3fv(quadC0);
glTexCoord2f(1.0f, 1.0f); glVertex3fv(quadD0);
glEnd();
glBindTexture( GL_TEXTURE_2D, texture[1]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f); glVertex3fv(quadA1);
glTexCoord2f(1.0f, 1.0f); glVertex3fv(quadD1);
glTexCoord2f(1.0f, 0.0f); glVertex3fv(quadC1);
glTexCoord2f(0.0f, 0.0f); glVertex3fv(quadB1);
glEnd();
glBindTexture( GL_TEXTURE_2D, texture[2]);
glBegin(GL_QUADS);
glTexCoord2f(1.0f, 1.0f); glVertex3fv(quadA0);
glTexCoord2f(0.0f, 1.0f); glVertex3fv(quadA1);
glTexCoord2f(0.0f, 0.0f); glVertex3fv(quadB1);
glTexCoord2f(1.0f, 0.0f); glVertex3fv(quadB0);
glEnd();
glBindTexture( GL_TEXTURE_2D, texture[3]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f); glVertex3fv(quadA1);
glTexCoord2f(0.0f, 0.0f); glVertex3fv(quadA0);
glTexCoord2f(1.0f, 0.0f); glVertex3fv(quadD0);
glTexCoord2f(1.0f, 1.0f); glVertex3fv(quadD1);
glEnd();
glBindTexture( GL_TEXTURE_2D, texture[4]);
glBegin(GL_QUADS);
glTexCoord2f(1.0f, 1.0f); glVertex3fv(quadD1);
glTexCoord2f(0.0f, 1.0f); glVertex3fv(quadD0);
glTexCoord2f(0.0f, 0.0f); glVertex3fv(quadC0);
glTexCoord2f(1.0f, 0.0f); glVertex3fv(quadC1);
glEnd();
glBindTexture( GL_TEXTURE_2D, texture[5]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f); glVertex3fv(quadB0);
glTexCoord2f(0.0f, 0.0f); glVertex3fv(quadB1);
glTexCoord2f(1.0f, 0.0f); glVertex3fv(quadC1);
glTexCoord2f(1.0f, 1.0f); glVertex3fv(quadC0);
glEnd();
rQuad -= 0.3f;
}
六、光照和键盘控制
extern bool key_down[256];
extern bool key_press[256];
GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat LightPosition[]= { 0.0f, 0.0f, 2.0f, 1.0f };
void NeHeTutorials::init()
{
glShadeModel(GL_SMOOTH); // 启用阴影平滑
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // 黑色背景
glClearDepth(1.0f); // 设置深度缓存
glEnable(GL_DEPTH_TEST); // 启用深度测试
glDepthFunc(GL_LEQUAL); // 所作深度测试的类型
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
// 真正精细的透视修正
loadTexture("data/0.bmp", texture[0]);
loadTexture("data/1.bmp", texture[1]);
loadTexture("data/2.bmp", texture[2]);
loadTexture("data/3.bmp", texture[3]);
loadTexture("data/4.bmp", texture[4]);
loadTexture("data/5.bmp", texture[5]);
glEnable(GL_TEXTURE_2D);
glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);
glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);
glLightfv(GL_LIGHT1, GL_POSITION, LightPosition);
glEnable(GL_LIGHT1);
}
// 光照和键盘控制
void NeHeTutorials::draw()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
GLfloat quadA0[] = {-1.0f, 1.0f, 1.0f };
GLfloat quadB0[] = {-1.0f,-1.0f, 1.0f };
GLfloat quadC0[] = { 1.0f,-1.0f, 1.0f };
GLfloat quadD0[] = { 1.0f, 1.0f, 1.0f };
GLfloat quadA1[] = {-1.0f, 1.0f,-1.0f };
GLfloat quadB1[] = {-1.0f,-1.0f,-1.0f };
GLfloat quadC1[] = { 1.0f,-1.0f,-1.0f };
GLfloat quadD1[] = { 1.0f, 1.0f,-1.0f };
glTranslatef(0.0f, 0.0f, z);
glRotatef(xRot, 1.0f, 0.0f, 0.0f);
glRotatef(yRot, 0.0f, 1.0f, 0.0f);
glBindTexture( GL_TEXTURE_2D, texture[0]);
glBegin(GL_QUADS);
glNormal3f(0.0f, 0.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3fv(quadA0);
glTexCoord2f(0.0f, 0.0f); glVertex3fv(quadB0);
glTexCoord2f(1.0f, 0.0f); glVertex3fv(quadC0);
glTexCoord2f(1.0f, 1.0f); glVertex3fv(quadD0);
glEnd();
glBindTexture( GL_TEXTURE_2D, texture[1]);
glBegin(GL_QUADS);
glNormal3f(0.0f, 0.0f,-1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3fv(quadA1);
glTexCoord2f(1.0f, 1.0f); glVertex3fv(quadD1);
glTexCoord2f(1.0f, 0.0f); glVertex3fv(quadC1);
glTexCoord2f(0.0f, 0.0f); glVertex3fv(quadB1);
glEnd();
glBindTexture( GL_TEXTURE_2D, texture[2]);
glBegin(GL_QUADS);
glNormal3f(-1.0f, 0.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3fv(quadA0);
glTexCoord2f(0.0f, 1.0f); glVertex3fv(quadA1);
glTexCoord2f(0.0f, 0.0f); glVertex3fv(quadB1);
glTexCoord2f(1.0f, 0.0f); glVertex3fv(quadB0);
glEnd();
glBindTexture( GL_TEXTURE_2D, texture[3]);
glBegin(GL_QUADS);
glNormal3f(0.0f, 1.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3fv(quadA1);
glTexCoord2f(0.0f, 0.0f); glVertex3fv(quadA0);
glTexCoord2f(1.0f, 0.0f); glVertex3fv(quadD0);
glTexCoord2f(1.0f, 1.0f); glVertex3fv(quadD1);
glEnd();
glBindTexture( GL_TEXTURE_2D, texture[4]);
glBegin(GL_QUADS);
glNormal3f(1.0f, 0.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3fv(quadD1);
glTexCoord2f(0.0f, 1.0f); glVertex3fv(quadD0);
glTexCoord2f(0.0f, 0.0f); glVertex3fv(quadC0);
glTexCoord2f(1.0f, 0.0f); glVertex3fv(quadC1);
glEnd();
glBindTexture( GL_TEXTURE_2D, texture[5]);
glBegin(GL_QUADS);
glNormal3f(0.0f,-1.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3fv(quadB0);
glTexCoord2f(0.0f, 0.0f); glVertex3fv(quadB1);
glTexCoord2f(1.0f, 0.0f); glVertex3fv(quadC1);
glTexCoord2f(1.0f, 1.0f); glVertex3fv(quadC0);
glEnd();
xRot += xSpeed;
yRot += ySpeed;
}
void NeHeTutorials::keyFunc()
{
if (key_down[VK_LEFT]) ySpeed -= 0.01f;
if (key_down[VK_RIGHT]) ySpeed += 0.01f;
if (key_down[VK_UP]) xSpeed -= 0.01f;
if (key_down[VK_DOWN]) xSpeed += 0.01f;
if (key_down[VK_PRIOR]) z -= 0.02f;
if (key_down[VK_NEXT]) z += 0.02f;
if (key_down['L'] && !key_press['L'])
{
key_press['L'] = true;
light = !light;
if (light) glEnable(GL_LIGHTING);
else glDisable(GL_LIGHTING);
}
}
(启用光照前)
(下图为启用光照后)
(下图为进入盒子内部 由于光照不到 为黑的)
(下图为进入盒子内部,不启用光照效果)
七、混合
void NeHeTutorials::init()
{
glShadeModel(GL_SMOOTH); // 启用阴影平滑
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // 黑色背景
glClearDepth(1.0f); // 设置深度缓存
glEnable(GL_DEPTH_TEST); // 启用深度测试
glDepthFunc(GL_LEQUAL); // 所作深度测试的类型
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
// 真正精细的透视修正
loadTexture("data/0.bmp", texture[0]);
loadTexture("data/1.bmp", texture[1]);
loadTexture("data/2.bmp", texture[2]);
loadTexture("data/3.bmp", texture[3]);
loadTexture("data/4.bmp", texture[4]);
loadTexture("data/5.bmp", texture[5]);
glEnable(GL_TEXTURE_2D);
glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);
glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);
glLightfv(GL_LIGHT1, GL_POSITION, LightPosition);
glEnable(GL_LIGHT1);
glColor4f(1.0f, 1.0f, 1.0f, 0.5f);
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
}
void NeHeTutorials::draw()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
GLfloat quadA0[] = {-1.0f, 1.0f, 1.0f };
GLfloat quadB0[] = {-1.0f,-1.0f, 1.0f };
GLfloat quadC0[] = { 1.0f,-1.0f, 1.0f };
GLfloat quadD0[] = { 1.0f, 1.0f, 1.0f };
GLfloat quadA1[] = {-1.0f, 1.0f,-1.0f };
GLfloat quadB1[] = {-1.0f,-1.0f,-1.0f };
GLfloat quadC1[] = { 1.0f,-1.0f,-1.0f };
GLfloat quadD1[] = { 1.0f, 1.0f,-1.0f };
glTranslatef(0.0f, 0.0f, z);
glRotatef(xRot, 1.0f, 0.0f, 0.0f);
glRotatef(yRot, 0.0f, 1.0f, 0.0f);
glBindTexture( GL_TEXTURE_2D, texture[0]);
glBegin(GL_QUADS);
glNormal3f(0.0f, 0.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3fv(quadA0);
glTexCoord2f(0.0f, 0.0f); glVertex3fv(quadB0);
glTexCoord2f(1.0f, 0.0f); glVertex3fv(quadC0);
glTexCoord2f(1.0f, 1.0f); glVertex3fv(quadD0);
glEnd();
glBindTexture( GL_TEXTURE_2D, texture[1]);
glBegin(GL_QUADS);
glNormal3f(0.0f, 0.0f,-1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3fv(quadA1);
glTexCoord2f(1.0f, 1.0f); glVertex3fv(quadD1);
glTexCoord2f(1.0f, 0.0f); glVertex3fv(quadC1);
glTexCoord2f(0.0f, 0.0f); glVertex3fv(quadB1);
glEnd();
glBindTexture( GL_TEXTURE_2D, texture[2]);
glBegin(GL_QUADS);
glNormal3f(-1.0f, 0.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3fv(quadA0);
glTexCoord2f(0.0f, 1.0f); glVertex3fv(quadA1);
glTexCoord2f(0.0f, 0.0f); glVertex3fv(quadB1);
glTexCoord2f(1.0f, 0.0f); glVertex3fv(quadB0);
glEnd();
glBindTexture( GL_TEXTURE_2D, texture[3]);
glBegin(GL_QUADS);
glNormal3f(0.0f, 1.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3fv(quadA1);
glTexCoord2f(0.0f, 0.0f); glVertex3fv(quadA0);
glTexCoord2f(1.0f, 0.0f); glVertex3fv(quadD0);
glTexCoord2f(1.0f, 1.0f); glVertex3fv(quadD1);
glEnd();
glBindTexture( GL_TEXTURE_2D, texture[4]);
glBegin(GL_QUADS);
glNormal3f(1.0f, 0.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3fv(quadD1);
glTexCoord2f(0.0f, 1.0f); glVertex3fv(quadD0);
glTexCoord2f(0.0f, 0.0f); glVertex3fv(quadC0);
glTexCoord2f(1.0f, 0.0f); glVertex3fv(quadC1);
glEnd();
glBindTexture( GL_TEXTURE_2D, texture[5]);
glBegin(GL_QUADS);
glNormal3f(0.0f,-1.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3fv(quadB0);
glTexCoord2f(0.0f, 0.0f); glVertex3fv(quadB1);
glTexCoord2f(1.0f, 0.0f); glVertex3fv(quadC1);
glTexCoord2f(1.0f, 1.0f); glVertex3fv(quadC0);
glEnd();
xRot += xSpeed;
yRot += ySpeed;
}
void NeHeTutorials::keyFunc()
{
if (key_down[VK_LEFT]) ySpeed -= 0.01f;
if (key_down[VK_RIGHT]) ySpeed += 0.01f;
if (key_down[VK_UP]) xSpeed -= 0.01f;
if (key_down[VK_DOWN]) xSpeed += 0.01f;
if (key_down[VK_PRIOR]) z -= 0.02f;
if (key_down[VK_NEXT]) z += 0.02f;
if (key_down['L'] && !key_press['L'])
{
key_press['L'] = true;
light = !light;
if (light) glEnable(GL_LIGHTING);
else glDisable(GL_LIGHTING);
}
if (key_down['B'] && !key_press['B'])
{
key_press['B'] = true;
blend = !blend;
if (blend) {
glEnable(GL_BLEND); glDisable(GL_DEPTH_TEST);
}
else {
glDisable(GL_BLEND); glEnable(GL_DEPTH_TEST);
}
}
}
(下图启用混合,启用光照)
(下图启用混合,不启用光照)
八、应用
void NeHeTutorials::init()
{
loadTexture("data/hudie2.bmp", texture);
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
glClearDepth(1.0f);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
glEnable(GL_BLEND);
for (int i = 0; i < num; i++)
{
bf[i].angle = 0.0f;
bf[i].dist = ((GLfloat)i / num) * 5.0f;
bf[i].r = rand() % 256;
bf[i].g = rand() % 256;
bf[i].b = rand() % 256;
}
}
void NeHeTutorials::draw()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindTexture( GL_TEXTURE_2D, texture);
for (int i = 0; i < num; i++)
{
glLoadIdentity();
glTranslatef(0.0f, 0.0f, zoom);
glRotatef(tilt, 1.0f, 0.0f, 0.0f);
glRotatef(bf[i].angle, 0.0f, 1.0f, 0.0f);
glTranslatef(bf[i].dist, 0.0f, 0.0f);
glRotatef(-bf[i].angle, 0.0f, 1.0f, 0.0f);
glRotatef(-tilt, 1.0f, 0.0f, 0.0f);
if (twinkle)
{
glColor4ub(bf[(num-i)-1].r, bf[(num-i)-1].g, bf[(num-i)-1].b, 255);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,-1.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,-1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 0.0f);
glEnd();
}
glRotatef(spin, 0.0f, 0.0f, 1.0f);
glColor4ub(bf[i].r, bf[i].g, bf[i].b, 255);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,-1.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,-1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 0.0f);
glEnd();
spin += 0.01f;
bf[i].angle += float(i) / num;
bf[i].dist -= 0.01f;
if (bf[i].dist < 0.0f)
{
bf[i].dist += 5.0f;
bf[i].r=rand() % 256;
bf[i].g=rand() % 256;
bf[i].b=rand() % 256;
}
}
}
void NeHeTutorials::keyFunc()
{
if (key_down[VK_UP]) tilt -= 0.5f; // 屏幕向上倾斜
if (key_down[VK_DOWN]) tilt += 0.5f; // 屏幕向下倾斜
if (key_down[VK_PRIOR]) zoom -= 0.2f; // 缩小
if (key_down[VK_NEXT]) zoom += 0.2f; // 放大
if (key_down['T'] && !key_press['T']){
key_press['T'] = true;
twinkle = !twinkle;
}
}