计算机图形软件(三)6-5 一个完整的OpenGL程序、OpenGL的出错处理

news2025/1/22 19:42:32

一个完整的OpenGL程序

        给出构成一个完整程序的所有部分之前还是有一些任务需要完成。对于显示窗口,我们可以选择背景颜色。我们需要组织一个过程来包含创建显示图形所必需的OpenGL 函数。

        要像图3.2 那样使用 RCB 颜色值将显示窗口的背景颜色设定为白色可以使用 OpenGL
函数:glclearColor (1.0,1.0,1.0,0.0);该函数前面的三个变量将红、绿、蓝三个颜色分量设定为1.0。这样就得到了白色背景的显示窗口。如果不是1.0,而是将这些颜色分量都设定为0.0,则得到熙色的背景。如果红、绿、蓝三分量的每一个设定为0.0到10之间的同一个值将得到某种灰色。glclearcolor 函数的第四个参数称为指定颜色的 a(alpha)值。a 值的一个用途是作为“调和”参数。在激活 OpenCL调和参数时,a值用来为两个重叠对象确定结果颜色。 值为0.0表示完全明的对象而 值为1.0表示不透明的对象。调和操作暂时不会使用,因此 值与我们前面提到的程序无关。现在,我们简单设定a值为00。
        尽管glclearColor 命令将某颜色赋给显示窗口,但它不能让显示窗口在屏幕上出现。要
使赋值的窗口得到显示,必须入下面的OpenGL函数:glclear (GL_COLOR BUFFER_BIT):变量GL_COLOR_BUFFER_BIT是一个OpenGL符号常量用来指定它是颜色缓存(刷新缓存)中的位值,该缓存将使用glclearColor 函数中指定的值来设定。(OpenGL有多个可以管理的级存,在第4章中将讨论其他缓存。)
除了设定显示缓存的背景色,还可以为要显示的场景中的对象选择各种颜色。对于最初的程序设计例子,我们简单地把对象颜色设定为深蓝色而把各种颜色选项的讨论放到第5章
glColor3f(0.0,0.4,0.2);
        glcolor函数的后缀3表示我们在指定三个 RCB 颜色分量时使用浮点数。该函数要求这些值必须在0.0到1.0的范围内,这里设定R=0.0G=0.4,而B=0.2。在第一个程序中,我们要显示一条简单的二维线段。为此需要告诉 penGL 怎样将图形投影到显示窗口中,因为在 OpenGL 中把生成二维线段看成生成三维线段的特例。因此,尽管我们只要生成很简单的二维线段,OpenGL 还是采用完整的三维观察操作来处理该图形。我们可以使用下面两个函数来设置投影类型(模式)和其他观察参数

g1MatrixMode (GLPROJECTION):

gluOrtho2D (0.0,200.0,0.0150.0):

这表示使用正投影将世界坐标系二维矩形区域的内容映射到屏幕上,区域的 x 坐标值从0.0到200.0,y坐标值从0.0到150.0只要是在该矩形内定义的对象,都会出现在显示窗口中。任何在坐标范围外的内容都不会显示出来。因此,GLU 数gluortho2D 定义了显示口以(0.00.0)为左下角、以(200.0150.0)为右上角。由于我们仅仅描述了一个二维对象,正投影只是将前面定义的图形“贴”到显示窗口中。现在使用与显示窗口具有一样纵横比的世界坐标矩形,从而使图形不产生变形。后面将考虑如何在不依赖显示窗口描述的情况下保持纵横比。最后,要调用合适的函数来建立线段。下面的程序定义了一个从整数笛卡儿端点坐标(18015)到(10145)的二维直线段第4 章将给出这些函数及用来生成图元的其他OpenGL 函数的详细解释。

现在,我们已经可以将各部分组合起来。下面的 OpenGL序按三个过程来组织。将所有初始化和有关的一次性的参数设定放在函数 nit 中。要显示图形的几何描述放在函数lineSegment中,该过程将由GLUT函数glutDisplayFunc 调用。函数main包含设定显示窗口及将线段送到屏幕的 GLUT 函数。图3.3给出了由该程序生成的显示窗口及线段。

 过程 lineSegment的最后是函数glFlush我们还未讨论它。该函数强制执行由计算机系统存放在缓存中不同位置的OpenGL函数,其位置依赖于OpenGL的实现。例如在繁忙的网络中,可能因处理某些缓存而出现延缓现象,但glFlush 的调用将强制清空所有缓存来处理OpenGL函数。
描述图形的函数lineSegment称为一个显示回调函数(display callback function)。该函数由glutDisplayFunc 作为在显示窗口需要重新显示时引人的函数来“注册”。例如,显示窗口移动时会出现这种情况。在后面几章中,我们将看到其他类

        型的回调函数及辅助的对它们注册的 GLUT 函数。 图3.3 由示序生成的显示窗口和线段一般情况下,OpenGL程序组织成一组在一定行为发生时的回调函数的集合。

