向场景中添加光照

向场景中添加光照的4个步骤:

1)为每个物体的每个顶点计算法向量,法线确定了物体相对于光源的指向

法线的计算:设向量a(x1,y1,z1),向量b(x2,y2,z2)

a×b=(x2·y3-x3·y2,x3·y1-x1·y3,x1·y2-x2·y1)

2)创建、选择并定位所有的光源

光源的创建:

glLight*()函数可以定义光的一些属性——颜色、位置、方向

定义光时,此族函数最长用的一种形式是:

void glLightfv(Glenum light,Glenum pname,TYPE* param)

此函数中三个参数:所要为其指定属性的光、所要指定的属性、此属性的值

参数light的值可以是GL_LIGHT0~GL_LIGHT7,指定了要对那个光进行设置

参数所定义的属性或特性如下表所示:

param是一个浮点型数组,例如:

float ambientLight[]={ 1.0f, 1.0f, 1.0f, 1.0f };

glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight);

此处定义了一个具有亮白的环境光分量的光源

注意:在指定一个环境光属性时,同时也指定了此光在此场景中所添加的环境光RGBA的强度,

默认条件下是没有环境光的,其默认值为(0.0f,0.0f,0.0f,1.0f);

光源的定位:

光源的位置是以GL_POSITION和一个四个值的矢量(x,y,z,w)来定义的。

如果w的值为0.0,那么(x,y,z)的值就定义了一个矢量,其指定了光线照过来的方向,

且所有的光线都是平行的,就好像光源处于无穷远处。

如果w的值为非零,所定义的就是一个定点光源

例如:float lightPosition[]={0.0f,0.0f.0.0f,1.0f};

glLghtfv(GL_LIGHT0,GL_POSITION,lightPosition);

定义了一个位于世界坐标原点的定点光源。

而对于光的衰减、光柱的张角、聚光灯的焦点的设置,我们常用glLightf()函数

glLightf(GL_LIGHT0,GL_CONSTANT_ATTENUATION,4.0)//光的衰减

glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,15.0f);//30°光柱张角

glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,10.0F);//指定聚光灯的焦点

3)创建并选择一种光照模型。光照模型定义了环境光,并设置用于光照计算的视点的位置

OpenGL的光照模型允许设置四个影响场景的因素

  • 场景的环境光强度
  • 视点是否处于无穷远(影响镜面发射光反射角的计算)
  • 单面光照还是双面光照
  • 镜面反射的颜色是否与环境光颜色和反射光颜色分离

可以使用glLightModel*()函数来定义光照模型

void glLightModel[if](GLenum pname,TYPE param);

void glLightModel[if]v(GLenum pname,TYPE param);

例如:将全局环境光设置为中等亮度的白光

float ambienLighttModel[]={0.5f,0.5f,0.5f,1.0f};

glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambientLightModel);

4)为场景中的物体定义材质属性

实质上与创建光源相似,只是使用的函数不同

void glMaterialf(GLenum face,GLenum pname,TYPE param);

void glMaterialfv(GLenum face,GLenum pname,TYPE* param);

face 的值可以是GL_FRONT,GL_BACK,GL_FRONT_AND_BACK

pname通知OPENGL要设置材质的哪一属性,下表列出了可能值

例如:给多边形正、背面材质的环境光颜色设置为红色

float red[]={1.0f,0.0f,0.0f,1.0f};

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,red);

在结束之前,送大家一句话(和大家共勉):

——表面繁荣未必是好事,抛开表象看实质才是人生真谛

向场景中添加光照

时间: 2024-10-23 20:55:23

向场景中添加光照的相关文章

向场景中加入光照

