关于OpenGL的绘制上下文

什么是绘制上下文(Rendering Context)

初学OpenGL,打开红宝书,会告诉你OpenGL是个状态机,OpenGL采用了客户端-服务器模式,那时觉得好抽象,直到后来了解了绘制上下文才把这些联系起来。我们可以认为每一个硬件GPU是个服务器,每一个绘制上下文对应于申请的一个客户端,一个客户端维护着一套状态机,如果两个窗口分别对应两个不同的绘制上下文,则两个窗口彼此状态独立。申请绘制上下文,意味着系统资源的申请,每个绘制上下文还是需要不少资源的,记得曾经试过在chrome的TAB页不断加载WebGL页面,由于WebGL使用的是OpenGL ES,同样需要绘制上下文,当加载三十多个页面的时候,Chrome整个崩溃了。

所有的OpenGL调用,都需要指定是在哪个上下文环境下调用的。不同的上下文中,同样的资源ID,可能对应于各自上下文中不同类型的资源。

不同的操作系统,都有各自的绘制上下文创建、和设置当前绘制上下文的API。

如何创建绘制上下文

我们一般做Demo程序,都会使用GLUT,所以很多人可能并没有自己创建过绘制上下文。GLUT的函数GlutCreateWindow除了创建了一个窗口,同时还创建了一个绘制上下文,并将创建的绘制上下文设置为当前的绘制上下文。对于Windows平台,首先创建一个设备上下文(Device Context,DC),以DC为输入,可以创建一个绘制上下文。创建绘制上下文以后,调用MakeCurrent,将创建的上下文设置为当前的绘制上下文。

创建了绘制上下文,并设置为当前上下文以后,还不能使用OpenGL最新的特性,调用OpenGL 1.1以后的API仍然会崩溃。一般我们使用Glew库,调用glewInit(),得到OpenGL随显卡驱动一起发布的新特性的函数入口地址。

绘制上下文和线程

两个线程同时MakeCurrent到同一个绘制上下文,会导致程序崩溃。大型程序的一般做法是申请一条线程,专门用于绘制,创建线程时,为该绘制线程申请一个绘制上下文,一直作为当前的上下文。所有的绘制相关的操作,都在绘制线程完成。

上下文之间的资源共享

每个窗口一个上下文,优点是可以保证状态机不互相影响。但多个窗口需要使用同一份纹理,如何避免重复的资源申请呢?答案是上下文之间的图形资源可以共享,先创建上下文A,再以A为输入,创建上下文B,则B可访问在A上下文下创建的纹理资源。纹理、shader、Buffer等资源是可以共享的,但Frame Buffer Object(FBO)、Vertex Array Object(VAO)等容器对象不可共享,但可将共享的纹理和VBO绑定到各自上下文的容器对象上。

时间: 2024-10-09 13:47:33

关于OpenGL的绘制上下文的相关文章

【Qt for Android】OpenGL ES 绘制彩色立方体

Qt 内置对OpenGL ES的支持,选用Qt进行OpenGL ES的开发是非常方便的,许多辅助类都已经具备.从Qt 5.0开始增加了一个QWindow类,该类既可以使用OpenGL绘制3D图形,也可以使用QPainter绘制2D传统的GDI+图形,5.0以前的QGLWidget不推荐再使用.在即将到来(官方时间是今年秋天)Qt 5.4会完全废弃QGLWidget,作为替代将会新增QOpenGLWidget和QOpenGLWindow类来方便OpenGL的编程. 好了废话不多说了,今天我会使用O

CSharpGL(6)在OpenGL中绘制UI元素

