Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
ef0349461e
1
.obsidian/core-plugins.json
vendored
1
.obsidian/core-plugins.json
vendored
@ -6,7 +6,6 @@
|
|||||||
"backlink",
|
"backlink",
|
||||||
"canvas",
|
"canvas",
|
||||||
"tag-pane",
|
"tag-pane",
|
||||||
"properties",
|
|
||||||
"page-preview",
|
"page-preview",
|
||||||
"daily-notes",
|
"daily-notes",
|
||||||
"note-composer",
|
"note-composer",
|
||||||
|
64
.obsidian/plugins/various-complements/data.json
vendored
64
.obsidian/plugins/various-complements/data.json
vendored
@ -47,59 +47,11 @@
|
|||||||
},
|
},
|
||||||
"showLogAboutPerformanceInConsole": false,
|
"showLogAboutPerformanceInConsole": false,
|
||||||
"selectionHistoryTree": {
|
"selectionHistoryTree": {
|
||||||
"以垂直关系依次旋转每个轴。": {
|
"2周左右。": {
|
||||||
"以垂直关系依次旋转每个轴。": {
|
"2周左右。": {
|
||||||
"currentFile": {
|
"currentFile": {
|
||||||
"count": 1,
|
"count": 1,
|
||||||
"lastUpdated": 1698213001403
|
"lastUpdated": 1703147471771
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"设置Skeleton与PreviewMesh资产。": {
|
|
||||||
"设置Skeleton与PreviewMesh资产。": {
|
|
||||||
"currentFile": {
|
|
||||||
"count": 1,
|
|
||||||
"lastUpdated": 1699256932874
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"。里面初始化了SourceSkeleton、TargetSkeleton、根骨骼重定向器、UIKRigProcessor、": {
|
|
||||||
"。里面初始化了SourceSkeleton、TargetSkeleton、根骨骼重定向器、UIKRigProcessor、": {
|
|
||||||
"currentFile": {
|
|
||||||
"count": 1,
|
|
||||||
"lastUpdated": 1699258408430
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"TargetSkeleton、根骨骼重定向器、UIKRigProcessor、": {
|
|
||||||
"TargetSkeleton、根骨骼重定向器、UIKRigProcessor、": {
|
|
||||||
"currentFile": {
|
|
||||||
"count": 2,
|
|
||||||
"lastUpdated": 1699258527676
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"使用最终finalyOffset": {
|
|
||||||
"使用最终finalyOffset": {
|
|
||||||
"currentFile": {
|
|
||||||
"count": 1,
|
|
||||||
"lastUpdated": 1699348533203
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Target": {
|
|
||||||
"Target": {
|
|
||||||
"currentFile": {
|
|
||||||
"count": 1,
|
|
||||||
"lastUpdated": 1699348599323
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"遍历所有骨骼,复制SourceGlobalPose到CurrentGlobalTransforms;取得对应骨骼的Index以及父骨骼Index。(跳过根骨骼)": {
|
|
||||||
"遍历所有骨骼,复制SourceGlobalPose到CurrentGlobalTransforms;取得对应骨骼的Index以及父骨骼Index。(跳过根骨骼)": {
|
|
||||||
"currentFile": {
|
|
||||||
"count": 1,
|
|
||||||
"lastUpdated": 1699350988289
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -107,7 +59,15 @@
|
|||||||
"c++17带来的代码变化": {
|
"c++17带来的代码变化": {
|
||||||
"internalLink": {
|
"internalLink": {
|
||||||
"count": 1,
|
"count": 1,
|
||||||
"lastUpdated": 1699369392809
|
"lastUpdated": 1703216792464
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"AlbedoTint、CropEnabled、CropTranslation、CropRotation、CropExtent;texture_width、texture_position、texture_rotation、texture_scaleAndOpacity。": {
|
||||||
|
"AlbedoTint、CropEnabled、CropTranslation、CropRotation、CropExtent;texture_width、texture_position、texture_rotation、texture_scaleAndOpacity。": {
|
||||||
|
"currentFile": {
|
||||||
|
"count": 1,
|
||||||
|
"lastUpdated": 1703225931596
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
11
.obsidian/plugins/workspaces-plus/data.json
vendored
11
.obsidian/plugins/workspaces-plus/data.json
vendored
@ -2,5 +2,14 @@
|
|||||||
"showInstructions": true,
|
"showInstructions": true,
|
||||||
"showDeletePrompt": true,
|
"showDeletePrompt": true,
|
||||||
"saveOnSwitch": false,
|
"saveOnSwitch": false,
|
||||||
"saveOnChange": false
|
"saveOnChange": false,
|
||||||
|
"workspaceSettings": false,
|
||||||
|
"systemDarkMode": false,
|
||||||
|
"globalSettings": {},
|
||||||
|
"activeWorkspaceDesktop": "阅读模式",
|
||||||
|
"activeWorkspaceMobile": "",
|
||||||
|
"reloadLivePreview": false,
|
||||||
|
"workspaceSwitcherRibbon": false,
|
||||||
|
"modeSwitcherRibbon": false,
|
||||||
|
"replaceNativeRibbon": false
|
||||||
}
|
}
|
8
.obsidian/workspaces.json
vendored
8
.obsidian/workspaces.json
vendored
@ -179,7 +179,8 @@
|
|||||||
"direction": "horizontal",
|
"direction": "horizontal",
|
||||||
"width": 229
|
"width": 229
|
||||||
},
|
},
|
||||||
"active": "c8875a5f97f4a74d"
|
"active": "c8875a5f97f4a74d",
|
||||||
|
"workspaces-plus:settings-v1": {}
|
||||||
},
|
},
|
||||||
"阅读模式": {
|
"阅读模式": {
|
||||||
"main": {
|
"main": {
|
||||||
@ -363,8 +364,9 @@
|
|||||||
"direction": "horizontal",
|
"direction": "horizontal",
|
||||||
"width": 245
|
"width": 245
|
||||||
},
|
},
|
||||||
"active": "0d255cdd69daa9bf"
|
"active": "0d255cdd69daa9bf",
|
||||||
|
"workspaces-plus:settings-v1": {}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"active": "编辑模式"
|
"active": "阅读模式"
|
||||||
}
|
}
|
@ -1,3 +1,41 @@
|
|||||||
|
# AI虚拟直播间需求&任务整理
|
||||||
|
## 实现目标&内容&工期
|
||||||
|
>拿给EOE老板看的Demo版本
|
||||||
|
|
||||||
|
1. 控制AI行为以及数据交互的导播台应用(Electron + Server)
|
||||||
|
1. 实现目标
|
||||||
|
1. =>AI服务器
|
||||||
|
1. 能够发送文字、语音数据以及其他指令到AI服务器。
|
||||||
|
2. 能够接收文字、音频、CSV、FBX数据。
|
||||||
|
2. =>渲染机器
|
||||||
|
1. 能够转发音频、CSV、FBX数据到渲染机中。
|
||||||
|
2. 实现内容:基础Electron用户界面以及对应的Server(第一版放在一起后续分离),工期 2周左右。
|
||||||
|
1. 转发数据逻辑
|
||||||
|
2. 用户界面
|
||||||
|
3. 未来TODO:
|
||||||
|
1. 自定VMC协议用来传输音频等其他数据
|
||||||
|
2. 渲染机(UE插件)
|
||||||
|
1. 导播台应用=>
|
||||||
|
1. 制作角色蓝图、动画蓝图以及状态机,可以播放音频、CSV、FBX。
|
||||||
|
2. 接收导播台(AI服务器的控制指令)
|
||||||
|
2. 实现内容:编写插件实现对应的数据接收节点。
|
||||||
|
|
||||||
|
## 任务分配
|
||||||
|
1. 楼嘉杰搭建基础原型
|
||||||
|
2. Electron的UI美化&细化 => 前端
|
||||||
|
1. 搭建基础Electron的VUE模板。
|
||||||
|
2. 将项目传到公司Gitlab平台上。
|
||||||
|
3. 插件配套场景搭建 =>杨萱羽
|
||||||
|
1. 从EOE场景里扣一个像直播舞台的场景。
|
||||||
|
2.
|
||||||
|
|
||||||
|
## 存在问题
|
||||||
|
- [x] ~~渲染机是否需要传递数据到导播台(渲染机干预导播台的一些行为)?~~
|
||||||
|
- [x] 导播台除了文字、音频还有哪些数据会传递到AI端?
|
||||||
|
- 目前只有文字
|
||||||
|
- [x] ChatGPT会过期。ChatGPT账号池已经完成,开发时可以手动续费。
|
||||||
|
|
||||||
|
# AI虚拟偶像陪伴
|
||||||
## 阶段技术需求 & 实现目标
|
## 阶段技术需求 & 实现目标
|
||||||
### 第零阶段(快速简历可供AI迭代的基础程序)
|
### 第零阶段(快速简历可供AI迭代的基础程序)
|
||||||
1. Express Http服务器。
|
1. Express Http服务器。
|
@ -112,3 +112,60 @@ UE5中FBXSDK相关函数调用方式:
|
|||||||
1. Interchange\\Runtime\\Source\\Parsers
|
1. Interchange\\Runtime\\Source\\Parsers
|
||||||
1. InterchangeFbxParser.Build.cs
|
1. InterchangeFbxParser.Build.cs
|
||||||
2. FbxInclude.h:FBXSDK头文件包含问题。
|
2. FbxInclude.h:FBXSDK头文件包含问题。
|
||||||
|
|
||||||
|
# UE5中使用FBXSDK导出动画逻辑
|
||||||
|
1. FFbxExporter::ExportSkeletalMeshToFbx => FFbxExporter::ExportAnimSequence => FFbxExporter::ExportAnimSequenceToFbx
|
||||||
|
2. FFbxExporter::CorrectAnimTrackInterpolation
|
||||||
|
|
||||||
|
直接导出会有问题,所以UE在这里做了一步Correct:
|
||||||
|
```c++
|
||||||
|
// The curve code doesn't differentiate between angles and other data, so an interpolation from 179 to -179
|
||||||
|
// will cause the bone to rotate all the way around through 0 degrees. So here we make a second pass over the
|
||||||
|
// rotation tracks to convert the angles into a more interpolation-friendly format.
|
||||||
|
FFbxExporter::CorrectAnimTrackInterpolation()
|
||||||
|
{
|
||||||
|
void FFbxExporter::CorrectAnimTrackInterpolation( TArray<FbxNode*>& BoneNodes, FbxAnimLayer* InAnimLayer )
|
||||||
|
{
|
||||||
|
// Add the animation data to the bone nodes
|
||||||
|
for(int32 BoneIndex = 0; BoneIndex < BoneNodes.Num(); ++BoneIndex)
|
||||||
|
{
|
||||||
|
FbxNode* CurrentBoneNode = BoneNodes[BoneIndex];
|
||||||
|
|
||||||
|
// Fetch the AnimCurves
|
||||||
|
FbxAnimCurve* Curves[3];
|
||||||
|
Curves[0] = CurrentBoneNode->LclRotation.GetCurve(InAnimLayer, FBXSDK_CURVENODE_COMPONENT_X, true);
|
||||||
|
Curves[1] = CurrentBoneNode->LclRotation.GetCurve(InAnimLayer, FBXSDK_CURVENODE_COMPONENT_Y, true);
|
||||||
|
Curves[2] = CurrentBoneNode->LclRotation.GetCurve(InAnimLayer, FBXSDK_CURVENODE_COMPONENT_Z, true);
|
||||||
|
|
||||||
|
for(int32 CurveIndex = 0; CurveIndex < 3; ++CurveIndex)
|
||||||
|
{
|
||||||
|
FbxAnimCurve* CurrentCurve = Curves[CurveIndex];
|
||||||
|
CurrentCurve->KeyModifyBegin();
|
||||||
|
|
||||||
|
float CurrentAngleOffset = 0.f;
|
||||||
|
for(int32 KeyIndex = 1; KeyIndex < CurrentCurve->KeyGetCount(); ++KeyIndex)
|
||||||
|
{
|
||||||
|
float PreviousOutVal = CurrentCurve->KeyGetValue( KeyIndex-1 );
|
||||||
|
float CurrentOutVal = CurrentCurve->KeyGetValue( KeyIndex );
|
||||||
|
|
||||||
|
float DeltaAngle = (CurrentOutVal + CurrentAngleOffset) - PreviousOutVal;
|
||||||
|
|
||||||
|
if(DeltaAngle >= 180)
|
||||||
|
{
|
||||||
|
CurrentAngleOffset -= 360;
|
||||||
|
}
|
||||||
|
else if(DeltaAngle <= -180)
|
||||||
|
{
|
||||||
|
CurrentAngleOffset += 360;
|
||||||
|
}
|
||||||
|
|
||||||
|
CurrentOutVal += CurrentAngleOffset;
|
||||||
|
|
||||||
|
CurrentCurve->KeySetValue(KeyIndex, CurrentOutVal);
|
||||||
|
}
|
||||||
|
|
||||||
|
CurrentCurve->KeyModifyEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
17
03-UnrealEngine/Gameplay/Http/UE5 Http相关.md
Normal file
17
03-UnrealEngine/Gameplay/Http/UE5 Http相关.md
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
title: UE5 Http相关
|
||||||
|
date: 2023-11-30 21:31:42
|
||||||
|
excerpt:
|
||||||
|
tags:
|
||||||
|
rating: ⭐
|
||||||
|
---
|
||||||
|
|
||||||
|
# 案例
|
||||||
|
https://dev.epicgames.com/community/learning/tutorials/ZdXD/call-rest-api-using-http-json-from-ue5-c
|
||||||
|
|
||||||
|
# Base64
|
||||||
|
https://zhuanlan.zhihu.com/p/344540241
|
||||||
|
|
||||||
|
# Gzip
|
||||||
|
https://forums.unrealengine.com/t/why-does-fcompression-not-support-gzip-for-uncompressmemory/357255/3
|
||||||
|
https://github.com/gtreshchev/RuntimeArchiver
|
73
03-UnrealEngine/Rendering/3D高斯/Sibr相关笔记.md
Normal file
73
03-UnrealEngine/Rendering/3D高斯/Sibr相关笔记.md
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
---
|
||||||
|
title: 未命名
|
||||||
|
date: 2023-12-29 16:20:43
|
||||||
|
excerpt:
|
||||||
|
tags:
|
||||||
|
rating: ⭐
|
||||||
|
---
|
||||||
|
|
||||||
|
# 前言
|
||||||
|
- 文档:https://sibr.gitlabpages.inria.fr
|
||||||
|
- 代码:https://gitlab.inria.fr/sibr/sibr_core
|
||||||
|
- 案例代码
|
||||||
|
- [renderer/SimpleView.hpp](https://gitlab.inria.fr/mbenadel/sibr_simple/-/blob/master/renderer/SimpleView.hpp)&[renderer/SimpleView.cpp](https://gitlab.inria.fr/mbenadel/sibr_simple/-/blob/master/renderer/SimpleView.cpp)
|
||||||
|
- [renderer/SimpleRenderer.hpp](https://gitlab.inria.fr/mbenadel/sibr_simple/-/blob/master/renderer/SimpleRenderer.hpp)&[renderer/SimpleRenderer.cpp](https://gitlab.inria.fr/mbenadel/sibr_simple/-/blob/master/renderer/SimpleRenderer.cpp)
|
||||||
|
- [Simple SIBR Project](https://gitlab.inria.fr/sibr/projects/simple)
|
||||||
|
- [SIBR/OptiX integration example](https://sibr.gitlabpages.inria.fr/docs/0.9.6/optixPage.html)
|
||||||
|
- [Tensorflow/OpenGL Interop for SIBR](https://sibr.gitlabpages.inria.fr/docs/0.9.6/tfgl_interopPage.html)
|
||||||
|
- Shader:需要将你自己编写的Shader放入**renderer/shaders**文件夹中
|
||||||
|
- 关键词:
|
||||||
|
- Structure-from-Motion (SfM)
|
||||||
|
- Multi-View Stereo (MVS)
|
||||||
|
|
||||||
|
## 功能
|
||||||
|
https://sibr.gitlabpages.inria.fr/docs/0.9.6/projects.html
|
||||||
|
|
||||||
|
- [Sample algorithms & toolboxes](https://sibr.gitlabpages.inria.fr/docs/0.9.6/sibr_projects_samples.html)
|
||||||
|
- [Dataset Preprocessing Tools](https://sibr.gitlabpages.inria.fr/docs/0.9.6/sibr_projects_dataset_tools.html) ([https://gitlab.inria.fr/sibr/sibr_core](https://gitlab.inria.fr/sibr/sibr_core))
|
||||||
|
- [Unstructured Lumigraph Rendering (ULR)](https://sibr.gitlabpages.inria.fr/docs/0.9.6/ulrPage.html) ([https://gitlab.inria.fr/sibr/sibr_core](https://gitlab.inria.fr/sibr/sibr_core))
|
||||||
|
- [Our algorithms](https://sibr.gitlabpages.inria.fr/docs/0.9.6/sibr_projects_ours.html)
|
||||||
|
- [Exploiting Repetitions for IBR of Facades](https://sibr.gitlabpages.inria.fr/docs/0.9.6/facade_repetitionsPage.html) ([https://gitlab.inria.fr/sibr/projects/facades-repetitions/facade_repetitions](https://gitlab.inria.fr/sibr/projects/facades-repetitions/facade_repetitions)) (Exploiting Repetitions for IBR of Facades (paper reference :[http://www-sop.inria.fr/reves/Basilic/2018/RBDD18/](http://www-sop.inria.fr/reves/Basilic/2018/RBDD18/)))
|
||||||
|
- [Deep Blending for Free-Viewpoint Image-Based Rendering – Scalable Inside-Out Image-Based Rendering](https://sibr.gitlabpages.inria.fr/docs/0.9.6/inside_out_deep_blendingPage.html) ([https://gitlab.inria.fr/sibr/projects/inside_out_deep_blending](https://gitlab.inria.fr/sibr/projects/inside_out_deep_blending)) (Deep Blending for Free-Viewpoint Image-Based Rendering, paper references: [http://www-sop.inria.fr/reves/Basilic/2018/HPPFDB18/](http://www-sop.inria.fr/reves/Basilic/2018/HPPFDB18/) , [http://visual.cs.ucl.ac.uk/pubs/deepblending/](http://visual.cs.ucl.ac.uk/pubs/deepblending/) ; Scalable Inside-Out Image-Based Rendering, paper references: [http://www-sop.inria.fr/reves/Basilic/2016/HRDB16](http://www-sop.inria.fr/reves/Basilic/2016/HRDB16) , [http://visual.cs.ucl.ac.uk/pubs/insideout/](http://visual.cs.ucl.ac.uk/pubs/insideout/) )
|
||||||
|
- [Multi-view relighting using a geometry-aware network](https://sibr.gitlabpages.inria.fr/docs/0.9.6/outdoorRelightingPage.html) ([https://gitlab.inria.fr/sibr/projects/outdoor_relighting](https://gitlab.inria.fr/sibr/projects/outdoor_relighting)) (Multi-view Relighting Using a Geometry-Aware Network; paper reference ([https://www-sop.inria.fr/reves/Basilic/2019/PGZED19/](https://www-sop.inria.fr/reves/Basilic/2019/PGZED19/)) )
|
||||||
|
- [Image-Based Rendering of Cars using Semantic Labels and Approximate Reflection Flow](https://sibr.gitlabpages.inria.fr/docs/0.9.6/semantic_reflectionsPage.html) ([https://gitlab.inria.fr/sibr/projects/semantic-reflections/semantic_reflections](https://gitlab.inria.fr/sibr/projects/semantic-reflections/semantic_reflections)) (Image-Based Rendering of Cars using Semantic Labels and Approximate Reflection Flow (paper reference : [http://www-sop.inria.fr/reves/Basilic/2020/RPHD20/](http://www-sop.inria.fr/reves/Basilic/2020/RPHD20/)))
|
||||||
|
- [Depth Synthesis and Local Warps for plausible image-based navigation - Bayesian approach for selective image-based rendering using superpixels](https://sibr.gitlabpages.inria.fr/docs/0.9.6/spixelwarpPage.html) ([https://gitlab.inria.fr/sprakash/spixelwarp](https://gitlab.inria.fr/sprakash/spixelwarp)) (Depth Synthesis and Local Warps for plausible image-based navigation, paper reference: [http://www-sop.inria.fr/reves/Basilic/2013/CDSD13/](http://www-sop.inria.fr/reves/Basilic/2013/CDSD13/) ; Bayesian approach for selective image-based rendering using superpixels, paper reference: [http://www-sop.inria.fr/reves/Basilic/2015/ODD15/](http://www-sop.inria.fr/reves/Basilic/2015/ODD15/) ))
|
||||||
|
- [Glossy Probe Reprojection for Interactive Global Illumination](https://sibr.gitlabpages.inria.fr/docs/0.9.6/synthetic_ibrPage.html) ([https://gitlab.inria.fr/sibr/projects/glossy-probes/synthetic_ibr](https://gitlab.inria.fr/sibr/projects/glossy-probes/synthetic_ibr)) (Glossy Probe Reprojection for Interactive Global Illumination (paper reference : [http://www-sop.inria.fr/reves/Basilic/2020/RLPWSD20/](http://www-sop.inria.fr/reves/Basilic/2020/RLPWSD20/)))
|
||||||
|
- [Other algorithms](https://sibr.gitlabpages.inria.fr/docs/0.9.6/sibr_projects_others.html)
|
||||||
|
- [Soft3D](https://sibr.gitlabpages.inria.fr/docs/0.9.6/soft3dPage.html) ([https://gitlab.inria.fr/sibr/projects/soft3d](https://gitlab.inria.fr/sibr/projects/soft3d)) (Soft 3D Reconstruction for View Synthesis (paper reference : [https://ericpenner.github.io/soft3d/](https://ericpenner.github.io/soft3d/)))
|
||||||
|
- [Integrated toolboxes](https://sibr.gitlabpages.inria.fr/docs/0.9.6/sibr_projects_toolbox.html)
|
||||||
|
- [Core framework of FRIBR](https://sibr.gitlabpages.inria.fr/docs/0.9.6/fribrFrameworkPage.html) ([https://gitlab.inria.fr/sibr/fribr_framework](https://gitlab.inria.fr/sibr/fribr_framework)) (Core framework of FRIBR)
|
||||||
|
- [SIBR/OptiX integration example](https://sibr.gitlabpages.inria.fr/docs/0.9.6/optixPage.html) ([https://gitlab.inria.fr/sibr/projects/optix](https://gitlab.inria.fr/sibr/projects/optix)) (SIBR/OptiX integration example)
|
||||||
|
- [Simple SIBR Project](https://sibr.gitlabpages.inria.fr/docs/0.9.6/simplePage.html) ([https://gitlab.inria.fr/sibr/projects/simple](https://gitlab.inria.fr/sibr/projects/simple)) (A simple sample SIBR project for you to base your projects on)
|
||||||
|
- [Tensorflow/OpenGL Interop for SIBR](https://sibr.gitlabpages.inria.fr/docs/0.9.6/tfgl_interopPage.html) ([https://gitlab.inria.fr/sibr/tfgl_interop](https://gitlab.inria.fr/sibr/tfgl_interop)) (Tensorflow GL interoperability dependencies and cuda code)
|
||||||
|
|
||||||
|
- [示例算法和工具箱](https://sibr.gitlabpages.inria.fr/docs/0.9.6/sibr_projects_samples.html)
|
||||||
|
- [数据集预处理工具](https://sibr.gitlabpages.inria.fr/docs/0.9.6/sibr_projects_dataset_tools.html)([https://gitlab.inria.fr/sibr/sibr_core](https://gitlab.inria.fr/sibr/sibr_core))
|
||||||
|
- [非结构化 Lumigraph 渲染 (ULR)](https://sibr.gitlabpages.inria.fr/docs/0.9.6/ulrPage.html) ( [https://gitlab.inria.fr/sibr/sibr_core](https://gitlab.inria.fr/sibr/sibr_core) )
|
||||||
|
- [我们的算法](https://sibr.gitlabpages.inria.fr/docs/0.9.6/sibr_projects_ours.html)
|
||||||
|
- [Exploiting Repetitions for IBR of Facades](https://sibr.gitlabpages.inria.fr/docs/0.9.6/facade_repetitionsPage.html) ( [https://gitlab.inria.fr/sibr/projects/facades-repetitions/facade_repetitions](https://gitlab.inria.fr/sibr/projects/facades-repetitions/facade_repetitions) ) (Exploiting Repetitions for IBR of Facades (论文参考: http: [//www-sop.inria.fr/里夫/巴西利克/2018/RBDD18/](http://www-sop.inria.fr/reves/Basilic/2018/RBDD18/)))
|
||||||
|
- [用于基于自由视点图像的渲染的深度混合 – 可扩展的由内而外基于图像的渲染](https://sibr.gitlabpages.inria.fr/docs/0.9.6/inside_out_deep_blendingPage.html)( [https://gitlab.inria.fr/sibr/projects/inside_out_deep_blending](https://gitlab.inria.fr/sibr/projects/inside_out_deep_blending) ) (用于基于自由视点图像的渲染的深度混合,论文参考:[http://www-sop.inria.fr/reves/Basilic/2018/HPPFDB18/,http](http://www-sop.inria.fr/reves/Basilic/2018/HPPFDB18/) : [//visual.cs.ucl.ac.uk/pubs/deepblending/](http://visual.cs.ucl.ac.uk/pubs/deepblending/);可扩展的由内而外基于图像的渲染,论文参考:[http://www-sop.inria.fr/reves/Basilic/2016/HRDB16,http](http://www-sop.inria.fr/reves/Basilic/2016/HRDB16) : [//visual.cs.ucl.ac.uk/pubs/insideout/](http://visual.cs.ucl.ac.uk/pubs/insideout/))
|
||||||
|
- [使用几何感知网络的多视图重新照明](https://sibr.gitlabpages.inria.fr/docs/0.9.6/outdoorRelightingPage.html)( [https://gitlab.inria.fr/sibr/projects/outdoor_relighting](https://gitlab.inria.fr/sibr/projects/outdoor_relighting) )(使用几何感知网络的多视图重新照明;论文参考 ( [https://www-sop. inria.fr/reves/Basilic/2019/PGZED19/](https://www-sop.inria.fr/reves/Basilic/2019/PGZED19/) ) )
|
||||||
|
- [使用语义标签和近似反射流的基于图像的汽车渲染](https://sibr.gitlabpages.inria.fr/docs/0.9.6/semantic_reflectionsPage.html)([https://gitlab.inria.fr/sibr/projects/semantic-reflections/semantic_reflections](https://gitlab.inria.fr/sibr/projects/semantic-reflections/semantic_reflections))(使用语义标签和近似反射流的基于图像的汽车渲染(论文参考:[http://www-sop.inria.fr/reves/Basilic/2020/RPHD20/](http://www-sop.inria.fr/reves/Basilic/2020/RPHD20/)))
|
||||||
|
- [用于合理的基于图像的导航的深度合成和局部扭曲 - 使用超像素进行选择性基于图像的渲染的贝叶斯方法](https://sibr.gitlabpages.inria.fr/docs/0.9.6/spixelwarpPage.html)([https://gitlab.inria.fr/sprakash/spixelwarp](https://gitlab.inria.fr/sprakash/spixelwarp))(用于合理的基于图像的导航的深度合成和局部扭曲,论文参考:[http://www-sop.inria.fr/reves/Basilic/2013/CDSD13/](http://www-sop.inria.fr/reves/Basilic/2013/CDSD13/);使用超像素进行选择性基于图像渲染的贝叶斯方法,论文参考: http: [//www-sop.inria.fr/里夫/巴西利克/2015/ODD15/](http://www-sop.inria.fr/reves/Basilic/2015/ODD15/)))
|
||||||
|
- [用于交互式全局照明的光泽探针重投影](https://sibr.gitlabpages.inria.fr/docs/0.9.6/synthetic_ibrPage.html)([https://gitlab.inria.fr/sibr/projects/glossy-probes/synthetic_ibr](https://gitlab.inria.fr/sibr/projects/glossy-probes/synthetic_ibr))(用于交互式全局照明的光泽探针重投影(论文参考:[http://www-sop.inria。 fr/reves/Basilic/2020/RLPWSD20/](http://www-sop.inria.fr/reves/Basilic/2020/RLPWSD20/) ))
|
||||||
|
- [其他算法](https://sibr.gitlabpages.inria.fr/docs/0.9.6/sibr_projects_others.html)
|
||||||
|
- [Soft3D](https://sibr.gitlabpages.inria.fr/docs/0.9.6/soft3dPage.html)([https://gitlab.inria.fr/sibr/projects/soft3d](https://gitlab.inria.fr/sibr/projects/soft3d))(用于视图合成的软3D重建(论文参考: https: [//ericpenner.github.io/soft3d/](https://ericpenner.github.io/soft3d/)))
|
||||||
|
- [集成工具箱](https://sibr.gitlabpages.inria.fr/docs/0.9.6/sibr_projects_toolbox.html)
|
||||||
|
- [FRIBR核心框架](https://sibr.gitlabpages.inria.fr/docs/0.9.6/fribrFrameworkPage.html)([https://gitlab.inria.fr/sibr/fribr_framework)(FRIBR](https://gitlab.inria.fr/sibr/fribr_framework)核心框架)
|
||||||
|
- [SIBR/OptiX 集成示例](https://sibr.gitlabpages.inria.fr/docs/0.9.6/optixPage.html)( [https://gitlab.inria.fr/sibr/projects/optix](https://gitlab.inria.fr/sibr/projects/optix) )(SIBR/OptiX 集成示例)
|
||||||
|
- [简单 SIBR 项目](https://sibr.gitlabpages.inria.fr/docs/0.9.6/simplePage.html)( [https://gitlab.inria.fr/sibr/projects/simple](https://gitlab.inria.fr/sibr/projects/simple) )(一个简单的示例 SIBR 项目,供您作为项目的基础)
|
||||||
|
- [SIBR 的 Tensorflow/OpenGL 互操作](https://sibr.gitlabpages.inria.fr/docs/0.9.6/tfgl_interopPage.html)([https://gitlab.inria.fr/sibr/tfgl_interop)(Tensorflow](https://gitlab.inria.fr/sibr/tfgl_interop) GL 互操作性依赖项和 cuda 代码)
|
||||||
|
|
||||||
|
项目结构:
|
||||||
|
- `renderer/`: contains your library code and configuration
|
||||||
|
- `preprocess/`: contains your preprocesses listed by directory, and the configuration CMake file to list them
|
||||||
|
- `apps/`: contains your apps listed by directory, and the configuration CMake file to list them
|
||||||
|
- `documentation/`: contains additional doxygen documentation
|
||||||
|
|
||||||
|
# SIBR数据集创建方式
|
||||||
|
**SIBR**本身定义了一种数据格式
|
||||||
|
|
||||||
|
可以使用**RealityCapture**或者**Colmap**创建原生的SIBR数据集,也可以根据文档使用SFM或者MVS系统创建兼容数据集合。
|
||||||
|
- [如何从 Reality Capture 创建数据集](https://sibr.gitlabpages.inria.fr/docs/0.9.6/HowToCapreal.html)
|
||||||
|
- [如何从 Colmap 创建数据集](https://sibr.gitlabpages.inria.fr/docs/0.9.6/HowToColmap.html)
|
20
03-UnrealEngine/Rendering/RenderFeature/LOD相关代码笔记.md
Normal file
20
03-UnrealEngine/Rendering/RenderFeature/LOD相关代码笔记.md
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
title: LOD相关代码笔记
|
||||||
|
date: 2023-12-28 15:13:44
|
||||||
|
excerpt:
|
||||||
|
tags:
|
||||||
|
rating: ⭐
|
||||||
|
---
|
||||||
|
# UE5中的带有LOD名称的相关代码
|
||||||
|
- Plugin
|
||||||
|
- Mesh LOD Toolset
|
||||||
|
- `Engine\Plugins\Experimental\MeshLODToolset\Source\MeshLODToolset\Public\Graphs\GenerateStaticMeshLODProcess.h`
|
||||||
|
- Proxy LOD Plugin
|
||||||
|
- `Engine\Plugins\Experimental\ProxyLODPlugin\Source\ProxyLOD\PrivateProxyLODPlugin.cpp`
|
||||||
|
- Skeletal Mesh Simplifier
|
||||||
|
- `Engine\Plugins\Experimental\SkeletalReduction\Source\Private\SkeletalMeshReductionPlugin.cpp`
|
||||||
|
|
||||||
|
# UGenerateStaticMeshLODProcess
|
||||||
|
- FGenerateStaticMeshLODAssetOperatorOp
|
||||||
|
- FGenerateStaticMeshLODAssetOperatorOp::CalculateResult()
|
||||||
|
- void FGenerateMeshLODGraph::EvaluateResult
|
111
03-UnrealEngine/Rendering/RenderFeature/UE5 3DGaussians 插件笔记.md
Normal file
111
03-UnrealEngine/Rendering/RenderFeature/UE5 3DGaussians 插件笔记.md
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
---
|
||||||
|
title: UE5 3DGaussians 插件笔记
|
||||||
|
date: 2023-12-22 11:44:33
|
||||||
|
excerpt:
|
||||||
|
tags:
|
||||||
|
rating: ⭐
|
||||||
|
---
|
||||||
|
|
||||||
|
# c++
|
||||||
|
插件的c++部分主要实现了
|
||||||
|
- FThreeDGaussians——可以理解为一个场景或者根节点
|
||||||
|
- FThreeDGaussiansTree——类似BVH的空间切分树
|
||||||
|
- FThreeDGaussiansData——具体数据
|
||||||
|
- ply点云文件导入,流程如下
|
||||||
|
- FThreeDGaussiansImporterModule::PluginButtonClicked()
|
||||||
|
- LoadPly(),载入`TArray<FThreeDGaussian>`数据。
|
||||||
|
- 进行排序
|
||||||
|
- 初始化一个`TArray<FThreeDGaussianSortPair> unsorted`并且进行排序。
|
||||||
|
- 取得各种排序用参数DO_SPLIT_BY_3D_MORTON_ORDER、DO_SPLIT_BY_DISTANCE、MAX_TEXTURE_WIDHT、MAX_NUM_PARTICLES
|
||||||
|
- 采用莫顿码分割法、距离排序法。
|
||||||
|
- 莫顿码分割法:使用莫顿码进行排序,之后进行空间分割,构建一个三维加速结构。当当前区域点云数量小于MAX_NUM_PARTICLES后调用CreateDatum()。
|
||||||
|
- 距离排序法:根据Position上三个分量中最大绝对值进行排序,之后调用CreateDatum()。
|
||||||
|
- CreateDatum()
|
||||||
|
- Sort3dMortonOrder()排序。
|
||||||
|
- CreateExr()创建Exr Texture文件。
|
||||||
|
- 将上一步创建的文件导入UE。
|
||||||
|
- CreateActorBpSubclass(),创建3DGaussians蓝图Actor,并且查找SetData函数并且将数据塞入。
|
||||||
|
|
||||||
|
## FThreeDGaussians代码
|
||||||
|
```c++
|
||||||
|
struct FThreeDGaussiansData
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
public:
|
||||||
|
FThreeDGaussiansData() {}
|
||||||
|
FThreeDGaussiansData(const TArray<UTexture2D*>& textures, const FVector3f& in_minPos, const FVector3f& in_maxPos)
|
||||||
|
{
|
||||||
|
minPos = in_minPos;
|
||||||
|
maxPos = in_maxPos;
|
||||||
|
textureWidth = textures[0]->GetSizeX();
|
||||||
|
position = textures[0];
|
||||||
|
rotation = textures[1];
|
||||||
|
scaleAndOpacity = textures[2];
|
||||||
|
|
||||||
|
for (int i = 3; i < textures.Num(); i++)
|
||||||
|
{
|
||||||
|
sh.Add(textures[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "3D Gaussians") FVector3f minPos = FVector3f::Zero();
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "3D Gaussians") FVector3f maxPos = FVector3f::Zero();
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "3D Gaussians") int32 textureWidth = -1;
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "3D Gaussians") UTexture2D* position;
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "3D Gaussians") UTexture2D* rotation;
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "3D Gaussians") UTexture2D* scaleAndOpacity;
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "3D Gaussians") TArray<UTexture2D*> sh;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** 类似BVH的控件数据结构 */
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FThreeDGaussiansTree
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
public:
|
||||||
|
FThreeDGaussiansTree() {}
|
||||||
|
|
||||||
|
// Axis for split (x=0, y=1, z=2)
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "3D Gaussians") int32 splitAxis = -1;
|
||||||
|
// max value of the position of gaussian in child0 or leaf0 in "splitAxis" axis
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "3D Gaussians") float splitValue = 0.0f;
|
||||||
|
|
||||||
|
// index of child tree node (Index of TArray<FThreeDGaussiansTree> tree)
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "3D Gaussians") int32 childIndex0 = -1;
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "3D Gaussians") int32 childIndex1 = -1;
|
||||||
|
|
||||||
|
// index of child data node (Index of TArray<FThreeDGaussiansData> data)
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "3D Gaussians") int32 leafIndex0 = -1;
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "3D Gaussians") int32 leafIndex1 = -1;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* 作为3D高斯数据的载荷 */
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FThreeDGaussians
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
public:
|
||||||
|
FThreeDGaussians() {}
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "3D Gaussians") TArray<FThreeDGaussiansData> data;
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "3D Gaussians") TArray<FThreeDGaussiansTree> tree;
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
# BP_3D_Gaussians_Base
|
||||||
|
- BeginPlay:判断三维加速结构是否还子节点,如果有则开启Tick进行排序。
|
||||||
|
- Tick:根据摄像机位置对三维加速结构进行排序。
|
||||||
|
- ConstructionScript:
|
||||||
|
1. 添加Niagara粒子组件,一个FThreeDGaussiansData生成一个粒子组件。
|
||||||
|
2. 设置Niagara资产:NS_3D_Gaussians_sh0_mesh(勾选mesh选项)、NS_3D_Gaussians_sh0(SH角度)、NS_3D_Gaussians_sh1、NS_3D_Gaussians_sh2、NS_3D_Gaussians_sh3
|
||||||
|
3. 设置粒子材质属性:
|
||||||
|
1. AlbedoTint
|
||||||
|
2. 剔除设置:CropEnabled、CropTranslation、CropRotation、CropExtent
|
||||||
|
3. 数据贴图(FThreeDGaussiansData):texture_width、texture_position、texture_rotation、texture_scaleAndOpacity。
|
||||||
|
4. SH数据贴图(FThreeDGaussiansData):根据角度设置Niagara里texture_sh_X的贴图。
|
||||||
|
5. 社会中剔除空间 CropTranslations、CropRotators、CropExtents、KillTranslations、KillRotators、KillExtents。
|
||||||
|
|
||||||
|
# Niagara
|
||||||
|
剔除方式:
|
||||||
|
|
||||||
|
## 材质
|
@ -114,3 +114,26 @@ else if(ShadingModel == SHADINGMODELID_NPRSHADING)
|
|||||||
## 光照实现
|
## 光照实现
|
||||||
- ShadingModel.ush,BxDF实现。
|
- ShadingModel.ush,BxDF实现。
|
||||||
- DeferredLightingCommon.ush,延迟光照实现。
|
- DeferredLightingCommon.ush,延迟光照实现。
|
||||||
|
|
||||||
|
# UE5版本
|
||||||
|
- 5.2 https://zhuanlan.zhihu.com/p/658700282
|
||||||
|
- 5.1 https://zhuanlan.zhihu.com/p/565837897
|
||||||
|
|
||||||
|
# 相关文件
|
||||||
|
- UMaterialInterface、UMaterial、UMaterialInstance、FMaterial、FMaterialResource、FMateialRenderProxy、FMaterialInstanceResource、FDefaultMaterialInstance
|
||||||
|
- MaterialShader.cpp
|
||||||
|
- HLSLMaterialTranslator.cpp
|
||||||
|
- MaterialHLSLEmitter:塞入ShaderModel宏
|
||||||
|
- Material.cpp:开启引脚
|
||||||
|
- MaterialAttributeDefinitionMap.cpp
|
||||||
|
- ShaderMaterialDerivedHelpers.cpp
|
||||||
|
- ShaderGenerationUtil.cpp
|
||||||
|
- ShadingCommon.ush
|
||||||
|
|
||||||
|
# Material编辑器相关代码
|
||||||
|
- FMaterialInstanceBasePropertyOverrides
|
||||||
|
- FMaterialInstanceParameterDetails
|
||||||
|
|
||||||
|
|
||||||
|
https://zhuanlan.zhihu.com/p/565776677
|
||||||
|
https://www.cnblogs.com/timlly/p/15109132.html
|
@ -21,7 +21,7 @@ https://zhuanlan.zhihu.com/p/400677108
|
|||||||
## Depth Stencil
|
## Depth Stencil
|
||||||
[0] sandbox bit (bit to be use by any rendering passes, but must be properly reset to 0 after using)
|
[0] sandbox bit (bit to be use by any rendering passes, but must be properly reset to 0 after using)
|
||||||
STENCIL LOD抖动过渡,后处理,贴花,Local光源都有使用,用来绘制临时Mask
|
STENCIL LOD抖动过渡,后处理,贴花,Local光源都有使用,用来绘制临时Mask
|
||||||
**[1] unallocated**
|
**[001] unallocated**
|
||||||
**[2] unallocated**
|
**[2] unallocated**
|
||||||
[3] Temporal AA mask for translucent object.
|
[3] Temporal AA mask for translucent object.
|
||||||
标记后TAA将不再读取History数据,用来处理半透物体的TAA问题
|
标记后TAA将不再读取History数据,用来处理半透物体的TAA问题
|
||||||
|
@ -12,7 +12,7 @@ rating: ⭐
|
|||||||
- 参考对象分析
|
- 参考对象分析
|
||||||
- 星穹铁道
|
- 星穹铁道
|
||||||
- 破晓传说
|
- 破晓传说
|
||||||
- 蓝色协议
|
- 蓝色协议3.
|
||||||
- 非人学园2
|
- 非人学园2
|
||||||
- 少女前线2 追放
|
- 少女前线2 追放
|
||||||
- 明日方舟终末地
|
- 明日方舟终末地
|
||||||
@ -29,6 +29,13 @@ rating: ⭐
|
|||||||
5. 实现一波Anti-Lut。
|
5. 实现一波Anti-Lut。
|
||||||
6. Toon曝光偏移、模仿李兄的暗处的ShadowColor适配。
|
6. Toon曝光偏移、模仿李兄的暗处的ShadowColor适配。
|
||||||
|
|
||||||
|
# 渲染功能兼容的游戏
|
||||||
|
- [ ] 罪恶装备
|
||||||
|
- [ ] 原神
|
||||||
|
- [ ] 星穹铁道
|
||||||
|
- [ ] 绝区零
|
||||||
|
- [ ] 蓝色协议
|
||||||
|
|
||||||
# 卡通渲染引擎功能总览(按照渲染顺序进行排序)
|
# 卡通渲染引擎功能总览(按照渲染顺序进行排序)
|
||||||
- GBuffer For ToonShaderModel
|
- GBuffer For ToonShaderModel
|
||||||
- [[GBuffer&Material&BasePass]]
|
- [[GBuffer&Material&BasePass]]
|
||||||
@ -102,7 +109,6 @@ rating: ⭐
|
|||||||
- [ ] 丝袜 https://zhuanlan.zhihu.com/p/636157482
|
- [ ] 丝袜 https://zhuanlan.zhihu.com/p/636157482
|
||||||
|
|
||||||
[[厚涂风格研究与开发笔记]]
|
[[厚涂风格研究与开发笔记]]
|
||||||
|
|
||||||
- ShaderModel
|
- ShaderModel
|
||||||
- 分阶着色
|
- 分阶着色
|
||||||
- 二阶化:
|
- 二阶化:
|
||||||
|
@ -1,73 +1,73 @@
|
|||||||
---
|
---
|
||||||
title: Material&BasePass
|
title: GBuffer&Material&BasePass
|
||||||
date: 2023-12-08 17:34:58
|
date: 2023-12-08 17:34:58
|
||||||
excerpt:
|
excerpt:
|
||||||
tags:
|
tags:
|
||||||
rating: ⭐
|
rating: ⭐
|
||||||
---
|
---
|
||||||
# GBuffer
|
|
||||||
|
# # GBuffer
|
||||||
|
UE5 GBuffer内容:
|
||||||
|
[[UE GBuffer存储数据]]
|
||||||
```c#
|
```c#
|
||||||
OutGBufferA = WorldNormal/PerObjectGBufferData
|
OutGBufferA = WorldNormal/PerObjectGBufferData
|
||||||
OutGBufferB = Metallic/Specular/Roughness/EncodeShadingModelIdAndSelectiveOutputMask(GBuffer.ShadingModelID, GBuffer.SelectiveOutputMask);
|
OutGBufferB = Metallic/Specular/Roughness/EncodeShadingModelIdAndSelectiveOutputMask(GBuffer.ShadingModelID, GBuffer.SelectiveOutputMask);
|
||||||
OutGBufferC = BaseColor/GBufferAO
|
OutGBufferC = BaseColor/GBufferAO
|
||||||
OutGBufferD = GBuffer.CustomData;
|
OutGBufferD = GBuffer.CustomData;
|
||||||
OutGBufferE = GBuffer.PrecomputedShadowFactors;
|
OutGBufferE = GBuffer.PrecomputedShadowFactors;
|
||||||
|
|
||||||
|
// 0..1, 2 bits, use CastContactShadow(GBuffer) or HasDynamicIndirectShadowCasterRepresentation(GBuffer) to extract
|
||||||
|
half PerObjectGBufferData;
|
||||||
```
|
```
|
||||||
|
|
||||||
|
ToonGBuffer修改&数据存储:
|
||||||
```c#
|
```c#
|
||||||
GBufferB:Metallic/Specular/Roughness=>ToonHairMask OffsetShadowMask/SpcularMask/SpecularValue
|
OutGBufferA:PerObjectGBufferData => 可以存储额外的有关Tonn渲染功能参数。
|
||||||
OutGBufferD = CustomData.xyzw=》ShaderColor.rgb/NoL
|
OutGBufferB:Metallic/Specular/Roughness =>
|
||||||
OutGBufferE = GBuffer.PrecomputedShadowFactors.xyzw=》 /RimLightMask/DiffuseOffset/RimLightWidth
|
? / SpcularMask(控制高光形状与Mask) / ? / ?
|
||||||
OutGBufferF = velocity => OutlineWidth/OutlineID/OutlinePaint/OutlineZShift
|
//ToonHairMask OffsetShadowMask/SpcularMask/SpecularValue
|
||||||
|
OutGBufferD:CustomData.xyzw =>
|
||||||
|
ShaderColor.rgb / NoLOffset //ShadowColor这里可以在Material里通过主光向量、ShadowStep、Shadow羽化计算多层阴影效果。
|
||||||
|
OutGBufferE:GBuffer.PrecomputedShadowFactors.xyzw =>
|
||||||
|
ToonDataID/ ToonObjectID(判断是否是一个物体) /OutlineMask 控制Outline绘制以及Outline强度 / ToonAO
|
||||||
|
OutGBufferF:velocity =>
|
||||||
|
? / ? / ? / ?
|
||||||
```
|
```
|
||||||
|
|
||||||
```
|
蓝色协议的方案
|
||||||
| GBuffer | 表头 |
|
![[蓝色协议的方案#GBuffer]]
|
||||||
| -------- | ------------------------------------------------------------------------------------- |
|
|
||||||
| GBufferB | OffsetShadowMask SpcularMask SpecularValue EncodeShadingModelIdAndSelectiveOutputMask |
|
|
||||||
| GBufferD | ShaderColor.rgb NoL |
|
|
||||||
| GBufferE | |
|
|
||||||
| GBufferF | ID |
|
|
||||||
```
|
|
||||||
|
|
||||||
## BaseColor与ShadowColor
|
## Toon PerObjectGBufferData具体功能表
|
||||||
- 原神里ShadowColor还会接收其他物体的阴影投射,没有自投影;蓝色协议可能也没有自投影。
|
从3开始,0、1、2已被占用。
|
||||||
|
- ?
|
||||||
|
|
||||||
BaseColor与ShadowColor的过渡需要Step、Feather、Offset等参数,可以直接制作一个HalfLambert的渐变贴图之后使用View传递。因为有多个贴图所以还需要ID贴图指定。但这样需要考虑一个问题:
|
## ToonData
|
||||||
|
|
||||||
- 一个物体上的同一个ID区域的BaseColor与ShadowColor是否都是一样的
|
|
||||||
- 如果不一样就需要再传递一个ShadowColor.rgb到GBuffer里。
|
|
||||||
- 不管如何手绘的补充暗部也是需要加到GBuffer中的
|
|
||||||
|
|
||||||
这决定传递到View里面的渐变贴图是彩色还是暗色
|
|
||||||
|
|
||||||
### 预计算贴图方案(构想)
|
|
||||||
Toon渲染一般会使用HalfLambda。之后使用Feather、Step等参数对过渡边界进行调整
|
|
||||||
使用 渐变贴图查表来实现 渐变、二阶化。以此代替羽化、step等参数。
|
|
||||||
使用ID贴图指定,或者通过BaseColor值来查询?
|
|
||||||
|
|
||||||
## 高光
|
## 高光
|
||||||
- PBR高光(使用Roughness控制是否可行?是否需要传入GBuffer一个Mask贴图)
|
- PBR高光(使用Roughness控制是否可行?是否需要传入GBuffer一个Mask贴图)
|
||||||
- 自定义高光:高光贴图、高光颜色、参数化高光形状、多层高光
|
- 自定义高光:高光贴图、高光颜色、参数化高光形状、多层高光
|
||||||
|
|
||||||
## 描边
|
# 顶点色
|
||||||
- 原神的描边好像是后处理
|
## 蓝色协议
|
||||||
- 蓝色协议
|
|
||||||
![[08-Assets/Images/ImageBag/UrealEngineNPR/原神_描边.png]]
|
|
||||||
![[08-Assets/Images/ImageBag/UrealEngineNPR/原神截图_描边.png]]
|
|
||||||
|
|
||||||
TODO:考虑使用顶点色来控制宽度,使用顶点色G
|
|
||||||
|
|
||||||
## 顶点色
|
|
||||||
用于存储一些低精度数据,插值即可
|
用于存储一些低精度数据,插值即可
|
||||||
- R:
|
- 顶点色:
|
||||||
- G:描边宽度
|
- R:阴影区域控制(强度) 0~1
|
||||||
- B:
|
- G:描边宽度
|
||||||
|
- B:ToonAO
|
||||||
|
- 第二套顶点色(UV Channel1):
|
||||||
|
- R:深度偏移
|
||||||
|
- G:用来区分内轮廓不同部位的ID
|
||||||
|
|
||||||
蓝色协议的R:阴影区域标记 与 B:Ao,而罪恶装备使用贴图来传递信息。
|
蓝色协议的R:阴影区域标记 与 B:AO,而罪恶装备使用贴图来传递信息。
|
||||||
|
## 罪恶装备
|
||||||
|
对阴影判断阈值的偏移。(见前面着色部分,顶点AO+手绘修正)
|
||||||
|
R:阴影偏移
|
||||||
|
G:轮廓线根据与相机的距离扩大多少的系数
|
||||||
|
B:等高线 Z 轴偏移值
|
||||||
|
|
||||||
## lightmap
|
# 罪恶装备
|
||||||
### 罪恶装备
|
8,G为阴影控(AO),R为高光强度参数,金属和光滑材质的部分设置的更大一些。B通道:用于照明控制。最大值为高光,反之,值越小高光越淡。
|
||||||
,G为阴影控(AO),R为高光强度参数,金属和光滑材质的部分设置的更大一些。B通道:用于照明控制。最大值为高光,反之,值越小高光越淡。
|
|
||||||

|

|
||||||
|
|
||||||
https://zhuanlan.zhihu.com/p/360229590一文中介绍了崩坏3与原神的计算方式
|
https://zhuanlan.zhihu.com/p/360229590一文中介绍了崩坏3与原神的计算方式
|
||||||
@ -110,7 +110,7 @@ G : 轮廓线根据与相机的距离扩大多少的系数
|
|||||||
B : 等高线 Z 轴偏移值
|
B : 等高线 Z 轴偏移值
|
||||||
A : 轮廓厚度系数。0.5为标准,1为最大厚度,0为无等高线
|
A : 轮廓厚度系数。0.5为标准,1为最大厚度,0为无等高线
|
||||||
|
|
||||||
### 蓝色协议
|
# 蓝色协议
|
||||||
[[蓝色协议的方案]]
|
[[蓝色协议的方案]]
|
||||||
|
|
||||||
### 米哈游
|
# 米哈游
|
||||||
|
12
03-UnrealEngine/卡通渲染相关资料/渲染功能/ShaderModel/ToonShaderModel.md
Normal file
12
03-UnrealEngine/卡通渲染相关资料/渲染功能/ShaderModel/ToonShaderModel.md
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
title: ToonShaderModel
|
||||||
|
date: 2023-12-18 10:00:34
|
||||||
|
excerpt:
|
||||||
|
tags:
|
||||||
|
rating: ⭐
|
||||||
|
---
|
||||||
|
|
||||||
|
# ToonStandard(Cel打底)
|
||||||
|
|
||||||
|
|
||||||
|
# 厚涂 ShaderModel(通过修改预积分ShaderModel)
|
@ -9,6 +9,11 @@ rating: ⭐
|
|||||||
- 后处理描边
|
- 后处理描边
|
||||||
- MeshDraw描边
|
- MeshDraw描边
|
||||||
|
|
||||||
|
# 其他游戏做法
|
||||||
|
## 蓝色协议
|
||||||
|
采用后处理、Backface以及预绘制描边。
|
||||||
|
[[蓝色协议的方案#轮廓]]
|
||||||
|
|
||||||
# 杂项
|
# 杂项
|
||||||
## 李兄实现Outline思路
|
## 李兄实现Outline思路
|
||||||
### Depth与Normal描边
|
### Depth与Normal描边
|
||||||
|
@ -107,12 +107,12 @@ TAA会导致勾线变糊,所以用了UE的Responsive AA,用stencil标记了
|
|||||||
|
|
||||||
## GBuffer
|
## GBuffer
|
||||||
```c#
|
```c#
|
||||||
GBufferB:Metallic/Specular/Roughness=>ToonHairMask OffsetShadowMask/SpcularMask/SpecularValue
|
GBufferB:Metallic/Specular/Roughness => ToonHairMask OffsetShadowMask/SpcularMask/SpecularValue
|
||||||
OutGBufferD = CustomData.xyzw=》ShaderColor.rgb/NoL
|
OutGBufferD = CustomData.xyzw => ShaderColor.rgb/NoL
|
||||||
OutGBufferE = GBuffer.PrecomputedShadowFactors.xyzw=》 /RimLightMask/DiffuseOffset/RimLightWidth
|
OutGBufferE = GBuffer.PrecomputedShadowFactors.xyzw => /RimLightMask/DiffuseOffset/RimLightWidth
|
||||||
OutGBufferF = velocity => OutlineWidth/OutlineID/OutlinePaint/OutlineZShift
|
OutGBufferF = velocity => OutlineWidth/OutlineID/OutlinePaint/OutlineZShift
|
||||||
```
|
```
|
||||||
关闭角色的预计算阴影。
|
PS.需要关闭角色的预计算阴影。
|
||||||
|
|
||||||
## 管线
|
## 管线
|
||||||

|

|
1
07-Other/Node.js/前后端API管理工具.md
Normal file
1
07-Other/Node.js/前后端API管理工具.md
Normal file
@ -0,0 +1 @@
|
|||||||
|
1. Apifox
|
45
07-Other/Node.js/在Nodejs中使用Axios下载文件的方法.md
Normal file
45
07-Other/Node.js/在Nodejs中使用Axios下载文件的方法.md
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
# 参考
|
||||||
|
- https://blog.csdn.net/clearlxj/article/details/108264141
|
||||||
|
|
||||||
|
>查看源码发现axios返回的内容默认是Stream格式的;
|
||||||
|
如果没有设置responseType的话,返回内容将会从Stream转为Buffer再转为String;
|
||||||
|
如果responseType为stream的话不进行转换;
|
||||||
|
如果responseType为arraybuffer的话将Stream转为Buffer;
|
||||||
|
但是如果想把Buffer转为String再转回Buffer的话将会出问题(默认使用utf8进行Buffer的编码和解码),有的文件这样是可以的,但是Excel文件这样做的话两次Buffer的值是不同的;但是转为base64的话是都可以的。
|
||||||
|
|
||||||
|
|
||||||
|
# 设置responseType为stream
|
||||||
|
```js
|
||||||
|
const result = await require('axios')({ url, method, data, responseType: 'stream' });
|
||||||
|
result.data.pipe(require('fs').createWriteStream(saveFilePath));
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
提供buffer转Stream并保存为文件的方法
|
||||||
|
```js
|
||||||
|
function bufferToStream(bufferData, saveFilePath) {
|
||||||
|
return new Promise((res, rej) => {
|
||||||
|
const bufferStream = new stream.PassThrough();
|
||||||
|
bufferStream.end(bufferData);
|
||||||
|
const ws = fs.createWriteStream(saveFilePath);
|
||||||
|
bufferStream.pipe(ws).on('finish', () => {
|
||||||
|
res(saveFilePath);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
# 设置responseType为arraybuffer
|
||||||
|
```js
|
||||||
|
const result = await require('axios')({ url, method, data, responseType: 'arraybuffer' });
|
||||||
|
const bufferData = result.data;
|
||||||
|
await bufferToStream(bufferData, saveFilePath);
|
||||||
|
```
|
||||||
|
|
||||||
|
# 不设置responseType,设置responseEncoding为base64
|
||||||
|
```js
|
||||||
|
const result = await require('axios')({ url, method, data, responseEncoding: 'base64' });
|
||||||
|
const bufferData = Buffer.from(result.data, 'base64');
|
||||||
|
await bufferToStream(bufferData, saveFilePath);
|
||||||
|
```
|
BIN
08-Assets/Images/ImageBag/Images/20231025141028.png
Normal file
BIN
08-Assets/Images/ImageBag/Images/20231025141028.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 288 KiB |
BIN
08-Assets/Images/ImageBag/Images/20231025141119.png
Normal file
BIN
08-Assets/Images/ImageBag/Images/20231025141119.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 288 KiB |
BIN
08-Assets/Images/ImageBag/Images/20231025144447.png
Normal file
BIN
08-Assets/Images/ImageBag/Images/20231025144447.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 357 KiB |
BIN
08-Assets/Images/ImageBag/RuntimeModifyAnimSequence.png
Normal file
BIN
08-Assets/Images/ImageBag/RuntimeModifyAnimSequence.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 74 KiB |
Loading…
x
Reference in New Issue
Block a user