一个模型受光照后最终呈现的颜色,由三种因素决定:光的种类、物体表面的材质

对以上三种影响因素进行分类:常见的光被分为4种、物体表面的材质通常受3种因素影响(漫反射、镜面反射、表面纹理)。

光的定义有很多参数可以调整,而且一个三维场景中还可以放入很多种类的光、影响材质的漫反射和镜面反射也有很多参数可以调整。所以,最终呈现出的效果是可以有很多种情况的。

4种常见光分别为:

  • 环境光:影响因素为强度颜色。这种类型的光源来自空间中的任何地方,并以相同的方式照亮所有物体。
  • 点光源:影响因素为强度颜色位置衰减因素
  • 聚光灯:影响因素为强度颜色位置衰减因素方向夹角。(聚光灯就是在点光源的基础之上加上了方向和夹角的概念)
  • 方向光:影响因素为颜色方向强度

下面基于joml(Java OpenGL Math Library)对上面的光进行抽象:

在对各种光进行抽象时,有一些属性被定义为向量,有一些属性被定义为float类型的常数,是由于光的数学定义。

  • 光的数学定义可以参考这篇文章
    WebGL笔记(二)_光

  • 关于这些光是如何结合模型顶点和法向量在着色器中进行计算的,参考这篇文章OpenGL中环境光、漫反射、镜面反射对光线的影响

环境光

环境光就是一个三维的向量Vector3f类型的变量,可以直接传给着色器程序。

点光源

public class PointLight {//点光源的颜色private Vector3f color;//点光源的位置private Vector3f position;//点光源的强度private float intensity;//点光源的衰减private Attenuation attenuation;}//点光源的定义里面提到的光衰减定义:这个对象的三个系数,只是为了着色器中在计算衰减时更加方便和灵活。
//这三个参数完全可以抽象为一个系数,只要着色器算出的最终颜色上乘以该系数即可。
//这只是大多数情况下的光衰减定义。public static class Attenuation {//连续系数private float constant;//线性系数private float linear;//衰减系数private float exponent;}

聚光灯

由于聚光灯是基于点光源的基础上,所以聚光灯的定义可以将点光源作为自身的一个属性。


//聚光灯
public class SpotLight {//点光源private PointLight pointLight;//方向private Vector3f coneDirection;//锥形体的夹角private float cutOff;}

方向光

//方向光的定义
public class DirectionalLight {//颜色private Vector3f color;//方向private Vector3f direction;//强度private float intensity;}

光源汇总:

在一个三维场景中,前面提到的光源可以同时放在一个场景中、点光源和激光灯也可以被放入场景中很多次,所以可以对三维场景中的全部光源进行整体抽象。可以如下:

//场景内全部的光
public class SceneLight {//环境光private Vector3f ambientLight;//点光源数组private PointLight[] pointLightList;//聚光灯数组private SpotLight[] spotLightList;//方向光private DirectionalLight directionalLight;
}

材质(漫反射和镜面反射)


public class Material {//如果被环境光照射呈现的颜色private Vector4f ambientColour;//漫反射系数(4维向量)private Vector4f diffuseColour;//镜面反射系数(4维向量)private Vector4f specularColour;//反射率private float reflectance;//模型表面的纹理private Texture texture;}//材质对象中的纹理抽象Texture
public class Texture {//调用glGenTextures()函数返回的值private final int id;//纹理图片的宽度private final int width;//纹理图片的高度private final int height;
}

OpenGL的环境光、点光源、聚光灯、方向光、材质的定义。相关推荐

  1. opengl对三种光源(方向光,点光源,聚光灯)进行特写并分屏渲染

    分屏特写渲染效果图 实现原理 1,创建3个fbo 2,分别将方向光,点光源,聚光灯的照射效果渲染到fbo 3,在将渲染好的三个fbo作为纹理贴到要绘制的三个四边形上. 渲染入口 #include &l ...

  2. C++ opengl 方向光

    未有方向光的截图如下: 给模型加方向光后,截图如下: 关键源码如下: light.h #pragma once #include "ggl.h" class Light { pro ...

  3. OpenGL中环境光、漫反射、镜面反射对光的影响(如何被抽象成向量进行着色的)

