您的位置:首页 > 运维架构

OpenGL绘制简单图形

2012-11-17 16:49 375 查看
一、绘图

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;

}

}









内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: