2024年GUI图形界面编程基础知识_gui、vc,Golang面试流程

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

文章目录

一、GDI概述

GDI在全称是Graphics Device Interface,即图形设备接口。是图形显示与实际物理设备之间的桥梁。GDI使得用户无需关心具体设备的细节,而只需在一个虚拟的环境(即逻辑设备)中进行操作

先上一个图,窗口渲染的过程,自己的理解可能有问题

在这里插入图片描述

二、OpenGL

OpenGL是一套应用程序编程接口(API),借助这个API我们开发人员就可以开发出对图形硬件具有访问的能力的程序。我们可以使用OpenGL开发出运行效率较高的图形程序或游戏,因为OpenGL非常接近底层硬件并且OpenGL使得我们不必去关注图形硬件的细节。既然我们开发人员不必关注图形硬件的细节,那么我们需要关注什么呢?我们需要关注OpenGL如何绘制,按照专业术语就是根据物体的规格参数及相关属性,借助虚拟照相机和光照生成一幅该物体的图像。OpenGL程序与平台是无关的,所以OpenGL API中不包含任何输入函数或窗口函数,原因是因为这两种函数都要依赖于特定的平台,例如Windows,Linux或是其他系统。

OpenGL API是过程性的,不是描述性的,即OpenGL不是面向对象的,所以OpenGL无法利用面向对象的特性,例如重载,继承等,但是我们可以使用面向对象的程序与OpenGL的实现进行链接就可以了。作为开发人员来说,我们不需要去描述场景的性质和外观,而是去确定一些操作步骤,为些操作步骤是为实现一定图形或图像所服务的。我们在实现这些步骤时可以调用OpenGL中的一些命令,可以利用这些命令绘制点、直线、多边形或是其它图形,还可以调用这些命令实现光照、着色,动画等各种效果。

OpenGL的实现可以是软件实现,也可以是硬件实现。软件实现是对OpengGL函数调用时作出的响应并创建二维或三维图像的函数库,那么硬件实现则是通过设置能够绘制图形或图像的图形卡驱动程序。一般来说,硬件实现要比软件实现快得多。我们都应该熟悉,在Windows上,是由图形设备接口将图形或图像显示在屏幕上或是其他显示设备上的。OpenGL的实现就软件实现来说,在Windows上会根据程序命令的要求,生成相应的图形或图像,然后会将这个图形或图像移交给图形设备接口,由图形设备接口将图形或是图像显示在我们的屏幕上或是其他显示设备。这样一说,我们可能会明白一点OpengGL原来是在应用程序和图形设备接口之间运作,但我感觉还不能准确地这样说。大家看下下面的图对OpenGL的工作原理可能会理解得更明白一点:

img

上图是OpenGL的软件实现的工作原理。需要注意的是上图中的构造图形是通过软件进行构造的。

OpenGL的硬件实现与软件实现稍微有些不同,硬件实现是将OpenGL的调用传递给硬件驱动程序,而硬件驱动程序不会将生成的图形或图像传递给图形设备接口,而是直接与显示设备通信,直接将图形或图像结果传递给显示器或其他显示设备。如下图所示:

img

OpenGL在绘制图形时是基于一个被称为流水线模型的模式。也就是说其中的几何图形在程序中通过描述空间位置或顶点来指定其形状并由程序生成,这些顶点在流经一系列模块时,每个模块在图形的基本组成部分(在这里称为图元)经过时对其实施一种或多种操作。模块负责对流经的图元实施一种或多种操作变换,例如:旋转、平移、缩放及对摄像机进行定位等。

OpenGL中包含许多对图形图像处理的函数,主要包括以下几种:

图元函数:指定要生成图形或图像的图元。主要有两种类型,一种是绘制二维或三维的几何图元,如点,线,多边形等;另一种是离散型的实体,例如:位图。

属性函数:属性函数主要是控制图元的外观及样式,例如:对图元的颜色、线型、光照及纹理等效果处理。

观察函数:观察函数主要是对摄像机属性的操作。我们可以操作摄像机显示图形或图像近距或是远距效果。

控制函数:能够让我们启用或是彬各种OpenGL的特性。

查询函数:可以让我们查询OpenGL状态变量的值。

