OpenGL-渲染光照球体

2023-10-26

3.光照

注意:

a. OpenGL至少会支持8个光源,即GL_LIGHT0到GL_LIGHT7。但是开启过多的光源会导致程序运行速度下降。

b. GL_AMBIENT、GL_DIFFUSE、GL_SPECULAR这三种属性是光源和材质所共有的,如果某光源发出的光线照射到某材质的表面,则最终的漫反射强度由两个GL_DIFFUSE属性共同决定,最终的镜面反射强度由两个GL_SPECULAR属性共同决定。

三步走:

2.1 设置光照模型:glLightModelfv();//指定全局环境光,物体才能基本可见,否则就是一片黑色

GLfloat lmodel_ambient[]={0.2,0.2,0.2,1.0};//微弱环境光,使物体可见
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient); //指定全局的环境光,物体才能可见

2.2 glLight*();//设置光源属性:位置、颜色、散射、镜面、

GLfloat light_position[]={1.0,1.0,1.0,0.0};//1.0表示光源为点坐标x,y,z
GLfloat white_light[]={1.0,1.0,1.0,1.0};    //光源的颜色
glLightfv(GL_LIGHT0,GL_POSITION,light_position);//光源编号-7,光源特性,参数数据
glLightfv(GL_LIGHT0,GL_DIFFUSE,white_light);  glLightfv(GL_LIGHT0,GL_SPECULAR,white_light);

2.3 glMaterial*();//设置材质的属性:镜面、强度、

GLfloat mat_specular[]={1.0,1.0,1.0,1.0};
GLfloat mat_shininess[]={128.0};
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);//指定当前材质属性 镜面反射颜色
glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);//镜面反射指数

注意:除了采用glMaterial设置材质以外,还可以使用glColorMaterial(GLenum face, GLenum mode)设置材质属性;

face的取值: GL_FRONT 、GL_BACK、GL_FRONT_AND_BACK 
mode的取值: GL_AMBIENT 、GL_DIFFUSE、 GL_AMBIENT_AND_DIFFUSE 、GL_SPECULAR GL_EMISSION、

在想要使用这个函数时,要启用glEnable(GL_COLOR_MATERIAL)函数。 
在绘图时使用glColor*()来实时改变材质颜色,或用glMaterial()来实时改变材质成分 
使用完毕,要用glDisable(GL_COLOR_MATERIAL)来关闭这种材质模式。

例如: 
glColorMaterial(GL_FRONT,GL_DIFFUSE); 
glEnable(GL_COLOR_MATERIAL);
 

glColor3f(0.3,0.5,0.7);
 
//
画一些物体: 
...
 
glColor3f(0.0,1.0,0.0);
 
//
再画另一些物体: 
...
 
glDisable(GL_COLOR_MATERIAL);
 

说明: 
当需要改变场景中大部分的单个材质时,最好调用glColorMaterial() 
当修改不只一个材质参数,最好调用glMaterial*()

代码实例如下:

void init()
{
	//光源light0
	GLfloat mat_specular[]={1.0,1.0,1.0,1.0};
	GLfloat mat_shininess[]={128.0};

	GLfloat light_position[]={1.0,1.0,1.0,0.0};//1.0表示光源为点坐标x,y,z
	GLfloat white_light[]={1.0,1.0,1.0,1.0};   //光源的颜色
	GLfloat lmodel_ambient[]={0.2,0.2,0.2,1.0};//微弱环境光,使物体可见
	glClearColor(0.0,0.0,0.0,1.0);
	glShadeModel(GL_SMOOTH);//GL_SMOOTH

	//glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
	glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);//指定当前材质属性 镜面反射颜色
	glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess); //镜面反射指数

	glLightfv(GL_LIGHT0,GL_POSITION,light_position);//光源编号-7,光源特性,参数数据
	glLightfv(GL_LIGHT0,GL_DIFFUSE,white_light);  
	glLightfv(GL_LIGHT0,GL_SPECULAR,white_light); 
	glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient); //指定全局的环境光,物体才能可见//*/

	glEnable(GL_LIGHTING);  
	glEnable(GL_LIGHT0); 
	glEnable(GL_DEPTH_TEST);  
}
void display()
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glutSolidSphere(1.0,300,16);//半径,南北经线,纬线
	glFlush();
}
void reshape(int w,int h)
{
	glViewport(0,0,(GLsizei)w,(GLsizei)h);//使像素矩阵占据整个新窗口
	glMatrixMode(GL_PROJECTION);//设置当前矩阵为投影矩阵
	glLoadIdentity();

	float nowRange = 1.5;
	GLfloat nRange =(GLfloat)nowRange;

	if (w <= h) //改变窗口大小,图形形状不变
		glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w,-nRange, nRange);
	else 
		glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange);

	glMatrixMode(GL_MODELVIEW);//模型矩阵,告诉我们当前矩阵
	glLoadIdentity();
}