    文章目录 Phong算法中影响光照的三个因素 环境光(Ambient)对光线的影响 漫反射(Diffuse)对光的影响 镜面反射(Specular)对光的影响 衰减(Attenuation) Phon ...

  4. three.js方向光DirectionalLight使用,调整方向光颜色、光源位置、光照强度、光照指向、是否可见、是否产生阴影属性(vue中使用three.js10)

    方向光DirectionalLight使用 一.方向光介绍 二.如何使用方向光 1.创建方向光 2.方向光的属性 2.1颜色-color 2.2是否可见-visible 2.3强度-intensity ...

  5. Unity Shader - Custom DirectionalLight ShadowMap 自定义方向光的ShadowMap

    文章目录 思路 实践 在方向光的位置,放一个正交相机 调整光源相机参数 将光源投影空间的正交视锥体画出来 投射阴影 接收阴影 改进 超出Shadow map的默认为光照 添加光照处理 添加PCF柔滑整 ...

  6. Ogre 光,材质与材质脚本

    Mage小组 著 Email: norman_chen@163.com  renwind@163.com QQ: 18725262 http://www.173d8.com http://blog.c ...

  7. 10.DirectionalLight(方向光)—— 模拟远处类似太阳的光源

    方向光光源和我们之前看过的聚光灯光源之间主要的差别是:方向光不像聚焦光那样离目标越远越暗淡.被方向光光源照亮的整个区域接收到的光强是一样的.

  8. OpenGL基础24:聚光灯

    前置:OpenGL基础23:平行光与点光源 一.聚光灯 三种基础光源在上一章讲了2种,现在只剩下聚光灯了 手电筒就是一个很经典例子,相对于点光源,聚光灯拥有以下特点 依然有衰减,但是聚光灯的光照一般都 ...

  9. OpenGL学习笔记(四)-光照-材质-光照贴图

    参考网址:LearnOpenGL 中文版 哔哩哔哩教程 第二章 光照 2.1 颜色 现实生活中人眼看到某一物体的颜色,是它所反射的颜色.如将白光照在红色的玩具上,玩具会吸收白光中除了红色以外的所有子颜 ...

  10. 【Unity Shader】聚光灯体积光效果的简单实现

    效果如下: Unity中的聚光灯SpotLight,可以用作手电筒,射灯等类似的效果,比如这样的 但是如果想把光束的效果做出来,就超出了SpotLight的能力范围了,本篇就为了记录一下一种简单的实现 ...

最新文章

  1. turtle文库 ——python
  2. 重磅!Nature子刊发布稳定学习观点论文:建立因果推理和机器学习的共识基础...
  3. 谋哥:App自推广这个概念就由我来创立了!
  4. Java 中,类、类对象、泛型之间的转换
  5. oracle 数据导入 数据和备注(comment)乱码问题解决办法
  6. ejb 2.1 jboss_JBoss AS7 JNDI和EJB 3.1命名更改
  7. python tkinter中的锚点(anchor)问题
  8. php 中 map和array,浅析php中array_map和array_walk的使用对比
  9. csdn积分c币获取方法
  10. 向日葵远程控制软件linux版安装
  11. 软件测试思想者 - 软件评测师考试顺利通关
  12. Origin绘图快速上手指南
  13. 华为静态路由配置实例
  14. Failed to prettify component
  15. C语言重难点知识梳理与常见题目/项目游戏解析
  16. codeforces 1183H
  17. 永远闪亮,网的眼睛 (转)
  18. Ryujinx - 基于 C# 开发的任天堂 Switch 模拟器
  19. 如何解决用户出差,脱域的问题
  20. linux aria2 参数,aria2常用命令

热门文章

  1. 可显示上拼音下汉字的 text 格式
  2. windows下安装apache
  3. linux中deb文件怎么安装,deb是什么文件?deb文件怎么安装?
  4. fastdb相关备忘
  5. layuiadmin开发文档
  6. 河南大学大计算机考研复试分数线预测,2017年河南大学考研复试分数线以及复试通知...
  7. 利用GDAL根据栅格影像DN值实现颜色渲染
  8. iOS应用内购基本步骤及问题
  9. 计算机兴趣小组活动总结,兴趣小组活动总结优秀范文
  10. Python函数必须先定义、后调用(函数调用函数例外)