输入与窗口控制函数:这个本身不属于OpenGL,但是由于我们会经常在程序中输入输出或是窗口控制操作,所以,这些函数还是比较重要的。

OpenGL函数库一般包含在两个库中,分别称为GL或GLU。GL是OpenGL的核心库,包含必需的OpenGL函数。GLU是OpenGL的实用库,包含许多的新函数。下面的代码显示了许多的Windows程序包含的典型头文件:

#include <GL/gl.h>
#include <GL/glu.h>
#include <windows.h>

但是为了实现和窗口系统的交互,一般使用如下代码引用头文件:

#include <GL/glut.h>

GLUT表示OpenGL工具箱,体现了现代窗口系统所共有的功能函数库。GLUT的目的就是隐藏平台的细节,glut.h已经包含了gl.h和glu.h。使用GLUT是因为OpenGL没有包含输入和窗口命令,而输入和窗口命令是由平台所决定的,与平台的相关性较大。但是前面说过,OpenGL是与平台无关的,也就是说OpenGL是跨平台的。这样设计人员就需要专门设计一个需要和窗口系统进行交互的函数库。

三、什么是DirectX?

DirectX是一种应用程序接口(API),它可让以windows为平台的游戏或多媒体程序获得更高的执行效率,加强3d图形和声音效果,并提供设计人员一个共同的硬件驱动标准,让游戏开发者不必为每一品牌的硬件来写不同的驱动程序,也降低用户安装及设置硬件的复杂度。这样说是不是有点不太明白,其实从字面意义上说,Direct就是直接的意思,而后边的X则代表了很多的意思,从这一点上我们就可以看出DirectX的出现就是为了为众多软件提供直接服务的。

DirectX是由很多API组成的,按照性质分类,可以分为四大部分,显示部分、声音部分、输入部分和网络部分。

显示部分担任图形处理的关键,分为DirectDraw(DDraw)和 Direct3D(D3D),前者主要负责2D图像加速。它包括很多方面:我们播放mpg、DVD电影、看图、玩小游戏等等都是用的DDraw,你可以把它理解成所有划线的部分都是用的DDraw。后者则主要负责3D效果的显示,比如CS中的场景和人物、FIFA中的人物等等,都是使用了DirectX的 Direct3D。

四、GDI与OpenGL与DirectX之间的区别

OpenGL、Direct3D、GDI这三个是不同的API, 没有谁属于谁,其次OpenGL和Direct3D主要用于三维渲染, GDI只能用于绘制二维图形图像。前面两个主要用于实时渲染,后者主要用于Win32程序绘图。

img

五、显卡驱动

1.显卡概述

显卡(Video card,Graphics card)全称显示接口卡,又称显示适配器,是计算机最基本配置、最重要的配件之一。显卡作为电脑主机里的一个重要组成部分,是电脑进行数模信号转换的设备,承担输出显示图形的任务。我们在显示器上看到的图像是由很多个小点组成的,这些小点称为“像素”。在最常用的分辨率设置下,屏幕显示一百多万个像素,电脑必须决定如何处理每个像素,以便生成图像。为此,它需要一位“翻译”,负责从CPU获得二进制数据,然后将这些数据转换成人眼可以看到的图像。除非电脑的主板内置了图形功能,否则这一转换是在显卡上进行的。也就是说,显卡的功能就是将计算机中由1和0表示的二进制数据转换为图像显示出来。

显卡的主要部件是:主板连接设备、监视器连接设备、处理器和内存。主板连接设备,主要用于传输数据和供电;处理器,又称为显示芯片(Video chipset)、图形处理器(GPU)或视觉处理器(VPU),是显卡的主要处理单元,用于决定如何处理屏幕上的每个像素,由于它工作时会产生大量热量,所以它的上方通常安装有散热器或风扇;内存,常被称为“显示存储器”,简称显存,用于存放有关每个像素的信息以及暂时存储已完成的图像;监视器连接设备便于我们查看最终结果。

2.显卡工作原理

数据(data)一旦离开CPU,必须通过4个步骤,最后才会到达显示屏:

1.从总线(Bus)进入GPU(Graphics Processing Unit,图形处理器):将CPU送来的数据送到北桥(主桥)再送到GPU(图形处理器)里面进行处理。

2.从 Video Chipset(显卡芯片组)进入 Video RAM(显存):将芯片处理完的数据送到显存。

