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:顶点越多,性能越慢

    我正在开发一个程序的一部分 其中给定 xyz 坐标集合 制作 3D 模型 我已经完成了这张图片所需的所有功能 即平移 旋转 缩放 但是给出的 xyz 坐标越多 程序运行速度就越慢 我的程序在处理 29 000 个坐标时运行得非常流畅 但当我
  • LibGDX纹理混合与OpenGL混合功能

    在 libGdx 中 我试图创建一个成形纹理 采用完全可见的矩形纹理并将其遮罩以获得成形纹理 如下所示 在这里我在矩形上测试它 但我想在任何形状上使用它 我调查过本教程 http www learnopengles com tag addi
  • OpenGL 使用着色器将 NV12 转换为 RGB24

    我尝试编写一个应用程序来在 OpenGL 中显示 YUV 图像 我使用此代码片段在 C 中成功将 Y UV 转换为 RGB source https blog csdn net subfate article details 4730514
  • 在 OpenGL 中使用不同的着色器程序?

    我必须在 OpenGL 中针对不同的对象使用两个不同的着色器程序 我发现我必须使用glUseProgram 在不同的着色器程序之间切换 但对此没有太多信息 鉴于我有两个用于不同对象的不同着色器程序 如何为每个着色器程序生成和绑定 VAO 和
  • 使用 glGetFloatv 检索 pyglet 中的模型视图矩阵

    我正在使用 pyglet 在 python 中进行 3D 可视化 并且需要检索模型视图和投影矩阵来进行一些选择 我使用以下方式定义我的窗口 from pyglet gl import from pyglet window import wi
  • OpenGL:VAO 和 VBO 对于大型多边形渲染任务是否实用?

    如果您想渲染一次在视锥体中包含数千个多边形的大型景观 并且用户的视点不断变化 那么使用 VAO 或 VBO 是否实用 我的意思是 每次玩家的位置或摄像机旋转发生变化时 您都必须重新计算顶点数据 以便正确剔除不再可见的任何顶点或场景 以保持良
  • 延迟阴影映射 GLSL

    我目前正在实施延迟渲染管道 但我仍坚持使用阴影贴图 我已经成功地将其实施到前向管道中 我所做的步骤是 获取灯光视图中的位置 转换为光视图剪辑空间 使用 0 5 0 5 获取阴影纹理坐标 检查深度 编辑 使用新结果图像更新代码 float c
  • 如何在多采样纹理上渲染帧缓冲区对象?

    我目前有一个使用多个通道的渲染引擎 其中图像的各个部分在纹理上渲染 然后使用着色器进行组合 它有效 现在我想激活多重采样 我在这里读到 http www opengl org wiki Framebuffer Object Examples
  • Qt 5.5 QOpenGLWidget 链接错误未链接任何 openGL 调用

    我尝试使用 Qt 5 5 1 构建一个简单的 OpenGL 应用程序 一切都很好 直到我尝试使用 glClearColor 等 openGL 本机函数调用 该小部件实际上编译并产生黑屏 但在我尝试使用任何 openGL 本机函数后 它甚至不
  • WGL:没有双缓冲 + 多重采样 = 失败?

    我通常使用创建像素格式wglChoosePixelFormatARB 与这些论点 除其他外 WGL DOUBLE BUFFER ARB GL TRUE WGL SAMPLE BUFFERS ARB GL TRUE WGL SAMPLES A
  • OpenGL纹理渲染与原始不匹配

    我正在尝试使用 OpenGL 渲染纹理 我用作测试的纹理是白色背景上的一堆黑色矩形 如下所示 然而 在渲染时 纹理似乎被复制并叠加在其自身之上多次 我使用以下方法设置场景 std string vertexSource ShaderLoad
  • 如何在片段着色器中将 gl_FragCoord 转换为世界空间点?

    我的理解是 如果您有视图投影矩阵 屏幕宽度和屏幕高度的逆矩阵 则可以将 gl FragCoord 转换为片段着色器中世界坐标中的点 首先 你转换gl FragCoord x and gl FragCoord y通过分别除以宽度和高度 然后将
  • 为贝塞尔曲线中的每个点绘制切线

    我设法绘制了一条贝塞尔曲线 如下所示 glColor3f 0 1 0 glBegin GL LINE STRIP for int i 3 i lt nPt i 3 glColor3f 0 0 0 for float k 0 k lt NLI
  • 如何创建自己的 openGL 上下文并将其绑定到 GLCanvas?

    所以当我开始掌握java时 paint Graphics g 我继续创建自己的渲染方法 但我必须了解缓冲区策略以及如何 获取 图形 所以现在我在学习openGL 我必须掌握方法 Override public void display GL
  • SDL 程序中颜色关闭

    我目前正在开发一个非常简单的游戏 使用纯 C 方法和 SDL 及其官方额外库 如 SDL image 和 OpenGL 现在 虽然我遇到了一些障碍 但我不知道为什么要这样做 绘制时颜色全部关闭 我目前在 Mac 上运行该程序 但如果我没记错
  • 开启TK onRenderFrame和onUpdateFrame的区别?

    我目前正在使用 OpenTK 框架和 OpenGL 用 C 编写 Jump n Run 游戏 Open TK 提供预设功能 例如GameWindow Run or GameWindow onUpdateFrame onRenderFrame
  • glTranslatef 不在 glBegin .. glEnd 中工作

    我正在尝试并排绘制不同颜色的两个方块 我的问题是我无法让 glTranslatef 将第二个方块向右移动 第二个方块只是绘制在第一个方块上 void display void glClear GL COLOR BUFFER BIT glMa
  • 如何在 R 中导入并绘制三角形网格?

    我想在 R 中绘制我的模型输出 它是格式为的三角形网格 x1 y1 z1 x2 y2 z2 x3 y3 z3 value 每行代表一个三角形 我想用以下方法绘制这些三角形value作为规模 mymesh lt structure c 0 9
  • 计算着色器中的 Image2D

    我想使用 image2D 作为顶点的 2D 存储 该顶点将由计算着色器修改 但不起作用 创建纹理 glGenTextures 1 HeightMap glBindTexture GL TEXTURE 2D HeightMap glTexIm
  • Libgdx SpriteBatch.draw() 指定 4 个顶点

    我正在使用 libGdx 创建一个 2d 游戏 并尝试使用这个特殊的方法来绘制一个简单的 2d 纹理 分别指定 4 个顶点 draw Texture texture float spriteVertices int offset int l

随机推荐

  • 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这三种属性是光源和材质所共有的 如