头歌实践教学平台:CG5-v1.0-简单光照效果

第2关:OpenGL球体镜面反射

一.任务描述

根据提示,在右侧修改代码,并自己绘制出图形。平台会对你编写的代码进行测试。

1.本关任务

为在场景中增加光照,需要执行以下步骤。 (1).设置一个或多个光源,设定它的有关属性; (2).选择一种光照模型; (3).设置物体的材料属性。

2.预期输出

实验图片

3.具体要求

给球体添加环境光,漫反射和镜面反射等效果,每个参数的含义已在代码中给出。 (1).左侧圆球有环境光、漫反射和镜面低反射; (2).中间圆球有环境光、漫反射和镜面高反射; (3).右侧圆球有彩色环境光、漫反射、镜面高反射和材料辐射。

二.相关知识

为了完成本关任务,你需要掌握:了解掌握OpenGL程序的光照与材质,能正确使用光源与材质函数设置所需的绘制效果。

开始你的任务吧,祝你成功!

三.实验代码

// 提示:在合适的地方修改或添加代码
#include <GL/freeglut.h>
#include<stdlib.h>
// 评测代码所用头文件-开始
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace std;
// 评测代码所用头文件-结束

void init(void)
{
	GLfloat position[] = {0.0,3.0,2.0,0.0};
	GLfloat ambient[]={0.0,0.0,0.0,1.0};
    GLfloat diffuse[]={1.0,1.0,1.0,1.0};
    GLfloat specular[]={1.0,1.0,1.0,1.0};
    GLfloat lmodel_ambient[]={0.4,0.4,0.4,1.0};
    GLfloat local_view[]={0.0};

    glClearColor(0.0, 0.1, 0.1,0.0); 
    glShadeModel(GL_SMOOTH);
    
    glLightfv(GL_LIGHT0,GL_AMBIENT,ambient);
    glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuse);
    glLightfv(GL_LIGHT0,GL_POSITION,position);
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient);
    glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER,local_view);

    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_DEPTH_TEST);

}

void display(void)
{
   GLfloat no_mat[]={0.0,0.0,0.0,1.0};                     //没有光
   GLfloat mat_ambient[]={0.7,0.7,0.7,1.0};                //环境光
   GLfloat mat_ambient_color[]={0.8, 0.8, 0.2, 1.0};       //彩色环境光 
   GLfloat mat_diffuse[]={0.1,0.5,0.8,1.0};                //漫反射
   GLfloat mat_specular[]={1.0,1.0,1.0,1.0};               //镜面反射
   GLfloat no_shininess[] = {0.0};                         //没有镜面反射
   GLfloat low_shininess[]={5.0};                          //低镜面反射
   GLfloat high_shininess[]={100.0};                       //高镜面反射
   GLfloat mat_emission[]={0.3,0.2,0.2,0.0};               //材料辐射光颜色 

   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();
    glTranslatef(-3.0, 0.0, 0.0);
    // 请在此添加你的代码,左侧圆球有环境光、漫反射镜面低反射
    /********** Begin ********/
    //材质的环境颜色,params默认值(0.2,0.2,0.2,1.0)
    glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);//环境光

    //材质的散射颜色,params默认值(0.8,0.8,0.8,1.0)
    glMaterialfv(GL_FRONT,GL_DIFFUSE, mat_diffuse);//漫反射

    //材质的镜面反射颜色,params默认值(0.0,0.0,0.0,1.0)
    glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);//镜面反射

    //镜面反射指数,params默认值0.0
    glMaterialfv(GL_FRONT,GL_SHININESS,low_shininess); //低镜面反射

    //材质的发射光颜色,params默认值(0.0,0.0,0.1,1.0)
    glMaterialfv(GL_FRONT,GL_EMISSION,no_mat);//无材料辐射光颜色
 
    /********** End *********/
	glutSolidSphere(1.0, 50, 50);  
    glPopMatrix();

	glPushMatrix();
    // 请在此添加你的代码,中间圆球有环境光、漫反射镜面高反射
    /********** Begin ********/
    //材质的环境颜色,params默认值(0.2,0.2,0.2,1.0)
    glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);//环境光

    //材质的散射颜色,params默认值(0.8,0.8,0.8,1.0)
    glMaterialfv(GL_FRONT,GL_DIFFUSE, mat_diffuse);//漫反射

    //材质的镜面反射颜色,params默认值(0.0,0.0,0.0,1.0)
    glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);//镜面反射

    //镜面反射指数,params默认值0.0
    glMaterialfv(GL_FRONT,GL_SHININESS,high_shininess);//高镜面反射

    //材质的发射光颜色,params默认值(0.0,0.0,0.1,1.0)
    glMaterialfv(GL_FRONT,GL_EMISSION,no_mat);//无材料辐射光颜色

    /********** End *********/
	glutSolidSphere(1.0, 50, 50);  
    glPopMatrix();

    glPushMatrix();
    glTranslatef(3.0, 0.0, 0.0);
    // 请在此添加你的代码,右侧圆球有彩色环境光、漫反射、镜面高反射和材料辐射
    /********** Begin ********/
    //材质的环境颜色,params默认值(0.2,0.2,0.2,1.0)
    glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient_color);//彩色环境光 

    //材质的散射颜色,params默认值(0.8,0.8,0.8,1.0)
    glMaterialfv(GL_FRONT,GL_DIFFUSE, mat_diffuse);//漫反射

     //材质的镜面反射颜色,params默认值(0.0,0.0,0.0,1.0)
    glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);//镜面反射

    //镜面反射指数,params默认值0.0
    glMaterialfv(GL_FRONT,GL_SHININESS,high_shininess);//高镜面反射
    //材质的发射光颜色,params默认值(0.0,0.0,0.1,1.0)
    glMaterialfv(GL_FRONT,GL_EMISSION,mat_emission);//材料辐射光颜色

    /********** End *********/
	glutSolidSphere(1.0, 50, 50);  
    glPopMatrix();



	glFlush();
	glutPostRedisplay();
}

