【我的世界原理分析】1.光照原理

  • 前言
    • 1.平滑光照
    • 2.环境光
    • 3.光照算法

前言

最近在研究类我的世界这样的游戏,方便以后开发以及提供给更多人一个思路。大家多多评论留言我会不断更新更多相关内容。

首先看一下我的世界的画面效果,我们后面的一章节再讲讲地形生成原理。

(最终效果)

1.平滑光照

拆分效果首先从最终效果开始拆,先把我的世界中的平滑光照关闭和开启来对比一下。




可以对比出来效果只是在方块的边缘和夹角设置了明暗部的过度。这个可以在shader中的着色器增加顶点颜色(后面的效果其实都可以基于顶点颜色来实现)或者其他效果来实现。这里不做实现只是提供方案,而且网上可以找到对应的shader代码实现效果。

2.环境光

我们已经关闭了平滑光照效果。那么再来看看这个方块有什么玄机。

以上这个是天亮时的方块

以上是天黑时的方块

我们可以看到它除了整体颜色变暗了,但是明暗面却没有变,它不会因为太阳光的位置而改变明暗部的面。因此我们可以大胆猜测这个方块的面其实就是写死的(写成了固定的明暗效果)。

在shader中依然可以用顶点颜色来实现,我们可以根据世界时间来定义一个黑色到白色的颜色值我们叫它亮度颜色。将原本显示的顶点颜色 乘以 这个亮度值 就可以了。

3.光照算法

到此我们实现了因时间而变化颜色深度的效果 和 平滑光照的效果。
但是还差了一步。平滑光照的光照是什么?仅仅只是夹角部分会变暗而已吗?
在我的世界里面挖了一个矿洞,虽然是白天矿洞内依然是黑色的,但洞口是亮的。
其实这个就是光照算法,根据光的传播来实现方块某个面的颜色亮度。


我们用羊毛来简单搭建的模拟矿洞。
可以看到洞口是亮的,到洞内越来越暗。(这种效果称为AO环境光遮蔽(Ambient Occlusion)“AO”为Ambient Occlusion的缩写。MC通过算法实现AO)

我们可以把光也看做为一种光源方块。天光直接照射到的地方是最亮的地方。
然后这些方块以此向四周蔓延。天光直接照射到地面的亮度在mc中为15。最暗的是0,也就是完全黑色(想想你没有带火把在矿洞里摸黑的感觉)。

这个光源方块亮度设置为15,然后向四周衰减蔓延。向四周衰减为14,然后得到14亮度的光源们再向四周衰减到13亮度。然后依次衰减到0。
如果有两个光源衰减传播,就取亮度最大的。

平面原理图。(如果还不懂可以评论区留言)

比如萤石这种有亮度的方块其实也可以按照这种方式来衰减传播亮度。你也可以每次衰减2的亮度来达到缩减一倍的亮度范围。

下一篇来讲讲我的世界的无限范围的mesh地形生成和优化。

【我的世界原理分析】1.光照原理相关推荐

  1. AbstractQueuedSynchronizer 原理分析 - Condition 实现原理

    1. 简介 Condition是一个接口,AbstractQueuedSynchronizer 中的ConditionObject内部类实现了这个接口.Condition声明了一组等待/通知的方法,这 ...

  2. Android 4.4 NotificationManagerService使用详解与原理分析(二)__原理分析

    前置文章: <Android 4.4 KitKat NotificationManagerService使用详解与原理分析(一)__使用详解> 转载请务必注明出处:http://blog. ...

  3. kubeadm工作原理-kubeadm init原理分析-kubeadm join原理分析

    kubeadm概述 kubeadm是社区维护的Kubernetes集群一键部署利器,使用两条命令即可完成k8s集群中master节点以及node节点的部署,其底层原理是利用了k8s TLS boots ...

  4. Android Hook原理分析--Xposed hook 原理分析

    hook寓意为钩子,在编程中寓意拦截替换. 整体逻辑就是将执行的方法拦截执行替换之后再执行回去,各大框架原理不同但是过程类似. Xposed Xposed框架核心思想在于将Java层普通函数注册成本地 ...

  5. EJB调用原理分析 (飞茂EJB)

    EJB调用原理分析 EJB调用原理分析 作者:robbin (MSN:robbin_fan AT hotmail DOT com) 版权声明:本文严禁转载,如有转载请求,请和作者联系 一个远程对象至少 ...

  6. Feign调用原理分析

    Feign调用原理分析 Feign调用原理分析 问题 Feign调用原理分析 调用之前:进行构造请求体.(构造方式为,配置的请求拦截器) 请求方式,请求地址,请求头等等 问题 Feign远程调用,缺失 ...

  7. Deeplink实践原理分析

    目录介绍 01.先看一个场景 02.什么是DeepLink 03.什么是Deferred DeepLink 04.什么是AppLink 05.DeepLink和AppLink核心技术 06.DeepL ...

  8. Android JNI原理分析

    引言:分析Android源码6.0的过程,一定离不开Java与C/C++代码直接的来回跳转,那么就很有必要掌握JNI,这是链接Java层和Native层的桥梁,本文涉及相关源码: frameworks ...

  9. Elasticsearch实现原理分析

    介绍 本文是分析Elasticsearch系列文章中的一篇,是一个译文.共有三个部分,每部分讲解部分Elasticsearch的实现原理.     在翻译的过程中,也需要查看对应部分的源码,来加深对实 ...

最新文章

  1. 企业应用平台移动化发展趋势
  2. Qt编程之通过鼠标滚轮事件缩放QGraphicsView里面的Item
  3. python中parse.add_argument()简单用法
  4. 虚拟语气和推测(一)
  5. 想找一些设计素材不知道去哪里找?
  6. 705. 设计哈希集合
  7. 递归学习简单的小例子之hanoi塔问题
  8. 数字图像处理复习总结
  9. 2021年互联网大厂中秋礼盒PK!50多家一口气看完
  10. 大数据技术基础与应用
  11. centos7 查看multipath服务状态是start condition failed,/etc/multipath.conf was not met
  12. 抽象基类与接口,共性与个性的选择!(区别)
  13. 逻辑英语——动词和分词-----名词
  14. 技能 |【点滴知识】如何在跟催任务时使用EXCEL进度条?
  15. Office 16 Click-to-Run Extensibility Component 卸载
  16. 小米9se是Android6吗,小米9SE评测 优缺点十分明显
  17. 自我管理的经典书籍推荐:《自我管理必读12篇》
  18. 机器学习编译器的前世今生
  19. 图像语义分割网络FCN(32s、16s、8s)原理及MindSpore实现
  20. 盘点教的好、口碑好的Web前端培训班

热门文章

  1. 【微博简易爬虫】Python获取指定微博用户的发布文本
  2. 你好,这是你要的五彩斑斓的黑
  3. 达梦体系结构(DM8)_yxy
  4. jquery解绑、绑定笔记
  5. 基于域对抗图卷积网络的多变环境下故障诊断
  6. android entries 变量选择,Spinner的使用(android:entries指定列表项)
  7. oracle ocx加载错误,怎么对.ocx格式的文件进行注册加载?出现0x8002801c错误怎么办?...
  8. qt 绘制五角星图形
  9. bootstrap4笔记
  10. 配置 hosts 浏览器访问仍然不生效