OpenGL系列教程之二:OpenGL概述

本文介绍了OpenGL的基本概念,包括其作为图形硬件软件接口的作用、状态机特性、立即模式绘图方法及命令执行控制函数glFlush()和glFinish()的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >





OpenGL是一种图形硬件的软件接口。它被设计成一种可以运行在多种不同硬件平台上与硬件无关的接口。OpenGl程序也可以跨过网络工作(客户-服务器的形式),即使客户机和服务器是不同的机器类型。OpenGL中的客户机是OpenGL程序真正执行的机器,而服务器是实现渲染的机器。

OpenGL在OpenGL核心的命令前使用了前缀gl,在OpenGL工具类中的命令前使用了前缀glu。相似地,OpenGl常量都是以GL_开始的并且全部都是大写字母。OpenGL也使用后缀来指定函数的函数数目和类型。

glColor3f(1, 0, 0);         // 使用3个浮点型的数字设置渲染颜色为红色
glColor4d(0, 1, 0, 0.2);    // 使用双精度浮点型设置渲染颜色为绿色,不透明度为20%
glVertex3fv(vertex);        // 使用向量设置x,y,z的坐标


OpenGL是一个状态机。属性和模式将保持作用效果直到它们被改变为止。大多数状态变量能使用glEnable()函数和glDisable()函数来启用和禁用。你也可以使用glIsEnabled()函数来检查一个状态现在是否被启用。你能使用glPushAttrib()函数和glPopAttrib()函数来将很多状态变量保存在一个存放属性变量的栈中或从这个栈中恢复出来。GL_ALL_ATTRIB_BITS参数能被用来保存或恢复所有的状态。栈的数目在标准OpenGL中至少有16个(使用glinfo函数检查栈最多能容纳的元素个数)。

glPushAttrib(GL_LIGHTING_BIT);    // 改变状态的最佳方式,这样后面你能使用glPopAttrib()函数恢复到现在的状
    glDisable(GL_LIGHTING);       //态,第一行代码将GL_LIGHTING_BIT状态入栈,这样接下来可以对这个状态进行
    glEnable(GL_COLOR_MATERIAL);  // 修改,并且某一时刻可以恢复到入栈时的状态
    glPushAttrib(GL_COLOR_BUFFER_BIT);
    glDisable(GL_DITHER);
    glEnable(GL_BLEND);

... // do something

glPopAttrib();                    // 第一次调用将恢复最后入栈时的状态,即GL_COLOR_BUFFER_BIT
glPopAttrib();                    // 第二次调用将恢复倒数第二次调用时的状态,即GL_LIGHTING_BIT