void reshape(int w, int h)
{
	glViewport(0, 0, (GLsizei)w, (GLsizei)h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 1.0, 20.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	gluLookAt(0.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}





int main(int argc, char *argv[])
{

	glutInit(&argc, argv);
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(800, 600);
	glutCreateWindow("几何变换示例");
    init();
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutMainLoopEvent();     
     
    /*************以下为评测代码,与本次实验内容无关,请勿修改**************/
 	GLubyte* pPixelData = (GLubyte*)malloc(800 * 600 * 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(600, 800, CV_8UC3);
    cv::split(img, imgPlanes);

    for (int i = 0; i < 600; 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 < 800; j++) {
            int k = 3 * (i * 800 + 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://www.mfbz.cn/a/579806.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

信息系统项目管理师0074:数据集成(5信息系统工程—5.3系统集成—5.3.3数据集成)

点击查看专栏目录 文章目录 5.3.3数据集成1.数据集成层次2.异构数据集成5.3.3数据集成 数据集成的目的是运用一定的技术手段将系统中的数据按一定的规则组织成为一个整体,使得用户能有效地对数据进行操作。数据集成处理的主要对象是系统中各种异构数据库中的数据。数据仓库技术…

eclipse导入工程提示Project has no explicit encoding set

eclipse导入工程提示Project has no explicit encoding set 文章目录 eclipse导入工程提示Project has no explicit encoding set一、Eclipse的工程导入二、可能的问题1.在工程名下有黄色叹号 一、Eclipse的工程导入 用Eclipse的导入可以将原有工程导入到新环境中 具体方法是&…

1. 房屋租赁管理系统(基于springboot/vue的Java项目)

1.此系统的受众 1.1 在校学习的学生&#xff0c;可用于日常学习使用或是毕业设计使用 1.2 毕业一到两年的开发人员&#xff0c;用于锻炼自己的独立功能模块设计能力&#xff0c;增强代码编写能力。 1.3 亦可以部署为商化项目使用。 2. 技术栈 jdk8springbootvue2mysq5.7&8…

区块链与Web3.0:区块链项目的推广

数字信息时代&#xff0c;一场革命正在酝酿中&#xff0c;那就是区块链与Web3.0的结合。这种结合将会改变我们对于信息传输、存储和使用的方式&#xff0c;并有可能推动媒体行业向新的高度发展。这种转变不仅关系到我们如何获取和使用信息&#xff0c;也涉及到如何用创新的方式…

四、OSPF域间路由

注&#xff1a;区域&#xff08;area&#xff09;是以接口进行划分的 描述&#xff1a; R1的g0/0/1接口属于area 0 √ R1属于区域0和区域1 1.设计原则 1、OSPF区域的设计原则&#xff1a; 骨干区域有且只能存在一个 非骨干区域必须和骨干区域相连 多区域时&#…

VulnHub靶机 DC-9 靶机 详细渗透过程

VulnHub靶机 DC-9 打靶实战 详细渗透过程 目录 VulnHub靶机 DC-9 打靶实战 详细渗透过程一、将靶机配置导入到虚拟机当中二、渗透测试主机发现端口扫描Web渗透SQL注入登入后台文件包含SSH爆破提权 一、将靶机配置导入到虚拟机当中 靶机地址&#xff1a; https://www.vulnhub.…

【MHA】MySQL高可用MHA介绍1-功能,架构,优势,案例

目录 一 MHA 介绍 1 MHA功能 自动化主服务器监控和故障转移 交互式&#xff08;手动启动的&#xff09;主故障转移 非交互式主故障转移 在线切换主机 2 主服务器故障转移的难点 二 MHA架构 1 MHA组件 2 自定义扩展&#xff08;脚本&#xff09; 三 MHA优势 1 MHA可以…

锂电池SOH预测 | 基于BP神经网络的锂电池SOH预测(附matlab完整源码)

锂电池SOH预测 锂电池SOH预测完整代码锂电池SOH预测 锂电池的SOH(状态健康度)预测是一项重要的任务,它可以帮助确定电池的健康状况和剩余寿命,从而优化电池的使用和维护策略。 SOH预测可以通过多种方法实现,其中一些常用的方法包括: 容量衰减法:通过监测电池的容量衰减…

jupyter notebook设置代码自动补全

jupyter notebook设置代码自动补全 Anaconda Prompt窗口执行 pip install jupyter_contrib_nbextensionsjupyter contrib nbextensions install --userpip install jupyter_nbextensions_configuratorjupyter nbextensions_configurator enable --user按如下图片设置 卸载jed…

HarmonyOS Next从入门到精通实战精品课

第一阶段&#xff1a;HarmonyOS Next星河版从入门到精通该阶段由HarmonyOS Next星河版本出发&#xff0c;介绍HarmonyOS Next版本应用开发基础概念&#xff0c;辅助学员快速上手新版本开发范式&#xff0c;共计42课时 第一天鸿蒙NEXT Mac版、Windows版【编辑器】和【模拟器】&a…

长度最小的子数组 ---- 滑动窗口

题目链接 题目: 分析: 解法一:暴力解法, 找到所有连续子数组, 保留满足条件的解法二: 利用滑动窗口 找子数组 因为数组中都是正整数, 通过进窗口的操作, 我们找到一组, 如示例一中的2,3,1,2, 判断满足和>7, 那么根据单调性, 我们就不再需要判断加上后面两个数的两个子数组…

记录浏览器打开网站拦截提示不安全解决方法

浏览器可能会因为多种原因显示“不安全”的警告,这通常是由于安全设置不当或配置错误造成的。以下是一些常见的原因和解决方法: 1. HTTPS未启用 原因:如果网站使用HTTP而不是HTTPS,浏览器可能会显示不安全的警告。 解决方法:配置SSL/TLS证书并使用HTTPS来加密数据传输…

鹏哥C语言复习——字符函数与字符串函数

目录 一.字符函数 1.字符分类函数 2.字符转换函数 二.基础字符串函数 1.strlen函数 2.strcpy函数 3.strcat函数 4.strcmp函数 三.基础字符串函数优化 1.strncpy函数 2.strncat函数 3.strncmp函数 四.进阶字符串函数 1.strstr函数 2.strtok函数 3.strerror函数 一…

做大模型产品,如何设计prompt?

做GenAI产品&#xff0c;除了要设计好的AI任务流程&#xff0c;合理的拆分业务以外&#xff0c;最重要的就是写好prompt&#xff0c;管理好prompt&#xff0c;持续迭代prompt。 prompt一般有两种形式&#xff1a;结构化prompt和对话式prompt。 结构化prompt的优点是通过规范的…

vim的IDE进阶之路

一 ctags 1 安装 安装ctags比较简单&#xff0c;我用的是vim-plug&#xff0c;网络上随便一搜应该就有很多教程&#xff0c;而且没有什么坑 2 使用 vim之函数跳转功能_nvim函数跳转-CSDN博客https://blog.csdn.net/ballack_linux/article/details/71036072不过针对cuda程序…

【Android】 四大组件详解之广播接收器、内容提供器

目录 前言广播机制简介系统广播动态注册实现监听网络变化静态注册实现开机自启动 自定义广播发送标准广播发送有序广播 本地广播 内容提供器简介运行时权限访问其他程序中的数据ContentResolver的基本用法读取系统联系人 创建自己的内容提供器创建内容提供器的步骤 跨程序数据共…

数据仓库是什么

写在前面 刚接触大数据的新手小白可能会对数据仓库这个词比较陌生&#xff0c;本文将介绍数据仓库的主要特征及OLTP&OLAP的区别&#xff0c;帮助读者更好理解数据仓库。 一、什么是数据仓库 数据仓库&#xff0c;简称数仓&#xff0c;是一个对数据进行加工&#xff0c;集…

【go零基础】go-zero从零基础学习到实战教程 - 0环境配置

是个前端&#xff0c;最近开始学习go&#xff0c;后端除node外基本0基础&#xff0c;所以学习曲线有点绕&#xff0c;目标是个基础的服务端demo&#xff0c;搞个api服务后台&#xff0c;包含基础的用户登录、文章发布和写文章、权限控制&#xff0c;差不多就是个完整博客系统。…

CentOS 9 (stream) 安装 nginx

1.我们直接使用安装命令 dnf install nginx 2.安装完成后启动nginx服务 # 启动 systemctl start nginx # 设置开机自启动 systemctl enable nginx# 重启 systemctl restart nginx# 查看状态 systemctl status nginx# 停止服务 systemctl stop nginx 3.查看版本确认安装成功…

Apollo 7周年大会自动驾驶生态利剑出鞘

前言 4月22日&#xff0c;百度Apollo在北京车展前夕举办了以“破晓•拥抱智变时刻”为主题的智能汽车产品发布会&#xff0c;围绕汽车智能化&#xff0c;发布了智驾、智舱、智图等全新升级的“驾舱图”系列产品。 1、7周年大会 自2013年百度开始布局自动驾驶&#xff0c;201…
最新文章