PyOpengl学习(二):基础知识之main()函数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/BigBoySunshine/article/details/80308284

        没搭建环境的童鞋请参看:https://blog.csdn.net/bigboysunshine/article/details/80218245

        我们先给出一个经典demo吧-茶壶

        

        

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *


def drawFunc():
    glClear(GL_COLOR_BUFFER_BIT)
    glRotatef(1, 0, 1, 0)
    glColor3f(1.0, 1.0, 0.0)
    glutWireTeapot(0.5)
    glFlush()

if __name__ == '__main__':
    glutInit()
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA)
    glutInitWindowSize(400, 400)
    # 参数为b类型而不是string。我查资料时,很多网上代码未指出导致报错。
    glutCreateWindow(b"First")
    glutDisplayFunc(drawFunc)
    # glutIdleFunc(drawFunc)
    glutMainLoop()        


一, main()方法

        为了了解示例程序从一开始是如何运行的,首先了解一下main() 函数当中都发生了什么。

        1, 第一个函数glutInit() 负责初始化GLUT 库。它会处理向程序输入的命令行参数,并且移除其中与控制GLUT 如何操作相关的部分(例如设置窗口的大小)。glutInit() 必须是应用程序调用的第一个GLUT 函数,它会负责设置其他GLUT 例程所必需的数据结构。

        2, glutInitDisplayMode() 设置了程序所使用的窗口的类型。在这个例子中只需要设置窗口使用RGBA 颜色空间(这会在第4 章深入进行讨论)。除此之外,还可以给窗口设置更多的OpenGL 特性,例如使用深度缓存或者动画效果。

        3, glutInitWindowSize() 设置所需的窗口大小。如果不想在这里设置一个固定值,也可以先查询显示设备的尺寸,然后根据计算机的屏幕动态设置窗口的大小。

        4, 后面的两个调用glutInitContextVersion() 和glutInitContextProfile() 设置了我们所需的OpenGL 环境(context)的类型—这是OpenGL 内部用于记录状态设置和操作的数据结构。这个例子中使用OpenGL 4.3 版本的核心模式(core profile)来创建环境。这个模式可以确保使用的只是OpenGL 的最新特性,否则也可以选择另外一种兼容模式,这样自OpenGL 1.0 版本以来的所有特性都可以在程序中使用。

     5, 随后的一个调用是glutCreateWindow(),它的功能和它的名字一致。如果当前的系统环境可以满足glutInitDisplayMode() 的显示模式要求,这里就会创建一个窗口(此时会调用计算机窗口系统的接口)。只有GLUT 创建了一个窗口之后(其中也包含创建OpenGL 环境的过程),我们才可以使用OpenGL 相关的函数。

        6, 下一个例程是glutDisplayFunc(),它设置了显示回调(display callback),即GLUT 在每次更新窗口内容的时候会自动调用的例程。这里给GLUT 库传入display() 这个函数的地址,后文会讨论其中的内容。GLUT 可以使用一系列回调函数来处理诸如用户输入、重设窗口尺寸等不同的操作。

        7, main()函数中调用的最后一个函数是glutMainLoop(),这是一个无限执行的循环,它负责一直处理窗口和操作系统的用户输入等操作.举例来说,glutMainLoop()会判断窗口是否需要进行重绘,然后他就会自动调用glutDisplayFunc()中的注册函数. 特别要注意的是,glutMainLoop()是一个无限循环,因此不会执行在它后面的所有命令. 

二, drawFunc()方法

        该方法就是绘制茶壶的逻辑,具体的绘制过程,我们后面再讲.

猜你喜欢

转载自blog.csdn.net/BigBoySunshine/article/details/80308284