OpenGL的出错处理

        用它们的程序员。因而,我们宁愿相信,我们的 OpenCL 程序有可能(如果不是经常)包含错误。
        所以,有必要花费一些时间来讨论 OpenGL程序的出错处理。OpenGL和GLU记录错误的方法比较简单。当OpenGL发现在对基本库子序或GLU子序的一次调用中有错误时,就在内部记录一个出错编码,而造成出错的子程序被忽略(因此该错误不影响 OpenGL的内部状态,也不影响帧缓存的内容)。但是OpenGL每次只记录一个出错编码。一旦出现一个出错编码,在你的程序明确查询 OpenGL出错状态之前不会再记录另外的出错编码:
        GLenum code;
        code = glGetError ():
        该调用返回当前的出错编码并清除内部出错标志。如果返回的值等于OpenGL符号常数GL_NOERROR,则什么事也没有。任何其他返回值都表示出现问题。OpenGL基本库定义了一些代表各种出错编码的符号常数;表3.1列出了经常出现的一些符号常数。GLU库也定义了一些出错编码,但其中多数都使用没有什么意义的名字,比如         GLUNURBS_ERROR1GLU_NURBS_ERROR2,

等等。(实际上这些名字也不是一点意义都没有,但是在后面几章讨论更新的概念之前,它们的意义并不明显。

这些符号常数是有帮助的,但直接打印出来并不提供特别的信息。幸而,GLU 库包含有一个函数,可以为每个 GLU和GL 错误返回一个描述性字符串,并将其作为一个参数传递给该函数。返回值可以使用C语言的标准库函数 fprintf 来打印,例如:
 

gluErrorString返回的值指向位于GLU库内部的一个字符串。这不是一个动态分配的字符串,所以不能由我们的程序重新分配。同样也不能由我们的程序对其进行修改(因而有字符串声明的常数修改器)。
我们可以很容易将这些函数嵌人程序的通用出错报告函数中。下面的函数用来获取当前出错编码、打印描述性出错字符串并返回调用子程序的编码:

        我们鼓励按上面的方式开发OpenGL程序。比较好的做法是在每一个显示回调子程序中至少检查一次出错情况,当你使用一个未使用过的功能时,或当你在程序生成的图像中看到不正常或非预期的结果时,常常需要安排出错检查。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/966215.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

报错处理:Disk space full

报错环境: Linux 具体报错: No space left on device,磁盘空间已满 排错思路: 当磁盘空间耗尽时,会出现磁盘空间已满的错误。这可能是由于磁盘上的文件过多或者某个文件系统占用了过多磁盘空间。 解决方法:…

Opencv图像暗通道调优

基于雾天退化模型的去雾算法,Opencv图像暗通道调优,(清华版代码)对普通相片也有较好的调优效果,相片更通透。 结合代码实际运行效果、算法理论模型、实际代码。我个人理解,实际效果是对图像的三个颜色通道…

解决Clipping input data to the valid range for imshow with RGB data([0..1] ...)

解决 Clipping input data to the valid range for imshow with RGB data [0..1] for floats or [0..255] for integers 1. 问题描述2. 解决方法 1. 问题描述 在使用 python 显示 npz 文件中的图片时,使用如下代码: import numpy as np import matplot…

强大的思维导图库SimpleMindMap

本文软件是网友 Frank Yang 推荐的; 什么是 SimpleMindMap ? Simple Mind Map 是一个简单、强大的 Web 思维导图库,不依赖任何特定框架,可以帮助你快速开发思维导图产品。同时 Simple Mind Map 也是一个思维导图软件。无论你是开发…

IO面试题整理

1.同步/异步,阻塞/非阻塞是一样的概念吗? 不一样。 阻塞/非阻塞说的是调用者。调用者需要等待就是阻塞,不需要等待就是非阻塞。 同步/异步说的是被调者通知调用者的方式。被调者执行完成后再恢复调用者是同步。被调者立即告诉调用者收到求…

【易售小程序项目】修改“我的”界面前端实现;查看、重新编辑、下架自己发布的商品【后端基于若依管理系统开发】

文章目录 “我的”界面修改效果界面实现界面整体代码 查看已发布商品界面效果商品数据表后端上架、下架商品ControllerMapper 界面整体代码back方法 编辑商品、商品发布、保存草稿后端商品校验方法Controller 页面整体代码 “我的”界面修改 效果 界面实现 界面的实现使用了一…

vue3 Table 分页保留选中状态

//指定id值,数据更新之后保留之前选中的数据 const getRowKeys (row) > {return row.siteId; }; // 这存的是选中的数据 const userSelectionChange (values) > {state.selectedData [...values]; }; // 两个数组对比,判断表格中的数据是否开启选中 cons…

【更新至2022年】1992-2022年全国31省金融业增加值数据(无缺失)

【更新至2022年】1992-2022年全国31省市金融业增加值数据(无缺失) 1、时间:1992-2022年 2、来源:国家统计J、各省TJNJ 3、指标:金融业增加值 4、范围:31省 5、缺失情况说明:无缺失 6、指标…

Google Services Framework 谷歌服务框架的安装以及遇到的常见问题

安装谷歌三件套: 1、Google 服务框架(Google Services Framework)下载地址: https://www.apkmirror.com/apk/google-inc/google-services-framework/ 注意一定要选择与自己手机对应的安卓系统版本的服务框架。 2、Google Play Se…

javaee spring aop 的五种通知方式

spring配置文件 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns:aop"http://www.springframework.…

常见脉冲电路

在电子电路中&#xff0c;电源、放大、振荡和调制电路被称为模拟电子电路&#xff0c;因为它们加工和处理的是连续变化的模拟信号。电子电路中另一大类电路的数字电子电路。它加工和处理的对象是不连续变化的数字信号。数字电子电路又可分成脉冲电路和数字逻辑电路&#xff0c;…

day3 c++d对话框及事件处理机制

1.文本编辑器 2.自由移动的球

【深度学习】实验06 使用TensorFlow完成线性回归

文章目录 使用TensorFlow完成线性回归1. 导入TensorFlow库2. 构造数据集3. 定义基本模型4. 训练模型5. 线性回归图 使用TensorFlow完成线性回归 1. 导入TensorFlow库 # 导入相关库 %matplotlib inline import numpy as np import tensorflow as tf import matplotlib.pyplot …

HTML+JavaScript+CSS DIY 分隔条splitter

一、需求分析 现在电脑的屏幕越来越大&#xff0c;为了利用好宽屏&#xff0c;我们在设计系统UI时喜欢在左侧放个菜单或选项面板&#xff0c;在右边显示与菜单或选项对应的内容&#xff0c;两者之间用分隔条splitter来间隔&#xff0c;并可以通过拖动分隔条splitter来动态调研…

TuyaOS开发学习笔记(1)——NB-IoT开发搭建环境、编译烧写(MT2625)

一、搭建环境 1.1 官方资料 TuyaOS 1.2 安装VMware 官网下载&#xff1a;https://customerconnect.vmware.com/en/downloads/info/slug/desktop_end_user_computing/vmware_workstation_pro/16_0 百度网盘&#xff1a;https://pan.baidu.com/s/1oN7H81GV0g6cD9zsydg6vg 提取…

【Redis从头学-完结】Redis全景思维导图一览!耗时半个月专为Redis初学者打造!

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;CSDN实力新星&#xff0c;后端开发两年经验&#xff0c;曾担任甲方技术代表&#xff0c;业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开…

C语言入门 Day_12 一维数组0

目录 前言 1.创建一维数组 2.使用一维数组 3.易错点 4.思维导图 前言 存储一个数据的时候我们可以使用变量&#xff0c; 比如这里我们定义一个记录语文考试分数的变量chinese_score&#xff0c;并给它赋值一个浮点数&#xff08;float&#xff09;。 float chinese_scoe…

2023应届生java面试紧张失误之一:CAS口误说成开心锁-笑坏面试官

源于&#xff1a;XX网&#xff0c;如果冒犯&#xff0c;表示歉意 面试官&#xff1a;什么是CAS 我&#xff1a;这个简单&#xff0c;开心锁 面试官&#xff1a;WTF&#xff1f; 我&#xff1a;一脸自信&#xff0c;对&#xff0c;就是这个 面试官&#xff1a;哈哈大笑&#xff…

YOLOv7框架解析

YOLOv7概念 YOLOv7是基于YOLO系列的目标检测算法&#xff0c;由Ultra-Light-Fast-Detection&#xff08;ULFD&#xff09;和Scaled-YOLOv4两种算法结合而来。它是一种高效、准确的目标检测算法&#xff0c;具有以下特点&#xff1a; 1. 高效&#xff1a;YOLOv7在保持准确率的…

一个 MySQL 数据库死锁的案例和解决方案

本文介绍了一个 MySQL 数据库死锁的案例和解决方案。 场景 生产环境出了一个偶现的数据库死锁问题&#xff0c;导致少部分业务处理失败。 分析特征之后&#xff0c;发现是多个线程并发执行同一个方法&#xff0c;更新关联的数据时可能会出现&#xff0c;把场景简化概括一下&…