OpenGL | 搭建OpenGL渲染环境(创建RC)

目录

一、GDI作图和OpenGL作图

1.GDI

2.OpenGL

3.比较

二、搭建OpenGL渲染环境(创建RC)

1.步骤(创建RC的步骤)

2.代码

三、相关知识

1.链接库

2.常用头文件

四、参考文献


        具有Windows编程经验的人都知道,在Windows下用GDI作图必须通过设备上下文(DeviceContext,简写DC)调用相应的函数。用OpenGL作图也是类似,OpenGL函数是通过"渲染上下文"(RenderingContext,简写RC)完成三维图形的绘制。Windows下的窗口和设备上下文支持"位图格式"(PIXELFORMAT)属性,和RC有着位图结构上的一致。只要在创建RC时与一个DC建立联系(RC也只能通过已经建立了位图格式的DC来创建),OpenGL的函数就可以通过RC对应的DC画到相应的显示设备上。

        GDI,即图形设备接口(Graphic Device Interface),是Microsoft Windows操作系统中的一个核心组件,负责在屏幕上绘制图形对象以及处理图像输出。

        GDI(图形设备接口)的结构主要由以下几个关键部分组成:

  • GDI对象:GDI定义了一系列的对象,这些对象代表了图形绘制中使用的各种元素。
  • 设备上下文(DC):设备上下文是一个包含了图形输出相关参数和状态的结构。它是连接应用程序和实际绘图设备之间的桥梁。设备上下文可以指向不同类型的设备,如显示器、打印机等。
  • 坐标系统:GDI使用两种坐标系统——逻辑坐标和设备坐标。逻辑坐标用于应用程序编程,而设备坐标与实际设备的物理特性相对应。通过映射模式,可以将逻辑坐标转换为设备坐标。
  • 函数和接口:GDI提供了一组广泛的函数和接口,用于执行图形和文本的输出。这些函数允许应用程序创建和操作GDI对象,并通过设备上下文将结果输出到具体的设备。

        在Windows的图形设备接口(GDI)中,有多种不同的对象,这些对象被用来执行各种绘图操作。以下是一些主要的GDI对象类型:

  • 画笔(Pen):用于绘制线条和图形轮廓的GDI对象。
  • 画刷(Brush):用于填充图形形状内部的GDI对象。
  • 位图(Bitmap):代表图像数据的GDI对象,可以用于在设备上下文中进行复杂的图形操作。
  • 区域(Region):表示一块可以被填充的屏幕区域的GDI对象,区域可以是矩形、多边形或椭圆形等。
  • 字体(Font):用于绘制文本的GDI对象,它定义了文本的样式、大小和其他特性。
  • 路径(Path):代表一系列连接的线和曲线的GDI对象,可以用来绘制复杂的形状。
  • 调色板(Palette):代表一组颜色的GDI对象,用于在索引颜色模式下管理和映射颜色。
  • 元文件(Metafile):一种记录和回放GDI函数调用的对象,用于图形的存储和传输。
  • 设备上下文(Device Context, DC):不是一个可绘制的对象,但它是一个非常重要的GDI对象,因为它包含了用于绘图的所有状态信息,并且连接了其他GDI对象和实际的绘图设备。

        每个GDI对象都有与之关联的一组函数,这些函数用于创建、修改和删除对象。当你使用GDI对象时,需要负责管理对象的生命周期,包括正确地创建和销毁对象,以避免资源泄露。在GDI编程中,资源管理是非常重要的,因为GDI对象数量可能受到限制,而且不正确的管理可能导致性能下降或程序失败。

        GDI函数是操作GDI对象或直接在设备上下文(Device Context,DC)上进行绘图操作的函数。例如,RectangleLineToTextOut 等。这些函数调用GDI对象的属性,并在屏幕或其他绘图表面上执行实际的绘图操作。

在使用GDI进行绘图时,通常的步骤如下:

  • 获取设备上下文句柄。
  • 选择GDI对象到设备上下文(如画笔、字体等)。
  • 使用GDI函数进行绘制。
  • 恢复设备上下文的原始对象(如果你更改了它们)。
  • 释放设备上下文句柄。

一、GDI作图和OpenGL作图

        GDI(图形设备接口)和OpenGL(开放图形库)都是用于图形编程的技术,但它们的设计目标和应用场景有所不同。

1.GDI

        GDI是Windows操作系统的一部分,主要用于二维图形的输出,如绘制文本、线条、形状和位图等。GDI非常适合用于传统的桌面应用程序,它允许开发者在屏幕上绘制图形元素,并与Windows的窗口系统紧密集成。使用GDI进行图形操作时,主要涉及以下步骤:

  • 获取设备上下文(Device Context, DC)。
  • 使用GDI提供的函数来绘制图形对象(如线条、矩形、文字等)。
  • 释放设备上下文。

        GDI更多地侧重于精确控制像素和直接与Windows GUI组件交互,但它在性能上不适合处理复杂的图形任务,特别是对于实时3D图形渲染。

