OpenGL平台上的Teapot绘制与渲染(代码详细注释)

#include <stdlib.h>
#include <GL/glut.h>//就是GL目录下的glut.h头文件。这个是使用OPENGL时用的

void init(void)
{


    glEnable(GL_DEPTH_TEST);//用来开启更新深度缓冲区的功能,也就是,如果通过比较后深度值发生变化了,会进行更新深度缓冲区的操作。启动它,OpenGL就可以跟踪再Z轴上的像素,这样,它只会再那个像素前方没有东西时,才会绘画这个像素。

//glEnable函数,是用于启用指定的功能,在做绘画3D时,这个功能最好启动,视觉效果比较真实。

    //GLfloat: 四字节精度IEEE 754-1985 浮点数
    GLfloat position[] = { 1.0, 1.0, 1.0, 0.0 };
    glLightfv(GL_LIGHT0, GL_POSITION, position);
    glEnable(GL_LIGHTING); 开启光照计算


    glEnable(GL_LIGHT0);//可以开启第 0 号光源

    GLfloat ambient[] = { 0.0, 0.0, 0.0, 1.0 };//环境光


    GLfloat diffuse[] = { 0.25, 0.95, 0.5, 1.0 };//漫射光


    GLfloat specular[] = { 1.0, 1.0, 1.0, 1.0 };//镜面反射光

    //GL_FRONT,指出材质属性将应用于物体的前面
    glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);//指定用于光照计算的当前材质属性
    //GL_AMBIENT材质的环境颜色

    glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);
    //GL_DIFFUSE材质的散射颜色

    glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
    //GL_SPECULAR材质的镜面反射颜色

    glMaterialf(GL_FRONT, GL_SHININESS, 50.0);
    //GL_SHININESS镜面反射指数
}

void display(void)//实现窗口的重绘
{
    //其实就是清空当前的所有颜色
    glClearColor(0.75f, 0.75f, 0.75f, 1.0f);//使用红,绿,蓝以及AFA值来清除颜色缓冲区的,并且都被归一化在(0,1)之间的值

    //用当前缓冲区清除值


    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    //GL_COLOR_BUFFER_BIT:    当前可写的颜色缓冲
    // GL_DEPTH_BUFFER_BIT:    深度缓冲

    //用于创建和替换一个显示列表函数原型
    glNewList(1, GL_COMPILE);
    //指定显示列表的名称为1,GL_COMPILE 列表中命令只是是编译。

    //是绘图函数,void glutSolidTeapot(GLdouble size); 绘制实心茶壶
    glutSolidTeapot(0.5);

    //glNewList 和 glEndList 函数创建或替换显示列表
    glEndList();
    //遇到 glEndList 函数时,通过将列表与 glNewList 命令 () 中指定的唯一名称列表相关联来完成显示列表定义。
    //如果已存在名称 列表 的显示列表,则仅当调用 glEndList 时,才会替换该列表。


    glCallList(1);//函数执行显示列表,列表名为1。

    glFlush();//用于强制刷新缓冲区,保证绘图命令将被执行,而不是存储在缓冲区中等待其他的OpenGL命令。


}

void reshape(GLsizei w, GLsizei h)//负责在每次窗口移动或改变大小时重新定义视点与投影变换的方式
{
    //glViewport在默认情况下,视口被设置为占据打开窗口的整个像素矩形,窗口大小和设置视口大小相同,所以为了选择一个更小的绘图区域,就可以用glViewport函数来实现这一变换.
    //在窗口中定义一个像素矩形,最终将图像映射到这个矩形中
    glViewport(0, 0, w, h);

    //GL_PROJECTION,对投影矩阵应用随后的矩阵操作.
    glMatrixMode(GL_PROJECTION);//功能是指定哪一个矩阵是当前矩阵。创建一个投影矩阵并且与当前矩阵相乘,得到的矩阵设定为当前变换.
    //但要先通过glMatrixMode设定成投影矩阵才会得到想要的投影矩阵变换。

    //OpenGL为我们提供了一个非常简单的恢复初始坐标系的手段,那就是调用glLoadIdentity()命令。该命令是一个无参的无值函数,其功能是用一个4×4的单位矩阵来替换当前矩阵,实际上就是对当前矩阵进行初始化。
    glLoadIdentity();//也就是说,无论以前进行了多少次矩阵变换,在该命令执行后
    //,当前矩阵均恢复成一个单位矩阵,即相当于没有进行任何矩阵变换状态。

    //glOrtho就是一个正射投影函数。它创建一个平行视景体。
    glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
    //实际上这个函数的操作是创建一个正射投影矩阵,并且用这个矩阵乘以当前矩阵

    glMatrixMode(GL_MODELVIEW);//GL_MODELVIEW,对模型视景矩阵堆栈应用随后的矩阵操作


}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);//对GLUT库进行初始化


    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);//设定窗口显示模式
    glutInitWindowPosition(0, 0);//设定窗口初始位置


    glutInitWindowSize(500, 500);//设定窗口初始大小:位于屏幕左上角,长宽各为500


    glutCreateWindow(argv[0]);//创建这个窗口


    init();
    glutReshapeFunc(reshape);//改变窗口大小时保持图形比例


    glutDisplayFunc(display);//用于注册一个绘图函数


    glutMainLoop();//启动GLUT的主事件循环
    return 0;
}


 

运行结果:

 

 

  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值