OpenGL的环境光、点光源、聚光灯、方向光、材质的定义。
一个模型受光照后最终呈现的颜色,由三种因素决定:光的种类、物体表面的材质。
对以上三种影响因素进行分类:常见的光被分为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的环境光、点光源、聚光灯、方向光、材质的定义。相关推荐
- opengl对三种光源(方向光,点光源,聚光灯)进行特写并分屏渲染
分屏特写渲染效果图 实现原理 1,创建3个fbo 2,分别将方向光,点光源,聚光灯的照射效果渲染到fbo 3,在将渲染好的三个fbo作为纹理贴到要绘制的三个四边形上. 渲染入口 #include &l ...
- C++ opengl 方向光
未有方向光的截图如下: 给模型加方向光后,截图如下: 关键源码如下: light.h #pragma once #include "ggl.h" class Light { pro ...
- OpenGL中环境光、漫反射、镜面反射对光的影响(如何被抽象成向量进行着色的)
文章目录 Phong算法中影响光照的三个因素 环境光(Ambient)对光线的影响 漫反射(Diffuse)对光的影响 镜面反射(Specular)对光的影响 衰减(Attenuation) Phon ...
- three.js方向光DirectionalLight使用,调整方向光颜色、光源位置、光照强度、光照指向、是否可见、是否产生阴影属性(vue中使用three.js10)
方向光DirectionalLight使用 一.方向光介绍 二.如何使用方向光 1.创建方向光 2.方向光的属性 2.1颜色-color 2.2是否可见-visible 2.3强度-intensity ...
- Unity Shader - Custom DirectionalLight ShadowMap 自定义方向光的ShadowMap
文章目录 思路 实践 在方向光的位置,放一个正交相机 调整光源相机参数 将光源投影空间的正交视锥体画出来 投射阴影 接收阴影 改进 超出Shadow map的默认为光照 添加光照处理 添加PCF柔滑整 ...
- Ogre 光,材质与材质脚本
Mage小组 著 Email: norman_chen@163.com renwind@163.com QQ: 18725262 http://www.173d8.com http://blog.c ...
- 10.DirectionalLight(方向光)—— 模拟远处类似太阳的光源
方向光光源和我们之前看过的聚光灯光源之间主要的差别是:方向光不像聚焦光那样离目标越远越暗淡.被方向光光源照亮的整个区域接收到的光强是一样的.
- OpenGL基础24:聚光灯
前置:OpenGL基础23:平行光与点光源 一.聚光灯 三种基础光源在上一章讲了2种,现在只剩下聚光灯了 手电筒就是一个很经典例子,相对于点光源,聚光灯拥有以下特点 依然有衰减,但是聚光灯的光照一般都 ...
- OpenGL学习笔记(四)-光照-材质-光照贴图
参考网址:LearnOpenGL 中文版 哔哩哔哩教程 第二章 光照 2.1 颜色 现实生活中人眼看到某一物体的颜色,是它所反射的颜色.如将白光照在红色的玩具上,玩具会吸收白光中除了红色以外的所有子颜 ...
- 【Unity Shader】聚光灯体积光效果的简单实现
效果如下: Unity中的聚光灯SpotLight,可以用作手电筒,射灯等类似的效果,比如这样的 但是如果想把光束的效果做出来,就超出了SpotLight的能力范围了,本篇就为了记录一下一种简单的实现 ...
最新文章
- turtle文库 ——python
- 重磅!Nature子刊发布稳定学习观点论文:建立因果推理和机器学习的共识基础...
- 谋哥:App自推广这个概念就由我来创立了!
- Java 中,类、类对象、泛型之间的转换
- oracle 数据导入 数据和备注(comment)乱码问题解决办法
- ejb 2.1 jboss_JBoss AS7 JNDI和EJB 3.1命名更改
- python tkinter中的锚点(anchor)问题
- php 中 map和array,浅析php中array_map和array_walk的使用对比
- csdn积分c币获取方法
- 向日葵远程控制软件linux版安装
- 软件测试思想者 - 软件评测师考试顺利通关
- Origin绘图快速上手指南
- 华为静态路由配置实例
- Failed to prettify component
- C语言重难点知识梳理与常见题目/项目游戏解析
- codeforces 1183H
- 永远闪亮,网的眼睛 (转)
- Ryujinx - 基于 C# 开发的任天堂 Switch 模拟器
- 如何解决用户出差,脱域的问题
- linux aria2 参数,aria2常用命令