2.OpenGL

        OpenGL是一个跨平台的图形API,它专注于三维图形的渲染,虽然也可以用来绘制二维图形。OpenGL提供了一套更底层的图形绘制功能,允许直接与图形硬件交互,从而实现更高的性能和更复杂的图形效果。使用OpenGL进行图形操作时,主要涉及以下步骤:

  • 初始化OpenGL环境和视口(Viewport)设置。
  • 使用OpenGL的渲染管线来定义图形的几何形状、纹理、光照和其他视觉效果。
  • 通过调用OpenGL函数执行图形渲染命令,将结果输出到屏幕或渲染缓冲区。

        OpenGL广泛用于游戏开发、计算机仿真、专业图形设计和科学可视化等领域,它支持硬件加速,能够处理大量的图形数据和复杂的渲染技术。

3.比较

  • 性能:OpenGL通常比GDI提供更高的性能,特别是在3D图形渲染和大量数据处理方面,因为它可以直接利用图形硬件加速。
  • 功能:OpenGL提供了更先进的图形功能,包括复杂的三维场景、纹理映射、光照效果等,而GDI更多用于基本的二维图形和简单的图像处理。
  • 跨平台:OpenGL是跨平台的,可以在多种操作系统上运行,包括Windows、macOS、Linux等,而GDI主要是Windows平台特有的。
  • 易用性:GDI由于与Windows紧密集成,对于简单的二维图形和桌面应用程序开发来说可能更易于使用。OpenGL则需要更多的图形编程知识。

        无论是使用GDI还是OpenGL,设备上下文都是必需的,因为它是操作系统与图形硬件之间通信的桥梁。不同之处在于,GDI直接使用设备上下文进行绘制,而OpenGL使用设备上下文来创建和管理渲染上下文,然后在渲染上下文中执行图形绘制操作。

        总之,对于需要高性能3D图形渲染的应用,OpenGL是更好的选择;而对于简单的二维图形和与Windows用户界面集成的应用,GDI可能更合适。

二、搭建OpenGL渲染环境(创建RC)

1.步骤(创建RC的步骤)

  • 获取一个DC
  • 选定并设置DC的像素格式
  • 创建渲染环境(创建RC)
  • 使渲染环境生效(设置RC)

2.代码


    //选定像素格式
    HDC dc = GetDC(hwnd);      //获取当前窗口的设备目录
    PIXELFORMATDESCRIPTOR pfd; //PIXELFORMATDESCRIPTOR 结构描述绘图图面的像素格式。
    memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
    pfd.nVersion = 1;          //指定此数据结构的版本。 此值应设置为 1。
    pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); //指定此数据结构的大小。
    pfd.cColorBits = 32;       //指定每个颜色缓冲区中的颜色位平面数。
    pfd.cDepthBits = 24;       //指定深度 (z 轴) 缓冲区的深度。
    pfd.cStencilBits = 8;      //指定模具缓冲区的深度。
    pfd.iPixelType = PFD_TYPE_RGBA; //指定像素数据的类型。
    pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;     //用于指定像素缓冲区的属性:缓冲区可以绘制到窗口或设备图面,支持 OpenGL 绘图,缓冲区是双缓冲的
    int pixelFormat = ChoosePixelFormat(dc, &pfd);
    //设置像素格式
    SetPixelFormat(dc, pixelFormat, &pfd);
    //创建渲染环境
    HGLRC rc = wglCreateContext(dc);
    //使渲染环境生效
    wglMakeCurrent(dc, rc);

三、相关知识

1.链接库

#pragma comment(lib, "opengl32.lib")

表示链接opengl32.lib这个库。和在工程设置里写上链入opengl32.lib的效果一样(两种方式等价,或说一个隐式一个显式调用)。 链接器首先在当前工作目录中搜索,然后在 LIB 环境变量指定的路径中搜索。

2.常用头文件

  • <GL/gl.h>:OpenGL所使用的函数和常量声明。

  • <GL/glu.h>:GLU(OpenGL实用库)所使用的函数和常量声明。GLU库属于OpenGL标准的一部分。

  • <GL/glext.h>:扩展头文件。因为微软公司对OpenGL的支持不太积极,VC系列编译器虽然有<GL /gl.h>这个头文件,但是里面只有OpenGL 1.1版本中所规定的内容,而没有OpenGL 1.2及其以后版本。对当前的计算机配置而言,几乎都支持OpenGL 1.4版本,更高的则到1.5, 2.0, 2.1,而VC无法直接使用这些功能。为了解决这一问题,就有了<GL/glext.h>头文件。这个头文件提供了高版本OpenGL所需要 的各种常数声明以及函数指针声明。

四、参考文献

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烫青菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值