实例图片:


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenGL-渲染光照球体 的相关文章

  • openGL转png

    我正在尝试将包含大量纹理 没有移动 的 openGL 编辑 我画的卡片 thx unwind 转换为一个 PNG 文件 我可以在框架的另一部分中使用该文件我正在与 有 C 库可以做到这一点吗 thanks 如果您的意思只是 获取由 Open
  • lwjgl 3 , glUniformMatrix4 导致 jre 崩溃

    我正在使用 lwjgl 3 并学习现代 opengl 3 我想将统一矩阵发送到顶点着色器 以便我可以应用转换 我尝试过 但程序因此错误而崩溃 A fatal error has been detected by the Java Runti
  • lnk1104:无法打开“LIBC.lib”链接

    使用 GLee 将着色器写入我的 OpenGL 项目并编译后 我收到了错误LNK1104 cannot open file LIBC lib 我尝试按照其他人的建议添加它并忽略它 但没有解决问题 有没有其他方法可以解决我错过的这个问题 以下
  • 为什么 OpenGL 给对象提供句柄而不是指针?

    OpenGL 的传统是让用户使用 unsigned int 句柄来操作 OpenGL 对象 为什么不直接给出一个指针呢 与指针相比 唯一 ID 有何优点 TL DR OpenGL ID 不会双射映射到内存位置 单个 OpenGL ID 可能
  • OpenGL 与 Eclipse CDT + MinGW + GLEW + GLFW:未定义的参考

    Edit 与此同时 我已经弄清楚了这一点 并在下面写了详细的答案 我刚刚尝试在 Win7 上从 Express 版本的 MSVC 10 切换到 Eclipse CDT 在配置时遇到了以下简单 OpenGL 代码的问题 在 Visual St
  • 使用 OpenGL 着色器进行数学计算 (C++)

    我有一个矩阵 例如 100x100 尺寸 我需要对每个元素进行计算 matrix i j tt 8 5例如 我有一个巨大的矩阵 我想使用 OpenGL 着色器来实现该算法 我想使用着色器 例如 uniform float val unifo
  • 使用 C# 截取任何外部应用程序的屏幕截图

    我们有一个 C WPF 应用程序 我们想要在其中截取我们启动的任意应用程序的屏幕截图 即 我们可以引用我们启动的进程 应用程序可能已最小化或位于其他窗口后面 但我们仍然只需要单个应用程序的图像 而不是重叠像素 我知道使用 BitBlt 或的
  • GL_CULL_FACE使所有对象消失

    我正在尝试在 openGL3 3 中创建一些简单的多边形 我有两种类型的对象 具有以下属性 对象 1 10 个顶点 按顺序在下面列出 存储在GL ARRAY BUFFER并使用GL TRIANGLE FAN v x y z w v 0 0
  • GLSL NVidia 方形神器

    当 GLSL 着色器在以下 GPU 上生成不正确的图像时 我遇到了问题 GT 430 GT 770 GTX 570显卡760 但在这些上正常工作 英特尔高清显卡 2500英特尔高清4000英特尔4400显卡740MRadeon HD 631
  • OpenGL缓冲区更新[重复]

    这个问题在这里已经有答案了 目前我正在编写一个模拟水的程序 以下是我所做的步骤 创建水面 平面 创建VAO 创建顶点缓冲区对象 在其中存储法线和顶点 将指针绑定到此 VBO 创建索引缓冲区对象 然后我使用 glDrawElements 渲染
  • 三角形纹理映射OpenGL

    我正在开发一个使用 Marching Cubes 算法并将数据更改为 3D 模型的项目 现在我想在 OpenGL 中为我的 3D 模型使用纹理映射 我首先尝试了一个简单的示例 它将图片映射到三角形上 这是我的代码 int DrawGLSce
  • 在 OpenGL 中只使用纹理的 Alpha 通道?

    嘿 我正在尝试将恒定颜色绘制到帧缓冲区 并使用 RGBA 纹理中的 Alpha 通道将其混合 我一直在研究 glBlendFunc 和 glBlendColor 但似乎无法找到忽略纹理中的 RGB 值的方法 我想我必须自己提取 alpha
  • glDrawElements 只绘制半个四边形

    这是我的功能 void Object draw2 if mIsInitialised return Tell OpenGL about our vertex and normal data glEnableClientState GL VE
  • 编译 GLUI 库,VS2010 给我一个奇怪的命名空间错误

    我有一个针对我所在班级的 OpenGL 项目 它基于 GLUI 提供的 GLUI 库无法工作 这就是我尝试自己编译它的原因 因此 我从 SourceForge 下载了源代码并尝试编译 glui 库 它给了我这个 但我找不到任何相关信息 1
  • 如何在不使用 Kinect SDK 函数的情况下将深度空间中的点转换为 Kinect 中的颜色空间?

    我正在做一个增强现实应用程序 将 3D 对象叠加在用户的彩色视频之上 使用 Kinect 1 7 版本 虚拟对象的渲染在 OpenGL 中完成 我已经成功地在深度视频上叠加了 3D 对象 只需使用 NuiSensor h 标头中深度相机的固
  • 如何从横滚、俯仰和偏航获取相机向上矢量?

    我需要从滚动角 俯仰角和偏航角 以度为单位 获取相机的向上矢量 以获得正确的外观 我已经尝试了几个小时不同的事情 但没有运气 这里的任何帮助将不胜感激 横滚 俯仰和偏航定义 3 轴旋转 从这些角度 您可以构建一个 3x3 变换矩阵来表达该旋
  • 为什么 OpenGL 有远裁剪平面,以及使用什么惯用法来处理这个问题?

    我一直在学习 OpenGL 持续困扰我的一个话题是远裁剪平面 虽然我可以理解近剪裁平面和侧剪裁平面 它们永远不会产生任何实际效果 因为它们之外的对象无论如何都不会被渲染 背后的推理 但远剪裁平面似乎只是一个烦恼 由于 OpenGL 背后的人
  • 为什么 glClear 不清除我的屏幕?

    这是我编写的一个简单的 opengl 程序 我试图在绘制三角形之前清除屏幕 我在 init 函数中调用了 glClear 但是 它似乎无法清除屏幕 include
  • 如何使用现代 OpenGL 在透视投影中绘制对象的正交轴? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有带有透视投影的 3D 场景 我还可以选择场景中的一个对象 我需要为选定的对象绘制轴 问题是轴不会在透视投影中保存其大小 如果物体远离眼睛
  • 在 QML 中控制纹理 3D 对象的不透明度

    我对 QML 中的 Qt 3D 有点陌生 我正在尝试控制 Qt 3D 的不透明度textured3D 对象 我正在使用简单qml3d https github com tripolskypetr simpleqml3d测试项目来做到这一点

