安装
python -m pip install PyOpenGL PyOpenGL_accelerate -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com
文档资料
参考书有《OpenGL Programming Guide》,俗称“红宝书”。
离屏渲染
刚开始看OpenGL的时候,找到的资料和代码,都是调用glut或者glfw库,创建一个窗口,然后循环绘制和显示图片。但是有时候使用linux远程服务器,没有直接连一个显示屏,也没有窗口系统,这个时候有个方法是使用X11窗口系统,在远程服务器上启动X Client服务,在本地客户端电脑上启动X Server服务,实现远程桌面窗口系统,但是这样也很麻烦,我搞了半天也不行。
帧缓存
查阅资料后,发现其实也很简单,即借助帧缓存对象framebuffer,实现离屏渲染。帧缓存对象对于离屏渲染技术、纹理贴图的更新,以及缓存乒乓技术的实现非常有意义。
桌面窗口系统提供的帧缓存是唯一可以被图形服务器的显示系统所识别的帧缓存,即我们在屏幕上所看到的就是这个帧缓存。除此之外,应用程序也能创建一个帧缓存对象,这种帧缓存无法直接在显示屏上看到,但是能够用于离屏渲染技术。窗口系统自动创建的帧缓存有自己的缓存对象如颜色、深度和模板,但是自己在程序中创建的帧缓存是没有这些的,所以还需要自己创建颜色缓存、深度缓存或者模板缓存,以及创建额外的渲染缓存。
# 创建1个帧缓存
framebuffer = glGenFramebuffers(1)
# 绑定帧缓存
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer)
# 删除1个帧缓存
glDeleteFramebuffers(1, [framebuffer])
纹理附件
完整的帧缓存需要两个东西:1.纹理附件,2.渲染缓存。纹理附件有几种类型
GL_COLOR_ATTACHMENT
GL_DEPTH_ATTACHMENT
GL_STENCIL_ATTACHMENT
GL_DEPTH_STENCIL_ATTACHMENT
# 创建纹理附件
texture = glGenTexture(1)
# 绑定纹理
glBindTexture(GL_TEXTURE_2D, texture)
# 创建二维纹理图片
#glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL)
glTextureStorage2D(texture, 1, GL_RGBA8, width, height)
# 将纹理附件关联到帧缓存
glNamedFramebufferTexture2D(framebuffer, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0)
# 抛弃帧缓存附件的所有内容
#glInvalidateFramebuffer()
渲染缓存
渲染缓存是OpenGL所管理的溢出高效的内存区域,可以存储格式化的图像数据,渲染缓存中的数据只有关联到一个帧缓存对象之后才有意义,之后创建渲染缓存的存储空间,用来存储用于深度测试和模板测试的数据。
# 创建渲染缓存
rbo = glGenRenderbuffers(1)
# 绑定渲染缓存
glBindRenderbuffer(GL_RENDERBUFFER, rbo)
# 创建渲染缓存存储空间
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height)
# 将渲染缓存关联到帧缓存
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo)
# 删除渲染缓存
glDeleteRenderbuffers(1, rbo)