向场景中加入光照的4个步骤: 1)为每一个物体的每一个顶点计算法向量,法线确定了物体相对于光源的指向 法线的计算:设向量a(x1,y1,z1).向量b(x2,y2,z2) 则a×b=(x2·y3-x3·y2,x3·y1-x1·y3,x1·y2-x2·y1) 2)创建.选择并定位全部的光源 光源的创建: glLight*()函数能够定义光的一些属性--颜色.位置.方向 定义光时.此族函数最长用的一种形式是: void glLightfv(Glenum light,Glenum pname,TYPE

LoadRunner测试场景中添加负载生成器

如何在LoadRunner测试场景中添加负载生成器 本文对如何在LoadRunner的测试场景中添加负载生成器,如何使用负载生成器的方法,总结形成操作指导手册,以指导测试人员指导开展相关工作. 1.什么是测试场景 测试场景是将测试需求结合测试用例进行转化后,用来承载实现测试用例测试目标的测试脚本的容器,对这个容器,我们可以定义出容器的规格,这个有了规格的容器的执行,就相当于测试需求被覆盖. 在LoadRunner中,测试场景在Controller中管理,一般一个场景打开后的界面如下图: 图一:场

Opengl场景中加光照包含几个步骤

http://zuoye.baidu.com/question/44e2a82d7ad5c0e1d33ddb9a40e0bf86.html  Opengl场景中加光照包含几个步骤,各个步骤实现用的函数是什么?这两个问题回答清楚就行了,不用说别的.粘贴的一律无视. 小白小菜0026 2014-10-10 优质解答下载作业帮App,拍照秒答 主要分三步:设置光源参数 .开启光照.设置法线信息. 1.设置光源参数.通过多次调用带有不同参数的glLightfv()函数来实现.一般会设置环境光(Ambie

用Physijs在场景中添加物理效果

1.创建可用Physijs的基本Three.js场景 创建一个可用Physijs的Three.js场景非常简单,只要几个步骤即可.首先我们要包含正确的文件, 需要引入physi.js文件.实际模拟物理场景时非常耗费CPU的,如果我么能在render线程中做的话,场景的帧频会受到严重的影响.为了弥补这一点,Physijs选择在后台线程中执行计算.这里的后台是有Web workers(网页线程)规范定义的额,现在大多数浏览器都实现了该功能. 对Physijs来说也就意味着我们需要配置一个带有执行任务

Loadrunner:场景中添加负载生成器

场景中添加负载生成器: (1)远程机子(假设ip为192.168.134.23)开启负载生成器 开始菜单找到:LoadRunner Agent Process 开启后任务栏会显示如下图: (2)场景中工具栏点击[负载生成器/Load Generators]按钮 (3)负载生成器窗口点击[Add],进入增加页面 Name:添加计算机名称(如:loaclhost或ip) Platform:计算机的平台 Temporary directory:为临时目录, 最下面一行为:允许负载生成器参与到场景中 点

场景中添加图层

一:GameScene中添加一个Layer图层 1:GameScene.h中定义两个结点 cocos2d::Node *rootNode; cocos2d::Node *BL_rootNode; 2:GameScene.cpp的init函数中添加两结点 //获取visibleSize visibleSize=Director::getInstance()->getWinSize(); //rootNode获取添加 rootNode = CSLoader::createNode("GameS

OSG项目经验2<在场景中添加文字面版>

添加文字版需要用到osg的三个名字空间: osgText::Text,这个类用来添加文字和设置文字的一些属性: osg::Geometry,这个类用来画常见的图形: osg/ShapeDrawable,通过这个类也可以画一些常见的图形,并且可以吧Geometry加进osg::Geode节点中: 下面先简要介绍一下这三个命名空间: 1.osgText::Text:见http://www.cnblogs.com/xiaocainiao2hao/p/4544273.html 2.OSG::Gemote

Loadrunner在场景中添加多个负载机报错:Action.c(38): Error -26488: Could not obtain information about submitted解决方法

Error -26488: Could not obtain information about submitted file "E:\.jpg": _stat32 rc=-1, errno=2 [No such file or directory]. Using an empty file 解决方法: 1.先执行一次场景,让其报错,主要是为了创建完整的C:\Users\Administrator\AppData\Local\Temp\brr_WJy.395目录下的子目录和文件 2.在

Loadrunner在场景中添加多个负载机报错:Action.c(38): Error -26488

Error -26488: Could not obtain information about submitted file "E:.jpg": _stat32 rc=-1, errno=2 [No such file or directory]. Using an empty file解决方法: 1.先执行一次场景,让其报错,主要是为了创建完整的C:\Users\Administrator\AppData\Local\Temp\brr_WJy.395目录下的子目录和文件2.在192