新年新气象

2020 是个好年,除了在家半年的休闲时光,还有浑水摸鱼的刺激生活。灾难与机遇并存的日子里,总是后知后觉地发现自己做了什么该做的、不该做的。而一年到头也麻了不少,趁仍熬的了夜,莽撞几回。

Read More

Share

手撕ECS #1: Types, Hierarchies and Prefabs

原文链接:Building an ECS #1: Types, Hierarchies and Prefabs

Entity Index

首先来看几个概念:

  • Entities 是运行时中独一无二的“东西”,通常与一个独一无二的整数标示。
  • Type(或 Archetype)来区分 Entity 所拥有组件列表的异同,通常用一个数组标示。比如一个 FPS 游戏中 Player 对象拥有两个组件,分别是“位置”和“血量”,则它的 Type 就是[Position, Health]

我们可以通过这两个概念来构造 ECS 中最基础的数据结构,即 Entity Index

1
2
3
4
5
using EntityId = uint64_t;
using ComponentId = EntityId;

using Type = std::vector<ComponentId>;
std::unordered_map<EntityId, Type> entityIndex;

通过 EntityId 我们可以很容易获取该 Entity 所拥有的组件列表,那么实现一个 HasComponent 便易如反掌:

1
2
3
4
5
6
7
bool HasComponent(EntityId entity, ComponentId component) {
vector<ComponentId>& type = entityIndex[entity];
for (auto c : type) {
if (c == component) return true;
}
return false;
}

针对 C++ 的特性,在添加组件时可以用模板的形式绑定就再好不过了:

1
2
Player.add<Position>();
Player.add<Health>();

在这两个 add 操作之后,entityIndex 中就应该包含一项绑定 Player[Position, Health] 的数组元素。当然,是以 ComponentId,即 uint64_t 的形式定义的,例如:

1
2
ComponentId Position_id = 1;
ComponentId Health_id = 2;

如此一来,Player 这一 Entity 的 Type 便成了 [1, 2]

Read More

Share

ルフランの地下迷宮と魔女ノ旅団2chまとめwiki Wiki*

ルフランの地下迷宮と魔女ノ旅団 攻略サイト Gametter

ルフランの地下迷宮と魔女ノ旅団 攻略 | RRPG

【含剧透】鲁弗兰的地下迷宫与魔女之旅团 攻略心得

Share

Mastering C++ Standard Library Features

快速掌握 Modern C++ 标准库特性,基于 Vittorio Romeo 发布的教程编撰。

C++ 后面跟着的数字越来越大,才发现漏学了亿个特性,赶紧捡起来重新看一遍。

Read More

Share

《全局光照技术》札记

渲染方法论方向

  • 寻找更快的数学方法来比较精确地计算渲染积分方程
  • 根据光学现象或者其他理论拆分渲染方程,使得光照效果最终由多种效果叠加

UE4 预处理阶段构建距离场

Share

球谐函数与全局光照

球谐函数学习笔记。

Read More

Share

URP Toon Lit 初见

Git Repository: timrockefeller/UnityURPToonLitShaderExample

Main Structure

  1. SurfaceColor pass
  2. Outline pass
  3. ShadowCaster pass
  4. DepthOnly pass

Features

核心特性

  • 面部法线修正⚠️

  • 光滑描边⚠️

  • FOV、LOD 描边变形修正⚠️

  • 面部头发投影 clip⚠️

  • stencil local hair shadow on face

  • 前发遮挡的眼部渲染

    使用 Stencil Test,参考 UTS

  • 各向异性头发渲染与“天使环”结合 UV 拉伸

  • 边缘光

  • PBR 镜面光照

  • 通过 HSV 控制阴影、描边颜色

  • 2D 嘴部渲染

  • 物理与风的模拟

  • 其他的特性材质如 AO、镜面、法线等

Spotlight Methods

Alpha Cliping

1
2
3
4
5
6
7
8
9
10
11
12
13
void DoClipTestToTargetAlphaValue(half alpha) 
{
// iOS上编译该shader出了点问题
/*
if(_UseAlphaClipping)
{
clip(alpha - _Cutoff);
}
*/

// 并非最佳方案,尽量使用GPU原生特性
clip(alpha - _Cutoff + (1.0001-_UseAlphaClipping));
}

Lighting Equaltion

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// this function will be used by all direct lights (directional/point/spot)
half3 ShadeSingleLightDefaultMethod(SurfaceData surfaceData, LightingData lightingData, Light light)
{
half3 N = lightingData.normalWS;
half3 L = light.direction;
half3 V = lightingData.viewDirectionWS;
half3 H = normalize(L+V);

half NoL = dot(N,L);

half lightAttenuation = 1;

// light's shadow map. If you prefer hard shadow, you can smoothstep() light.shadowAttenuation to make it sharp.
lightAttenuation *= lerp(1,light.shadowAttenuation,_ReceiveShadowMappingAmount);

// light's distance & angle fade for point light & spot light (see GetAdditionalPerObjectLight() in Lighting.hlsl)
// Lighting.hlsl -> https://github.com/Unity-Technologies/Graphics/blob/master/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl
lightAttenuation *= min(2,light.distanceAttenuation); //max intensity = 2, prevent over bright if light too close, can expose this float to editor if you wish to

// N dot L
// simplest 1 line cel shade, you can always replace this line by your own better method !
lightAttenuation *= smoothstep(_CelShadeMidPoint-_CelShadeSoftness,_CelShadeMidPoint+_CelShadeSoftness, NoL);

// don't want direct lighting becomes too bright for toon lit characters? set this value to a lower value
lightAttenuation *= _DirectLightMultiplier;

return surfaceData.albedo * light.color * lightAttenuation;
}
Share

夏至潮湿燥热,适合电子烧烤

一场雷雨砸了过来,没来得及反应,窗台上的陶瓷就碎了一地。

Read More

Share

May Game Days

甚至不知道要写些什么,只是想到要写,就不由自主地新建文本文档了。

这两天买了怪物猎人GU和异度之刃1,试图燃烧自己的青春。可问题在于,沉迷单机是否会与世隔绝……这孤独感可不是一两只艾露猫或者梅莉雅可以帮我化解的。

Share

想去乐园,请问怎么走?

抽时间看完了乐园追放,14年的作品放在今天也不失风味。作为一个奇迹番,虚渊玄从良的同时钉宫终于有了おっぱい。

虽说是三渲二,穿插着的手绘部分仍能把这份剧场版撑起来。之于我,这部作品的唯一亮点可能就是アンジェラ了。这铜盐焗襦,试问有谁顶得住呢?

斎藤笔下的アンジェラ

Read More

Share