头歌实践教学平台:CG1-v1.0-点和直线的绘制

第1关:OpenGL点的绘制

一. 任务描述

根据下面要求,在右侧修改代码,绘制出预期输出的图片。平台会对你编写的代码进行测试。

1.本关任务

熟悉编程环境; 了解光栅图形显示器的特点; 了解计算机绘图的特点; 进行编程,以OpenGL为开发平台设计程序,以能够在屏幕上生成三个坐标、颜色和尺寸一定的点。

2.预期输出

实验图片

3.具体要求

(1) 背景色为黑色,用 glClearColor()来完成; (2) 渲染的点的直径设置为 3; (3) 选用 GL_POINTS 作为图形类型; (4) 三个点的颜色分别为(1.0f, 0.0f, 0.0f), (0.0f,1.0f,0.0f), (0.0f,0.0f,1.0f); (5) 三个点对应的顶点坐标分别为(-0.4f,-0.4f), (0.0f,0.0f), (0.4f,0.4f)。

二. 相关知识

为了完成本关任务,你需要掌握:Freeglut 库的基本用法与虚拟机代码的使用方法。

1.FreeGlut简介

先介绍下Glut库。GLUT最初由MarkKilgard编写,从OpenGL Redbook(红宝书)第二版起就用来作为示例程序的支持环境,直到第八版为止(注:第九版开始改为GLFW)。从那时起,GLUT因为其简单、可用性广、可移植性强,被广泛应用于各种OpenGL实际应用中。Glut最新版本为3.7版,大致在1998年8月停止维护和更新,同时其代码也没有开源。Freeglut是Glut库(OpenGL Utility Toolkit,OpenGL实用工具包)的免费开源替代品。它是由Pawel W. Olszta在1999年12月创建,最新版本为2015年3月的3.0版本。

2.基本语法

常用的程序设计语言,如C、C++、Pascal、Fortran和Java等,都支持OpenGL的开发。这里只讨论C版本下OpenGL的语法。

OpenGL基本函数均使用gl作为函数名的前缀,如glClearColor();实用函数则使用glu作为函数名的前缀,如gluSphere()。

OpenGL基本常量的名字以GL_开头,如GL_LINE_LOOP;实用常量的名字以GLU_开头,如GLU_FILL。

一些函数如glColor*()(定义颜色值),函数名后可以接不同的后缀以支持不同的数据类型和格式。如glColor3b(…)、glColor3d(…)、glColor3f(…)和glColor3bv(…)等,这几个函数在功能上是相似的,只是适用于不同的数据类型和格式,其中3表示该函数带有三个参数,b、d、f分别表示参数的类型是字节型、双精度浮点型和单精度浮点型,v则表示这些参数是以向量形式出现的。

为便于移植,OpenGL定义了一些自己的数据类型,如GLfloat、GLvoid,它们其实就是C语言中的float和void。在gl.h文件中可以看到以下定义:

 
  1. typedef float GLfloat;
  2. typedef void GLvoid;
3.freeglut库的基本函数

(1) 初始化函数

 
  1. glutInit(int*argc,char**argv)

参数

  • Argc:一个指针,指向从 main()函数传递过来的没更改的 argc 变量。
  • Argv:一个指针,指向从 main()函数传递过来的没更改的 argv 变量。

(2) 初始化窗口位置 glutInitWindowPosition(int x, int y)

(3) 初始化窗口大小 glutInitWindowSize(int x, int y)

