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)

 

下一篇说明本文相关的坐标系。

posted on 2023-01-09 19:45  EpicBlue  阅读(69)  评论(0编辑  收藏  举报