随机推荐

  • Qt5开发工具---常用Qt5开发工具(附下载地址)

    文章目录 一 简述 二 Qt界面开发工具 1 QT设计师 三 Qss控件美化工具 1 QSS Editor 2 Qss Stylesheet Editor 3 qtawesome icon broswer 四 官方文档 1 Qt官方文档 2
  • react如何实现数据渲染

    React数据渲染是指将组件中的数据映射到页面上 以展示出来 在React中 数据渲染通常是通过JSX和组件的state或props完成的 JSX是一个类似HTML的语法 可以在其中嵌入JavaScript表达式 在JSX中 可以使用 包裹
  • 关于数据库意向锁与封锁粒度若干问

    我们所说的加锁是谁对谁加锁 是事务T对某个封锁对象加锁 封锁对象的大小被称为封锁的粒度 这个对象可以是数据库 关系 也可以是元组 为什么要引入多粒度锁协议 封锁粒度大 系统被封锁的对象越少 并发度越小 系统开销越小 封锁粒度越小 系统被封锁
  • DB2:”因为未能分配专用虚拟内存,所以请求失败“错误的解决方法

    是在创建数据库的时候遇到的这个问题 解决方法作个记录 SQL1219N 因为未能分配专用虚拟内存 所以请求失败 SQLSTATE 57011 解决方法 1 DOS命令行中执行 db2set DB2 EXTSECURITY NO 2 重启DB
  • feign在DTO传参时GET请求自动转成POST请求

    文章目录 场景 解决 场景 1 网关请求发送到后端从GET变成了POST 2 代码如下 使用openfeign发请求时 发现GET请求转成了POST FeignClient name pd auth server fallback Reso
  • Java 程序员必须了解的 7 个性能指标

    来源 王韵菲 www evget com article 2015 11 16 22990 html 本文中 小编搜集了7个最有影响的衡量标注 让你可以不依赖日志文件来了解应用程序 现在 让我们看看这些性能指标 并了解如何查看并收集它们 1
  • linux 服务器搭建 elasticsearch(一)

    1 安装java jdk 环境 查看可安装版本 yum y list java 选择一个java版本进行安装 这里我们希望安装java1 8 因为我们的机器是64位的 所以选择安装java 1 8 0 openjdk devel x86 6
  • Linux编程复习(3)——信号与中断

    信号是响应某些状况而产生的事件 进程在接收到信号时会采取相应的行动 某些状况就是指某些条件错误 如内存段冲突 浮点处理器错误或者非法指令等 信号是在软件层次上对中断的一种模拟 所以信号也称为是软中断 信号与中断的相似点 1 都采用相同的额异
  • OpencvX.X中Mat与IplImage类型的相互转换

    1 Opencv4 x中Mat与IplImage的转换 1 Mat转IPLImage IplImage img cvIplImage mat 2 IplImage转Mat Mat cvarrToMat const CvArr arr boo
  • 从异步调用返回响应:多语言指南

    Asynchronous调用是现代编程的基础 可以有效地处理可能需要时间的任务 例如网络请求或文件操作 然而 response从这些asynchronous电话中获取信息可能会让新手感到困惑 在本指南中 我们将探讨如何从不同编程语言的异步调
  • 4款堪称神器的电脑黑科技软件,让人相见恨晚

    Syncthing 一款免费的开源跨平台文件同步客户端 服务器工具 支持Linux Windows OSX FreeBSD以及Solaris等系统 具有一个强大的响应式的网页管理界面 能够帮助用户简便地添加 删除和管理通过网络进行同步的文件
  • TX2上如何查看cuda版本

    如果知道安装的路径 一般都是在local下 可以直接查看 nvidia tegra ubuntu cat usr local cuda version txt CUDA Version 9 0 252 能看到机器上的CUDA版本是9 0 2
  • 国家级、省、市专精特新申报条件汇总

    国家级专精特新硬性条件 1 企业成立3年及以上 2 企业从业人员1000人以下或营业收入40000万元以下 3 已认定为省级专精特新 不硬性规定 有优先推荐权 4 截至上年末的近2 年主营业务收入或净利润的平均增长率达到5 以上 企业资产负
  • 构建方便安全的HttpClient工具类

    构建方便安全的HttpClient工具类 前言 开始 引入核心依赖 其它依赖 封装工具类 1 UrlEntity 2 HttpClientException 3 IoUtil 4 UrlUtil 5 SingletonUtil 开始构建 6
  • C语言—随机种子的设定

    计算是CPU和内存进行交互 运算是很快的 打印时CPU 内存和显示器进行交互 运算较慢 计算机在访问输入输出设备的时候 运算速度会大大降低 1 计算 n 的阶乘 int factor int n int result 1 for int i
  • 从gitHub当中更新项目synchronize Update fetch pull 项目的区别

    从gitHub更新项目 马克 to win 马克 java社区 防盗版实名手机尾号 73203 马克 to win 方法一 右击你的项目 team synchronize workspace 这样他就会去gitHub那fetch回最新的版本
  • iOS View Controller 全屏布局

    iOS View Controller 全屏布局 2014 09 08 自 iOS 7 以后苹果开始默认对 View Controller 采用全屏布局 全屏布局的意思就是 View Controller 的 layout 是填满整个屏幕的
  • MySQL——在Linux环境下安装(在线安装)

    MySQL的安装 在线安装 mysql的安装并不是比赛的内容 所以我们用比较方便的在线安装的方法 比起安装 我们更要知道如何去使用 首先看一下自己有没有安装MySQL的服务 或者自己的服务器上有没有自带的MySQL服务 rpe ga gre
  • Adapter理解

    这里也算回顾做Android开发时候遇到的一个问题吧 当时对Android中适配器的使用不是很了解 也不知道每一种适配器的局限性和用法 用的时候出现很多异 所以 适配器就我自己来看 我觉得这是一个非常重要的知识点 Adapter是用来帮助填
  • OpenGL-渲染光照球体

    3 光照 注意 a OpenGL至少会支持8个光源 即GL LIGHT0到GL LIGHT7 但是开启过多的光源会导致程序运行速度下降 b GL AMBIENT GL DIFFUSE GL SPECULAR这三种属性是光源和材质所共有的 如