(4) 创建窗口 glutCreateWindow(char *title) 参数 title:窗口标题 (5) 绘图函数 display(void) (6) 窗口重绘函数 glutDisplayFunc(&display) 参数 display:调用的函数名称 (7) 指定刷新颜色缓冲区时所用的颜色 glClearColor(float x1, float x2, float x3, float x4) (8) 刷新颜色缓冲区 glClear(GL_COLOR_BUFFER_BIT) (9) 指定栅格化点的直径 glPointSize(int x) (10) 指定绘制图形的类型 glBegin((GLenum mode) 参数: mode:图形类型 (11) 设置颜色 glColor3f(float x, float y, float z) (12) 设置顶点坐标 glVertex2f(float x, float y) (13) 指定的类型结束,与 glBegin 相对 glEnd() (14) 清空缓冲区 glFlush() (15) 所有的与“事件”有关的函数调用无限循环 glutMainLoop()

4.状态机制

OpenGL的工作方式是一种状态机制,它可以进行各种状态或模式设置,这些状态或模式在重新改变它们之前一直有效。例如,当前颜色就是一个状态变量,在这个状态改变之前,绘制的每个像素都将使用该颜色,直到当前颜色被设置为其他颜色为止。

OpenGL中大量使用了这种状态机制,如颜色模式、投影模式、单双显示缓存区的设置、背景色的设置、光源的位置和特性等。许多状态变量可以通过glEnable()、glDisable()这两个函数来设置成有效或无效状态,如是否设置光照、是否进行深度检测等;在被设置成有效状态之后,绝大部分状态变量都有一个默认值。

通常情况下,可以用下列四个函数来获取某个状态变量的值:glGetBooleanv、glGetDouble、glGetFloatv和glGetIntegerv。究竟选择哪个函数应该根据所要获得的返回值的数据类型来决定。还有些状态变量有特殊的查询函数,如glGetLight*、glGetError和glPolygonStipple等。另外,使用glPushAttrib和glPopAttrib函数,可以存储和恢复最近的状态变量的值。只要有可能,都应该使用这些函数,因为它们比其他查询函数的效率更高。

5.OpenGL的坐标系统

如下图,所示OpengGL坐标与绘图区坐标关系如下, 绘图区的中心点:(0.0,0.0,0.0); 绘图区的右上角点:(1.0,1.0,0.0); 绘图区的左下角点:(-1.0, 1.0,0.0)。

图1 OpengGL绘图区对应坐标


开始你的任务吧,祝评测通过!

三、实验代码

// 提示:写完代码请保存之后再进行评测
#include <GL/freeglut.h>
#include<stdio.h>// 评测代码所用头文件-开始
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
// 评测代码所用头文件-结束void myDisplay(void)
{// 请在此添加你的代码/********** Begin ********/glClearColor(0.0,0.0,0.0,0.0);//清除颜色,并设为黑色glPointSize(3);//一个点占据三个像素,直径为3glBegin(GL_POINTS);//开始绘制点glColor3f(1.0,0.0,0.0);//红色glVertex2f(-0.4,-0.4);//设置点坐标glColor3f(0.0,1.0,0.0);//绿色glVertex2f(0.0,0.0);//glColor3f(0.0,0.0,1.0);//蓝色glVertex2f(0.4,0.4);//glEnd();//指定的类型结束/********** End **********/glFlush();
}int main(int argc, char *argv[])
{glutInit(&argc, argv);glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("Hello Point!");glutDisplayFunc(&myDisplay);glutMainLoopEvent();     /*************以下为评测代码,与本次实验内容无关,请勿修改**************/GLubyte* pPixelData = (GLubyte*)malloc(400 * 400 * 3);//分配内存GLint viewport[4] = {0};    glReadBuffer(GL_FRONT);glPixelStorei(GL_UNPACK_ALIGNMENT, 4);glGetIntegerv(GL_VIEWPORT, viewport);glReadPixels(viewport[0], viewport[1], viewport[2], viewport[3], GL_RGB, GL_UNSIGNED_BYTE, pPixelData);cv::Mat img;std::vector<cv::Mat> imgPlanes;img.create(400, 400, CV_8UC3);cv::split(img, imgPlanes);for(int i = 0; i < 400; i ++) {unsigned char* plane0Ptr = imgPlanes[0].ptr<unsigned char>(i);unsigned char* plane1Ptr = imgPlanes[1].ptr<unsigned char>(i);unsigned char* plane2Ptr = imgPlanes[2].ptr<unsigned char>(i);for(int j = 0; j < 400; j ++) {int k = 3 * (i * 400 + j);plane2Ptr[j] = pPixelData[k];plane1Ptr[j] = pPixelData[k+1];plane0Ptr[j] = pPixelData[k+2];}}cv::merge(imgPlanes, img);cv::flip(img, img ,0); cv::namedWindow("openglGrab");cv::imshow("openglGrab", img);//cv::waitKey();cv::imwrite("../img_step1/test.jpg", img);return 0;
}

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

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

相关文章

vivado 配置存储器支持-Artix-7 配置存储器器件

配置存储器支持 本章主要讲解 Vivado 软件支持的各种非易失性器件存储器。请使用本章作为指南 &#xff0c; 按赛灵思系列、接口、制造商、 密度和数据宽度来为您的应用选择适用的配置存储器器件。 Artix-7 配置存储器器件 下表所示闪存器件支持通过 Vivado 软件对 A…

苹果电脑MAC清理系统空间工具CleanMyMacX4.15.3中文版下载

苹果电脑以其出色的性能、优雅的设计和高效的操作系统而受到许多用户的喜爱。然而&#xff0c;随着时间的推移和使用量的增加&#xff0c;你可能会发现你的Mac开始变得缓慢和响应迟缓。这通常是因为硬盘空间被大量占用&#xff0c;影响了系统的整体性能。幸运的是&#xff0c;有…

maven的安装与配置(超详细)

在Java开发中&#xff0c;配置Maven环境有几个重要的原因&#xff1a; 依赖管理&#xff1a;Maven 是一个强大的依赖管理工具&#xff0c;它能够帮助开发人员轻松地管理项目所需的各种第三方库和组件。通过在项目的 Maven 配置文件&#xff08;pom.xml&#xff09;中定义依赖&…

数据结构与算法学习笔记六-二叉树的顺序存储表示法和实现(C语言)

目录 前言 1.数组和结构体相关的一些知识 1.数组 2.结构体数组 3.递归遍历数组 2.二叉树的顺序存储表示法和实现 1.定义 2.初始化 3.先序遍历二叉树 4.中序遍历二叉树 5.后序遍历二叉树 6.完整代码 前言 二叉树的非递归的表示和实现。 1.数组和结构体相关的一些知…

【C#】 SortedDictionary,查找字典中是否存在给定的关键字

欢迎来到《小5讲堂》 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景场景说明红黑树原理判断代码Dictionary知识点相关文章 背景 最近…

六西格玛遇上AI:质量提升进入“快车道”

人工智能&#xff08;AI&#xff09;与六西格玛管理方法——正在慢慢接近我们的视野中&#xff0c;预示着在质量管理中一场改革重大改革将要到来。 AI&#xff0c;作为科技的前沿&#xff0c;正以其强大的数据处理能力和机器学习能力&#xff0c;为质量管理提供全新的视角。它…

将来会是Python、Java、Golang三足鼎立吗?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「 Java的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 软件工程里没有银弹&#xff…

leetcode刷题指南

本文我将分享给大家一套我自己使用良久并觉得非常高效的 学习论&#xff0c;它可以运用到 Leetcode 上的刷题&#xff0c;也可以 generalize 到生活中涉及到学习以及记忆的方方面面。当然&#xff0c;本文将以 Leetcode 刷题为 case study 去进行讲解。 更具体一点, 我会教大家…

2024年学浪视频如何导出到本地

在数字时代的浪潮中&#xff0c;知识的传递如同星辰般璀璨&#xff0c;而学浪视频则是那座连接天地的桥梁。2024年&#xff0c;我们站在科技的巅峰&#xff0c;眺望着知识的海洋&#xff0c;渴望将那些波光粼粼的智慧片段&#xff0c;一一捕捉&#xff0c;珍藏于心。想象一下&a…

day07beef-xss之根据beef-xss获取cookies

1.安装 apt-get update apt-get install beef-xss 若报错运行不了尝试 apt remove ruby apt remove beef-xss apt-get install ruby apt-get install ruby-dev libpcap-dev gem install eventmachine apt-get install beef-xss 2.运行 beef-xss 运行成功会自动弹出浏览框。 攻…

天猫最热销的三款随身WiFi,哪一款直播最好用?2024公认最好的随身WiFi,天猫上的随身wifi是正规产品吗

近期有小伙伴问我&#xff1a;“小编、小编我要当户外博主了&#xff0c;想买一个随身WiFi&#xff0c;但是天猫榜单前三的随身WiFi自己都没有听说过&#xff0c;到底入手哪个比较好&#xff1f;”三款随身WiFi呢&#xff0c;分别是格行随身WiFi、迅优随身WiFi、小米随身WiFi&a…

UEC++ FString做为参数取值时报错error:C4840

问题描述 用来取FString类型的变量时报错&#xff1a; 问题解决 点击错误位置&#xff0c;跳转到代码&#xff1a; void AMyDelegateActor::TwoParamDelegateFunc(int32 param1, FString param2) {UE_LOG(LogTemp, Warning, TEXT("Two Param1:%d Param2:%s"), param…

微信小程序动态tabBar实现:基于自定义组件,灵活支持不同用户角色与超过5个tab自由组合(更新版)

文章目录 背景实现步骤&#xff1a;1、我们先在utils目录中创建tab-service.js文件&#xff0c;写上全局的数据及方法&#xff1b;2、在app.json文件中配置导航信息3、根目录下创建custom-tab-bar目录4、编写custom-tab-bar组件4.1、custom-tab-bar/index.wxml4.2、custom-tab-…

政务网离线安装python3及其依赖手册

文章目录 python安装及环境配置gcc安装make安装python3安装pip安装 测试测试python3报错:ModuleNotFoundError: No module named _ctypes’测试pip3报错“pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.” 依赖库…

项目经理有哪些常见的沟通技巧?

项目经理有哪些常见的沟通技巧&#xff1f; 项目管理的核心之一是沟通。有效的沟通技巧对于确保项目团队成员之间的合作、项目信息的准确传达以及项目目标的顺利实现至关重要。一个号的项目管理工具可以让我们事半功倍&#xff0c;结合项目管理工具zz-plan 来探讨一些项目经理…

2024年第九届数维杯大学生数学建模挑战赛C 题解题思路1.0版本

题目分析&#xff1a; 问题背景&#xff1a;天然气水合物作为一种高效的清洁后备能源&#xff0c;其资源量评估对未来能源开发极为重要。 具体任务&#xff1a; 0.数据预处理 首先将txt中的数据合并到表格里方便后续操作&#xff0c;从Excel文件导入数据&#xff0c;清洗数…

【机器学习】逻辑回归:智能垃圾邮件分类实例

逻辑回归&#xff1a;智能垃圾邮件分类的利器 一、引言二、逻辑回归概述三、垃圾邮件分类实例数据准备特征选择与建模 四、总结与展望 一、引言 随着互联网的迅猛发展&#xff0c;电子邮件已成为人们日常生活和工作中不可或缺的一部分。然而&#xff0c;与此同时&#xff0c;垃…

综合能力 | 误差 | 学习笔记

误差指真值与观测值的差值。 误差分为系统误差&#xff08;消除方法&#xff1a;观测方法、仪器校正、修正等&#xff09;、偶然误差&#xff08;符合正态分布规律&#xff0c;进行计算纠正&#xff09;、粗差&#xff08;一般舍弃&#xff09;。 中误差&#xff08;均方差或标…

如何用 OceanBase做业务开发——【DBA从入门到实践】第六期

当应用一款新的数据库时&#xff0c;除了基础的安装部署步骤&#xff0c;掌握其应用开发方法才是实现数据库价值的关键。为此&#xff0c;我们特别安排了5月15日&#xff08;周三&#xff09;的《DBA 从入门到实践》第六期课程——本次课程将带大家了解OceanBase数据库的开发流…

探索静态住宅IP代理:保障网络安全与隐私的新途径

在数字化时代&#xff0c;互联网已经成为人们日常生活和工作的重要组成部分。然而&#xff0c;网络安全和隐私保护问题也随之而来&#xff0c;成为广大网民关注的焦点。静态住宅IP代理作为一种新兴的网络技术&#xff0c;以其独特的功能和优势&#xff0c;逐渐受到用户的青睐。…