惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
博客园 - Franky
GbyAI
GbyAI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
爱范儿
爱范儿
IT之家
IT之家
酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
博客园_首页
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recent Announcements
Recent Announcements
Scott Helme
Scott Helme
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
C
CERT Recently Published Vulnerability Notes
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
L
LangChain Blog
L
LINUX DO - 最新话题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
H
Hacker News: Front Page
MyScale Blog
MyScale Blog
P
Palo Alto Networks Blog
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
AI
AI
T
Troy Hunt's Blog
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Vercel News
Vercel News
Microsoft Security Blog
Microsoft Security Blog
罗磊的独立博客
S
Secure Thoughts
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
S
Security @ Cisco Blogs
Cloudbric
Cloudbric
E
Exploit-DB.com RSS Feed
Attack and Defense Labs
Attack and Defense Labs

博客园 - EpicBlue

图元:四棱锥\立方体\扇形\带孔圆盘\圆柱体\球体 - EpicBlue - 博客园 绘制图元:线段、三角形、四边形 PaddleDetection的CPU训练 数独计算(C#) android TCP 客户端(仅接收数据) 管理自己的电子书(2) 管理自己的电子书 排列组合的递归实现 状态机参考 状态机 附 (一)nDoc相关资源 nDoc分析 (二) BaseDocumenter nDoc分析 (一) 可怜的nDoc 求助, Acess + winform无法Update的问题 查询面板(三) 查询面板(二) 查询面板(一) 接触ADO.Net 数据库查询 一个不成熟的程序员
PyOpenGL 初始化框架
EpicBlue · 2023-01-09 · via 博客园 - EpicBlue

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)

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