为了在OpenGL中绘制几何图元(点,线,三角形等),你可以在glBegin()和glEnd()函数之间指定一系列顶点数据。这种方法叫做立即模式。(你也可以使用其他方法绘制几何图元,如顶点数组

glBegin(GL_TRIANGLES);
    glColor3f(1, 0, 0);     // 设置顶点的颜色为红色
    glVertex3fv(v1);        // 使用v1,v2,v3这3个顶点绘制三角形
    glVertex3fv(v2);
    glVertex3fv(v3);
glEnd();

OpenGL中有10种图元类型:GL_POINTS, GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP, GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUADS, GL_QUAD_STRIP, 和 GL_POLYGON.

注意并不是所有的OpenGL命令都可以放置在glBegin()和glEnd()之间的。只有一部分命令可以放置在这两个函数之间,如glVertex*(),glColor*(),glNormal*(),glTexCoord*(),glMaterial*(),glCallList()等。




和计算机中的IO缓冲区比较类似,OpenGL命令并不是立即执行的。所有的命令首先被存储在缓冲区中,包括网络中的缓冲区和图形加速器自身,直到缓冲区满了才开始执行。例如,如果一个应用程序需要通过网络来执行,那么一次发送一系列的命令显然比一次只发生一个命令更加高效。

glFlush()清空这个缓冲区中的所有命令并且强迫这个命令立即执行而不需要等待缓冲区塞满。因此glFlush保证了所有OpenGL命令在调用glFlush()之后在有限的时间内会被全部执行。并且glFlush函数不会等待之间的命令执行完且有可能立即返回到你的程序中。因此,你可以很自由地发送更多的命令即使之间的命令没有被执行完。

glFinish()像glFlush函数一样刷新缓冲区并强迫命令开始执行。但是glFlush函数块会阻塞其他的OpenGL命令直到glFlush函数块中的所有命令被执行完。因此,glFlush()函数直到所有的OpenGL命令都被执行完了才会返回到你的程序中。它可能被用来同步任务或者测量某个OpenGL命令的准确的执行时间。






NEHE的OPENGL教程 第42课 多视窗口… NEHE的OPENGL教程 第42课 多视窗口… NeHe的OPENGL中文教程:第41课 体… NeHe的OPENGL中文教程:第40课 绳… NeHe的OPENGL中文教程:第39课 物… NeHe的OPENGL中文教程:第39课 物… NeHe的OPENGL中文教程:第38课 从… NeHe的OPENGL中文教程:第37课 卡… 愚人节十大IT假新闻:Opera浏览器… NeHe的OPENGL中文教程:第36课 放… NeHe的OPENGL中文教程:第35课 AVI… NeHe的OPENGL中文教程:第35课 AVI… NeHe的OPENGL中文教程:第34课 从… NeHe的OPENGL中文教程:第33课 加… NeHe的OPENGL中文教程:第32课 Alp… NeHe的OPENGL中文教程:第32课 Alp… NeHe的OPENGL中文教程:第32课 Alp… NeHe的OPENGL中文教程:第31课 模… NEHE的OPENGL中文教程:第30课 碰… NEHE的OPENGL中文教程:第30课 碰… NeHe的OPENGL中文教程:第29课 Bli… NeHe的OPENGL中文教程:第28课 贝… NeHe的OPENGL中文教程:第27课 影… NeHe的OPENGL中文教程:第26课剪裁… NeHe的OPENGL中文教程:第25课 变… NeHe的OPENGL中文教程:第24课 TAG… NeHe的OPENGL中文教程:第23课 球… NeHe的OPENGL中文教程:第22课 凸… NeHe的OPENGL中文教程:第22课 凸… NeHe的OPENGL中文教程:第21课 反… NeHe的OPENGL中文教程:第21课 反… NeHe的OPENGL中文教程:第20课 蒙… NeHe的OPENGL中文教程:第19课 粒… NeHe的OPENGL中文教程:第18课 二… NeHe的OPENGL中文教程:第17课 2D… NeHe的OPENGL中文教程:第16课 雾 NeHe的OPENGL中文教程:第15课 图… NeHe的OPENGL中文教程:第14课 图… NeHe的OPENGL中文教程:第13课 位… NeHe的OPENGL中文教程:第12课 显… NeHe的OPENGL中文教程:第11课 飘… NeHe的OPENGL中文教程:第十课 漫… NeHe的OPENGL中文教程:第九课 漂… NeHe的OPENGL中文教程:第八课 Alp… NeHe的OPENGL中文教程:第七课 纹… NeHe的OPENGL中文教程:第七课 纹… NeHe的OPENGL中文教程:第六课 纹… NeHe的OPENGL中文教程:第五课 向3… NeHe的OPENGL中文教程:第四课 旋… NeHe的OPENGL中文教程:第三课 着… NeHe的OPENGL中文教程:第二课 多… NeHe的OPENGL中文教程:第一课 新… NeHe的OPENGL中文教程:第一课 新… DirectX与OpenGL方面的经典电子书… VC++ 6.0下OpengGL配置以及glut配… 怎样开始学习OpenGL
内容概要:该论文探讨了一种基于粒子群优化(PSO)的STAR-RIS辅助NOMA无线通信网络优化方法。STAR-RIS作为一种新型可重构智能表面,能同时反射和传输信号,与传统仅能反射的RIS不同。结合NOMA技术,STAR-RIS可以提升覆盖范围、用户容量和频谱效率。针对STAR-RIS元素众多导致获取完整信道状态信息(CSI)开销大的问题,作者提出一种在不依赖完整CSI的情况下,联合优化功率分配、基站波束成形以及STAR-RIS的传输和反射波束成形向量的方法,以最大化总可实现速率并确保每个用户的最低速率要求。仿真结果显示,该方案优于STAR-RIS辅助的OMA系统。 适合人群:具备一定无线通信理论基础、对智能反射面技术和非正交多址接入技术感兴趣的科研人员和工程师。 使用场景及目标:①适用于希望深入了解STAR-RIS与NOMA结合的研究者;②为解决无线通信中频谱资源紧张、提高系统性能提供新的思路和技术手段;③帮助理解PSO算法在无线通信优化问题中的应用。 其他说明:文中提供了详细的Python代码实现,涵盖系统参数设置、信道建模、速率计算、目标函数定义、约束条件设定、主优化函数设计及结果可视化等环节,便于读者理解和复现实验结果。此外,文章还对比了PSO与其他优化算法(如DDPG)的区别,强调了PSO在不需要显式CSI估计方面的优势。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值