3.从显存进入Digital Analog Converter (= RAM DAC,随机读写存储数—模转换器):从显存读取出数据再送到RAM DAC进行数据转换的工作(数字信号转模拟信号)。但是如果是DVI接口类型的显卡,则不需要经过数字信号转模拟信号。而直接输出数字信号。

4.从DAC进入显示器(Monitor):将转换完的模拟信号送到显示屏。

驱动程序:驱动程序是一个软件组件,可让操作系统和设备彼此通信。例如,假设应用程序需要从设备中读取某些数据;应用程序会调用由操作系统实现的函数,操作系统会调用由驱动程序实现的函数。 驱动程序(由设计和制造该设备的同一公司编写)了解如何与设备硬件通信以获取数据。 当驱动程序从设备获取数据后,它会将数据返回到操作系统,操作系统会将数据返回至应用程序。

显卡驱动是由生产硬件的硬件厂商写的,它是为某个系列的显卡所开发的OpenGL的实现;而我们开发一个OpenGL的应用程序时所使用的OpenGL仅仅是一套接口,它是公共的,独立于硬件平台和操作系统的,我们根据OpenGL规范所是实现的这个程序描述的只是我们想要做什么,至于具体怎么做、实现结果是什么效果,它是由显卡驱动和硬件决定的;

OpenGL所提供的只是接口,我们所调用的也只是接口;具体的实现由显卡生产商实现,也就是他们所提供的显卡驱动;我们使用OpenGL可以调用API(这个api仅仅是函数名,仅仅是接口而已)去绘制一个三角形,但是硬件如何知道这个函数是用来绘制三角形的,这一部分就是由显卡驱动来完成,显卡驱动里会提供这个接口的具体实现,也就是说如果没有安装显卡驱动或者显卡驱动里并没有提供绘制三角形的实现,那么OpenGL里的api是毫无意义的;

由于OpenGL的大多数实现都是由显卡厂商编写的,当产生一个bug时通常可以通过升级显卡驱动来解决。这些驱动会包括你的显卡能支持的最新版本的OpenGL,这也是为什么总是建议你偶尔更新一下显卡驱动。

开发者通过图像编程接口发出渲染命令,这些渲染命令也就是DrawCall,只有显卡驱动知道如何和GPU通信,;正是因为显卡驱动的存在,显卡驱动会将接收到的渲染命令翻译成GPU能够理解的语言,也负责将纹理等数据转换成GPU所支持的格式,之后GPU才能懂OpenGL和DirectX,显卡驱动就像是一个中介,介于图形编程接口(OpenGL和DirectX)和GPU之间。

可以将显卡驱动比喻是显卡的操作系统,是显卡的灵魂;

img

六、C++图形化GUI开发框架

这边主要就介绍两个比较常见的框架:MFC和QT。

1.MFC介绍

微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是微软公司提供的一个类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。

图形设备接口(Graphics Device Interface,GDI),把应用程序的函数调用传递给图形设备驱动程序,由设备驱动程序来执行与硬件相关的函数。GDI向应用程序提供了一个设备无关的编程,同时以设备相关的格式和具体的硬件设备交互。

在MFC中使用GDI进行绘图操作一般会涉及两个对象,一是设备上下文对象,包括CDC及其派生类;二是GDI对象,包括CFont、CBrush、CPen等。

介绍MFC之前,需要先介绍几个MFC的概念。

1) API

Windows操作系统提供了各种各样的函数,以方便我们开发Windows应用程序。这些程序是Windows操作系统提供给应用程序编程的接口(Application Programming Interface),简称为API函数。我们在编写Windows程序时所说的API函数,就是指系统提供的函数,所有主要的Windows函数都在Windows头文件中进行了声明。

举个例子,Windows中播放声音的API函数,函数原型如下:

BOOL PlaySound(LPCSTR pszSound, HMODULE hmod,DWORD fdwSound);

pszSound就是你要播放的文件路径,fdwSound就是你要选择的播放模式。具体的用法可以查阅相关的资料。

在使用API时,注意头文件和库文件对API的支持,否则程序编译或链接会提示错误。API PlaySound需要头文件mmsystem.h和库文件WINMM.LIB的支持。

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

00784)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值