向场景中加入光照

本文详细介绍了在OpenGL中实现光照效果的四个关键步骤:计算法向量、创建光源、定义光照模型及设置材质属性,并提供了具体代码示例。

向场景中加入光照的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);


分享一下旋转灯光的小程序:     下载

程序执行环境:vs2013+OpenGL


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

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


### 如何在 Unity 2D 场景中实现和调整 Point Light 点光源 #### 创建并添加点光源到场景 为了向2D游戏项目引入点光源,需先创建一个新的`Point Light`对象。这可以通过右键点击Hierarchy窗口中的空白处,选择`Light > Point Light`完成操作[^2]。 #### 配置点光源属性 一旦点光源被加入场景内,则可通过Inspector面板对其进行一系列自定义配置: - **Color**: 设置光的颜色,通过改变RGB值可获得不同色彩的光照效果。 - **Intensity (强度)**: 控制光线亮度,默认情况下该数值设为1;增大此参数会使光照更加明亮[^3]。 - **Range(范围)**: 定义了从中心位置向外辐射的最大距离,在超出这个界限之后物体将不再受到当前光源的影响[^4]。 对于特定于2D项目的设置还包括启用`2D Mode`选项,这样能确保光源仅作用于同一平面内的物件之上而不干扰其他维度的对象[^1]。 #### Alpha Blend on Overlap 特性应用 当多个光源相互交叠时,“Alpha Blend On Overlap”的特性允许这些区域呈现出柔和过渡而非简单的叠加效应。如果希望某些部分呈现较暗淡却依然可见的状态,可以适当降低光源强度来达到预期视觉表现。 ```csharp // C#脚本示例:动态修改点光源属性 using UnityEngine; public class AdjustPointLight : MonoBehaviour { public float lightIntensity = 0.8f; private void Start() { GetComponent<Light>().intensity = lightIntensity; // 调整光源强度 GetComponent<Light>().range = 5f; // 设定照射半径大小 GetComponent<Light>().color = Color.yellow; // 更改发光颜色为黄色 GetComponent<Light>().enabled = true; // 启用或禁用光源组件 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值