CSharpGL(6)在OpenGL中绘制UI元素 主要内容 学习使用IUILayout接口及其机制,以实现在OpenGL中绘制UI元素. 以SimpleUIAxis为例演示如何使用IUILayout. 下载 您可以在(https://github.com/bitzhuwei/CSharpGL)找到最新的源码.欢迎感兴趣的同学fork之. 什么是OpenGL中的UI元素 您可以在源码中找到SimpleUIAxis这一示例. 如上图所示,有5个坐标轴,中间那个是一个普通的三维模型(元素),作为对照

OpenGL学习-------绘制简单的几何图形

本次课程所要讲的是绘制简单的几何图形,在实际绘制之前,让我们先熟悉一些概念. 一.点.直线和多边形我们知道数学(具体的说,是几何学)中有点.直线和多边形的概念,但这些概念在计算机中会有所不同.数学上的点,只有位置,没有大小.但在计算机中,无论计算精度如何提高,始终不能表示一个无穷小的点.另一方面,无论图形输出设备(例如,显示器)如何精确,始终不能输出一个无穷小的点.一般情况下,OpenGL中的点将被画成单个的像素(像素的概念,请自己搜索之~),虽然它可能足够小,但并不会是无穷小.同一像素上,Op

OpenGL简单绘制游戏角色阴影

在游戏开发中很多Q版游戏绘制角色阴影会简单的绘制一个半透明的椭圆,如下图: 这种方法的优点是实现简单,但表现效果明显不够真实.作为Q版风格尚可被玩家接受,而对于写实类游戏,多采用由美术提供针对性制作的图片作为阴影图层.这种方案效果最为理想,缺点是需要多制作大量的图片资源,使游戏包增加不少. 在最近的开发中,我想到了另一种角色阴影图形的绘制方法,这里把它分享给大家. 原理很简单,就是利用OpenGL的图像变形技术,通过把角色自身的图片进行调整,使之变成一个阴影图像. 先上效果图: 具体实现: Op

终于照着教程,成功使用OpenGL ES 绘制纹理贴图

在之前成功绘制变色的几何图形之后,今天利用Openg ES的可编程管线绘制出第一张纹理.学校时候不知道OpenGL的重要性,怕晦涩的语法,没有跟老师学习OpenGL的环境配置,如今只能利用cocos2dx 2.2.3 配置好的环境学习OpenGL ES.源代码来自<cocos2d-x高级开发教程>,注释是本人的. void HelloWorld::draw() { //opengl世界坐标轴的读取和绘制默认是逆时针顺序 static GLfloat vertext[] = { 0.0f,0.0

SDL2+OpenGL (2)绘制立体图形

绘制正四面体,即从四个面依次绘制三角形,其他立体图形方法类似 1 #include <GL/glew.h> 2 #include <SDL2/SDL.h> 3 #include <SDL2/SDL_opengl.h> 4 5 bool quit; 6 SDL_Window* window; 7 SDL_GLContext glContext; 8 SDL_Event sdlEvent; 9 GLfloat rtri=0; 10 bool Init() 11 { 12 S

SDL2+OpenGL (1)绘制多边形

1 #include <GL/glew.h> 2 #include <SDL2/SDL.h> 3 #include <SDL2/SDL_opengl.h> 4 5 bool quit; 6 SDL_Window* window; 7 SDL_GLContext glContext; 8 SDL_Event sdlEvent; 9 bool Init() 10 { 11 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3

OpenGL——点的绘制(使用OpenGL来绘制可旋转坐标系的螺旋线)

package com.example.opengl1; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.opengl.GLSurfaceView; im

opengl:绘制球体

数学基础 球面参数方程 球面的参数曲线可以用球坐标表示,引入参数u,v,其中v是球面点与原点的连线与z轴正向的夹角,u表示连线在xy平面的投影与x轴正向的夹角,如下图所示: 则球面参数方程可以表示为: 球面法向量 已知球面的参数方程以后,很容易求得给定点的法向量,分别对u和v方向求偏导数,然后对两个所得向量进行叉积即可: 实现细节 已知参数方程以后,需要进行离散,分别设定u和v的步长:ustep.vstep.然后通过不同的u和v,求得坐标系中点的实际坐标(x,y,z),在实现中有一点需要注意的是