程序员爱装B

写装A程序 做装C的事情

[搬家文] 第六课 小结-part_2


//Left face
...

//Right face
glNormal3f(1.0, 0.0f, 0.0f);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(BOX_SIZE / 2, -BOX_SIZE / 2, -BOX_SIZE / 2);
glVertex3f(BOX_SIZE / 2, BOX_SIZE / 2, -BOX_SIZE / 2);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(BOX_SIZE / 2, BOX_SIZE / 2, BOX_SIZE / 2);
glVertex3f(BOX_SIZE / 2, -BOX_SIZE / 2, BOX_SIZE / 2);

    绘制左边和右边面。对于每个面,我们先指定法向量。然后将当前颜色指定为渐变色的第一种颜色,通过调用glVertex3f两次将前两个顶点设为这种颜色。然后换一种颜色并将此时的颜色作为第二种颜色,并将其他两个顶点设为这种颜色。

glEnd();

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, _textureId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glColor3f(1.0f, 1.0f, 1.0f);

     现在我们想运用我们的纹理。因为有些纹理函数不能在一个glBegin-glEnd块中调用,因此先调用glEnd停止绘画四边形。调用 glEnable(GL_TEXTURE_2D)让OpenGL在以后的多边形中运用纹理。调用 glBindTexture(GL_TEXTURE_2D,_textureId)告诉OpenGL我们想将纹理绑定序号为_textureId。调用 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR)和 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAX_FILTER,GL_LINEAR)让OpenGL使用模 糊的而不是陡峭的纹理映射。然后调用glColor3f(1.0f,1.0f,1.0f)这样OpenGL不用担心改变我们纹理的颜色。

glBegin(GL_QUADS);

//Front face
glNormal3f(0.0, 0.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-BOX_SIZE / 2, -BOX_SIZE / 2, BOX_SIZE / 2);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(BOX_SIZE / 2, -BOX_SIZE / 2, BOX_SIZE / 2);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(BOX_SIZE / 2, BOX_SIZE / 2, BOX_SIZE / 2);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-BOX_SIZE / 2, BOX_SIZE / 2, BOX_SIZE / 2);

//Back face
glNormal3f(0.0, 0.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-BOX_SIZE / 2, -BOX_SIZE / 2, -BOX_SIZE / 2);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-BOX_SIZE / 2, BOX_SIZE / 2, -BOX_SIZE / 2);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(BOX_SIZE / 2, BOX_SIZE / 2, -BOX_SIZE / 2);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(BOX_SIZE / 2, -BOX_SIZE / 2, -BOX_SIZE / 2);

glEnd();

    我们绘制最后两个面。每个面,我们先指定法向量,然后指定每个顶点的纹理坐标或者真是的坐标。

glDisable(GL_TEXTURE_2D);

    现在我们已经绘制完毕纹理了,因此禁用纹理。这样下次我们绘画什么东西的时候,OpenGL不会自动应用我们纹理。

glutSwapBuffers();
}

    将场景送至窗口。

//Called every 25 milliseconds
void update(int value) {
_angle += 1.0f;
if
(_angle > 360) {
_angle -= 360;
}

    这是更新函数,GLUT每25毫秒调用一次。首先将角度增加1度,为了使_angle值小,当大于360度时就减去360。

glutPostRedisplay();

    告诉GLUT我们的场景有改变,需要重绘。

glutTimerFunc(25, update, 0);
}

    告诉GLUT每25毫秒调用更新函数。

int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(400, 400);

    初始化GLUT

glutCreateWindow("Putting it All Together - videotutorialsrock.com");

    告诉GLUT创建窗口。

initRendering();

    调用initRendering初始化一些OpenGL的绘制设置。

glutDisplayFunc(drawScene);
glutKeyboardFunc(handleKeypress);
glutReshapeFunc(handleResize);

    告诉GLUT使用什么函数绘制我们的场景,处理键盘事件,窗口大小变化事件。

glutTimerFunc(25, update, 0);

    告诉GLUT没25毫秒调用update函数。

glutMainLoop();
return
0;
}

    告诉GLUT开始处理所有事情。

练习:

  • 除了将立方体旋转,将光源围绕立方体旋转,使这两个物体旋转速度不同。
  • 紧挨大的立方体再显示两个小的,每个和原来的立方体有相同的外表。让它们围绕大的连续旋转,但是以不同的速度和角度。
  • 将立方体改为你最喜欢的3D实体。至少让一个面进行纹理旋绕,一个面上色。如果你需要可以关闭光源,这样你就不用担心得到正确的法向量。

posted on 2010-07-19 20:27 camel 阅读(134) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

统计

常用链接

留言簿

随笔档案

文章档案

搜索

最新评论

阅读排行榜

评论排行榜