OpenGL繪製簡單圖形

一、繪圖

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;
}
}




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