PyOpenGL 初始化框架
技术
PyOpenGL
来源
NeHe的OpenGL教程第一篇,python代码版本。
本篇初始化框架用于验证核心的绘制代码,从而抽取出来重复使用的代码。
安装
PyOpengGL在pip里面一般安装的是x86位版本,需要在以下网站下载x64版本:
https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyopengl
代码结构
本例代码由初始化框架和核心绘制函数(drawObject)构成。
初始化框架包括窗口创建(CreateWindow函数)和OpengGL初始化(InitGL函数)。
核心绘制函数被调用前后,执行了glClear和glLoadIdentity和glutSwapBuffers,因此核心绘制代码值需要执行绘制代码即可。
核心绘制函数(drawObject)绘制了一个三角形图元。用于实验glTranslatef的修改。
没有使用类做封装。
代码要点
1 代码中使用了双缓存,绘制后必须调用glutSwapBuffers,虽然封装在初始化框架中无需手动调用,但还是必须记得。
2 如果是正方形的图形,修改成glutInitWindowSize(480, 480),更好看。
绘制核心函数(py)
def drawObject(): # 移动位置 glTranslatef(0.0, 0.0, -2.0) # 绘制三角形 glBegin(GL_POLYGON) glVertex3f(0.0, 1.0, 0.0) glVertex3f(1.0, -1.0, 0.0) glVertex3f(-1.0, -1.0, 0.0) glEnd()
执行代码(py)
run(drawObject)
如果执行下面完整代码,能看到有一个白色的三角形的窗口出现,就运行成功了。
完整代码(py)
from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * # 创建窗口 def CreateWindow(): global window # pass arguments to init glutInit(sys.argv) # Select type of Display mode: # Double buffer,# 注意这里开了双缓存:绘制后必须调用glutSwapBuffers(),才能看到绘制结果 # RGBA color # Alpha components supported # Depth buffer glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH) # get a 640 x 480 window glutInitWindowSize(640, 480) # the window starts at the upper left corner of the screen glutInitWindowPosition(0, 0) # Okay, like the C version we retain the window id to use when closing, but for those of you new # to Python (like myself), remember this assignment would make the variable local and not global # if it weren't for the global declaration at the start of main. window = glutCreateWindow("Realistic Reflection by RISC") # 初始化OpenGL参数 def InitGL(Width, Height): # We call this right after our OpenGL window is created. # 设置背景色,很好看的蓝色 glClearColor(0.2, 0.5, 1.0, 1.0) glClearDepth(1.0) # Enables Clearing Of The Depth Buffer glClearStencil(0) glDepthFunc(GL_LEQUAL) # The Type Of Depth Test To Do glEnable(GL_DEPTH_TEST) # Enables Depth Testing glShadeModel(GL_SMOOTH) # Enables Smooth Color Shading glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST) glEnable(GL_TEXTURE_2D) glMatrixMode(GL_PROJECTION) # Reset The Projection Matrix glLoadIdentity() # Calculate The Aspect Ratio Of The Window gluPerspective(45.0, float(Width)/float(Height), 0.1, 100.0) glMatrixMode(GL_MODELVIEW) glLoadIdentity() # 封装func函数,在执行func函数前后清理缓存和缓存切换 def wrapedDrawObject(func): # 清理深度和颜色缓存 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT) # 重置视角 glLoadIdentity() # 执行绘制函数 func() # 切换缓存 glutSwapBuffers() # 以指定func函数为核心渲染函数 def run(func): CreateWindow() # 封装绘制函数(偏函数) from functools import partial drawObject = partial(wrapedDrawObject, func) # 窗口显示时候,就绘制图 glutDisplayFunc(drawObject) # 程序空闲时候,就绘制图(一直空闲就一直不停的画) glutIdleFunc(drawObject) # 初始化OpenGL InitGL(640, 480) # 开始事件处理循环 glutMainLoop() # 调用示例 # 绘制函数示例(无需切换缓存,重置视角) def drawObject(): # 移动位置 glTranslatef(0.0, 0.0, -2.0) # 绘制三角形 glBegin(GL_POLYGON) glVertex3f(0.0, 1.0, 0.0) glVertex3f(1.0, -1.0, 0.0) glVertex3f(-1.0, -1.0, 0.0) glEnd() # 执行绘制函数 run(drawObject)
下一篇说明本文相关的坐标系。