Unreal——Shader初探(一)

使用Shader文件

在项目根目录新建一个文件夹Shaders,新建shader文件,必须以.usf 或者.ush 结尾。

通过添加一个custom node,在code中添加代码,在Gaussian Blur中添加

1
2
#include "C:/UGit/Shader/CustomShaders/CustomShadersStarter/Shaders/Gaussian.usf"
return 1;

然后在Gaussian.usf中填充shader

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
static const int SceneTextureId = 14;
float2 TexelSize = View.ViewSizeAndInvSize.zw; //将偏移量转换到UV空间
float2 UV = GetDefaultSceneTextureUV(Parameters, SceneTextureId); //当前像素的UV
float3 PixelSum = float3(0, 0, 0); //将内核(kernel)中每一个像素的颜色累加(sum)起来。
float WeightSum = 0; //将内核中每一个像素的权重累加起来。

for (int x = -Radius; x <= Radius; x++) //水平方向
{
for (int y = -Radius; y <= Radius; y++) //垂直方向
{
float2 Offset = UV + float2(x, y) * TexelSize; //计算采样像素的相对偏移量并将其转换为UV空间
float3 PixelColor = SceneTextureLookup(Offset, SceneTextureId, 0).rgb; //经过偏移量对场景纹理进行采样
float Weight = Calculate1DGaussian(x / Radius) * Calculate1DGaussian(y / Radius); //计算采样像素的加权。为了计算二维的高斯模糊,你须要将两个一维的高斯模糊相乘(multiply),除以(divide)radius是由于简化的高斯模糊公式的值域是[-1,1],因此须要将它们的值归一化。
PixelSum += PixelColor * Weight; //将加权的颜色添加到PixelSum
WeightSum += Weight; //将权重添加给WeightSum

}
}

return PixelSum / WeightSum;

image-20210726150720610

高质量实时渲染(一)

Reflective Shadow Maps(RSM)

在shadowmap上的每一个像素都是场景中表面上的一小块

假设:反射物都是diffuse

回顾:

  • 单位面积单位立体角 radiance
  • 单位立体角Radiant Intensity
  • 单位面积irradiance

MC光线追踪

在球面坐标,一个方向向量可以采用$(\theta,\phi)$来表示,分别为天顶角和方位角,立体角定义为
$$
dw=\frac{dA}{r^2}
$$
在单位球体上,$dw=dA$,我们转换用$(\theta,\phi)$求微分面积,根据弧长公式

$$
\begin{align}
s_{\theta}&=\theta * r_{\theta} \\
s_{\phi}&=\phi * r_{\phi} \\
d_{s \theta}&=r_{\theta} d \theta \\
d_{s \phi}&=r_{\phi} d \phi
\end{align}
$$

微分面积$dA$可以看作为一个微矩形,宽高为$d_{r\phi}$和$d_{r\theta}$,对于单位球体,$r_\theta=1,r_{\phi}=r_{\theta}*sin$

$$
dw=dA=d_{s\theta}*{s\phi}=sin\theta d\theta d\phi
$$
可对材质表面进行brdf采样,也可对光源进行直接采样

直接光源采样

$\alpha$夹角是采样方向向量与光源矩形表面法线向量的夹角,$dAcos\alpha$就是将矩形微分表面$dA$投影到采样方向$pq$上。
$$
d \omega=\frac{d A * \cos \alpha}{|p q|^{2}}
$$
我们对$dA$的采样概率应该是$\frac{dA}{A}$,在球体方向对立体角$d\omega$的采样概率为$p(direction)d\omega$,$p(direction)$为假定对光源直接采样的概率密度函数
$$
p(direction)*\frac{d A * \cos \alpha}{|p q|^{2}}=\frac{dA}{A}\
\rightarrow p(direction)=\frac{|p q|^{2}}{Acos\alpha}
$$

Unreal学习开发(二)

动态多播代理

例子1

1
2
3
4
5
6
DECLARE_DYNAMIC_MULTICAST_DELEGATE_SixParams(FOnHealthChangedSignature, USHealthComponent*, OwningHealthComp,
float, Health, float, HealthDelta, const class UDamageType*, DamageType, class AController*, InstigatedBy, AActor*, DamageCauser);//1.宏声明一个自定义delegate类型
FOnHealthChangedSignature OnHealthChanged;//2.create a instance in class
HealthComp->OnHealthChanged.AddDynamic(this, &ASCharacter::OnHealthChanged);//3.增加动态代理,一旦broadcast,执行ASCharacter::OnHealthChanged中的函数。
OnHealthChanged.Broadcast(this, Health, Damage, DamageType, InstigatedBy, DamageCauser);//4.触发代理Broadcast
FOnHealthChangedSignature OnHealthChanged;

例子2

Actor自带的代理(OnTakeAnyDamage

Called when the actor is damaged in any way.

1
2
3
4
DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_NineParams( FTakePointDamageSignature, AActor, OnTakePointDamage, AActor*, DamagedActor, float, Damage, class AController*, InstigatedBy, FVector, HitLocation, class UPrimitiveComponent*, FHitComponent, FName, BoneName, FVector, ShotFromDirection, const class UDamageType*, DamageType, AActor*, DamageCauser );//1.
FTakeAnyDamageSignature OnTakeAnyDamage;//2.
MyOwner->OnTakeAnyDamage.AddDynamic(this, &USHealthComponent::HandleTakeAnyDamage);//3.
OnTakePointDamage.Broadcast(this, ActualDamage, EventInstigator, PointDamageEvent->HitInfo.ImpactPoint, PointDamageEvent->HitInfo.Component.Get(), PointDamageEvent->HitInfo.BoneName, PointDamageEvent->ShotDirection, DamageTypeCDO, DamageCauser);//4.Broadcast

Unreal学习开发(一)

Actor

An Actor is any object that can be placed into a level, such as a Camera, static mesh, or player start location. Actors support 3D transformations such as translation, rotation, and scaling. They can be created (spawned) and destroyed through gameplay code (C++ or Blueprints).

In C++, AActor is the base class of all Actors

Each actor has a instigator, in new version it is private so ues GetInstigator() to get it .

Delegates

Data types that reference and execute member functions on C++ Objects.

Pawn

Pawn是可作为世界场景中”代理”的Actor。Pawn可被控制器所有,

    • AAIController

Character

PlayerInputComponent

Character basic control animation

Controller

  • AController
    • PlayerController
    • AAIController

Weapon class

Add damage to a target dummy

  • TSubclassOf

    1
    2
    3
    /** type of damage */
    UPROPERTY(EditDefaultsOnly, Category=Damage)
    TSubclassOf<UDamageType> DamageType;

    Let designer choose demage type.

  • Spawn an actor in world.

1
GetWorld()->SpawnActor<AActor>(ProjectileClass);

Weapon to Character need to set owner.

TPSCamera

1
CameraComp->SetFieldOfView(FOV);

terminology

OKR: Objective and key results

Muzzle: 枪口

Replicated:同步给服务端

定义component 起始字母为U(Uobject),Actor 为A(Actor)

Black Magic

UE_4.26\Engine\Binaries\Win64 下UnrealHeaderTool.target

TypeName 行尾加一个空格。

可以加快编译速度。

UE4 定义属性修饰符总结

UE4C++定义属性修饰符总结 - 烤肉酱 - 博客园 (cnblogs.com)

Reference

虚幻引擎4文档 | 虚幻引擎文档 (unrealengine.com)

Unreal Engine 4 Mastery

从图片上重新采样曲线

最近一直有一个需求是从已知连续曲线上取点重新resample,这个虽然不难实现,但是标点转换点坐标很是麻烦,所以我找了下市面的软件,看有没有工具可以帮助实现这个。OriginPro是具有这个功能的,打开它的Digitizer 就可以进行操作。

界面如下

origindigitizer

OriginPro tools=> Digitizer

import image

manully pick points

Results => go to data && go to image

之后我觉得可以实现一个简单的网页版,可以用起来方便一些。

Linux解决multiple Definition的链接错误

当我们在跨平台开发的时候,windows上的版本通常使用visual studio 进行编译,但是到了linux环境下却发现会出现multiple-definition的问题。

先分析下从源码编译到可执行文件的过程:

  1. 预处理将伪指令(宏定义、条件编译、引用头文件)特殊符号进行处理
  2. 编译过程通过词法分析、语法分析生成汇编代码,此步还会进行优化
  3. 汇编过程将汇编代码翻译为目标机器指令的过程(.o 文件 包含代码段和数据段)
  4. 链接程序将所有需要用到的目标代码(变量函数、其他库文件)装配到一个整体(可分为静态链接和动态链接)

前三个步骤为编译过程,第四个为链接过程

我们这个链接失败的原因就是,C语言规定 一个变量可以多次声明但只能定义一次,所以每个头文件需要加宏定义的条件编译,但c++中链接错误同样会发生 原因为ifndef 作用域仅在单个文件,所以还是会出现重复定义的错误。
在Windows环境中,链接器-》命令行-》添加/force 即可。

在Linux环境中,最简单的解决方法就是编译命令加上以下

1
-Wl,--allow-multiple-definition

Example:

1
g++ -fopenmp -o Multiblock3d testSinglePhaseRender.o simpleBlock3d.o string_extra.o propagate.o Ocblock.o objLoader.o obj_parser.o mlStreamGpu.o mlCuRunTime.o mlCollideGpu.o mlCalMacroGpu.o mlBndConditionGpu.o list.o geometry3D.o colorramp.o -lcudart -L/usr/local/cuda/lib64 -Wl,--allow-multiple-definition

原文地址:https://www.cnblogs.com/edwardcmh/archive/2013/06/09/3129364.html

CMake使用的一些基本操作

CMake使用的一些基本操作

cmake cookbook

https://chenxiaowei.gitbook.io/cmake-cookbook/5.0-chinese/5.6-chinese

cuda 模板

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
29
30
31
32
33
34
35
36
37
38
39
40
#MakeLists.txt for G4CU project
project(test_cuda_project)
# required cmake version
cmake_minimum_required(VERSION 2.8)
# packages
find_package(CUDA)

if(${CUDA_FOUND})
include_directories(${CUDA_INCLUDE_DIRS})
link_directories($ENV{CUDA_PATH}/lib/x64)
else(${CUDA_FOUND})
MESSAGE(STATUS "cuda not found!")
endif(${CUDA_FOUND})
FIND_PACKAGE( OpenMP REQUIRED)
if(OPENMP_FOUND)
message("OPENMP FOUND")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
endif()

INCLUDE_DIRECTORIES(/usr/local/cuda/samples/common/inc)
INCLUDE_DIRECTORIES(/usr/local/cuda/include)
INCLUDE_DIRECTORIES(/usr/local/cuda/include)
# nvcc flags
#set(CUDA_NVCC_FLAGS -gencode arch=compute_20,code=sm_20;-G;-g)
#set(CUDA_NVCC_FLAGS -gencode arch=compute_52,code=sm_52;-G;-g)
# 添加要编译的库
#add_library(gpu SHARED ${CURRENT_HEADERS} ${CURRENT_SOURCES})
set_source_files_properties(test.cpp PROPERTIES CUDA_SOURCE_PROPERTY_FORMAT OBJ)
file(GLOB_RECURSE CURRENT_HEADERS *.h *.hpp *.cuh)
file(GLOB CURRENT_SOURCES *.cpp *.cu .cc)
source_group("Include" FILES ${CURRENT_HEADERS})
source_group("Source" FILES ${CURRENT_SOURCES})
link_directories(
/usr/local/cuda/lib64
)
CUDA_ADD_EXECUTABLE(test ${CURRENT_HEADERS} ${CURRENT_SOURCES})

target_link_libraries(test cudart)

Normal project

1
2
3
4
5
6
7
8
9
10
cmake_minimum_required(VERSION 2.8)
PROJECT (HELLO)
#SET(SRC_LIST container.cpp)
AUX_SOURCE_DIRECTORY(. SRC_LIST)
add_definitions("-Wall -std=c++11")
MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir " ${HELLO_SOURCE_DIR})
#ADD_SUBDIRECTORY(src)
set(SOURCES math/circle.cpp ./container.cpp)
ADD_EXECUTABLE(container ${SRC_LIST} ./math/circle.cpp)

选择windows studio指定版本编译

1
cmake -G "Visual Studio 14 2015 Win64" ..

conda 命令笔记

1
2
3
conda create --name your_env_name
conda create --cs231n python=3.7
conda create --name your_env_name numpy scipy

列举当前所有环境

1
2
conda info --envs
conda env list

复制某个环境

1
conda create --name new_env_name --clone old_env_name 1

删除某个环境

1
conda remove --name your_env_name --all

导出导入环境配置

1
2
conda env export > environment.yml
conda env create -f environment.yml

包管理

1
conda list

列举一个非当前活跃环境下的所有包

1
conda list -n your_env_name1

为指定环境安装某个包

1
conda install -n env_name package_name

发布自己的库到pypi

以下为测试

1
2
3
4
5
6
7
8
9
10
mkdir lbmblood_package
cd lbmblood_package/
mkdir lbmblood
cd lbmblood
new lbmblood.py
new __init__.py
cd ..
new setup.py
new LICENSE
new README.md
1
2
3
4
from __future__ import absolute_import
from .lbmblood import *

name= "lbmblood"
1
2
3
4
5
python -m pip install --user --upgrade setuptools wheel
python setup.py sdist bdist_wheel
python -m pip install --user --upgrade twine
python -m twine upload dist/*
pip install lbmblood==0.0.1

/usr/bin/ g++

阻尼边界条件

impedance boundary condition

To prevent reflection of the pressure wave, the rate of momentum change in the control
volume and the incoming momentum flux have to balance to zero:

Vy: this component is computed from the non-equilibrium bounce-back in vertical direction:

Boundary layer thickness

Physically Based Rendering

const float w_cas_cpu[27] = { 8.0f / 27, 2.0f / 27, 2.0f / 27, 2.0f / 27, 2.0f / 27, 2.0f / 27,
2.0f / 27, 1.0f / 54, 1.0f / 54, 1.0f / 54, 1.0f / 54, 1.0f / 54, 1.0f / 54, 1.0f / 54,
1.0f / 54, 1.0f / 54, 1.0f / 54, 1.0f / 54, 1.0f / 54,
1.0f / 216, 1.0f / 216, 1.0f / 216, 1.0f / 216, 1.0f / 216, 1.0f / 216, 1.0f / 216, 1.0f / 216 };

Inlet - Zouhe

normal boundary - bounce-back

outlet - Impedance characteristic-based boundary condition.

看看impedance-boundary condition.

计算channel flow boundary layer thickness

如何增加sample

根据channel flow boundary layer thickness 条件

分析两种情况管道变细,

1.分辨率较少如果sample点变少,会导致drag force增加,流速不一定增快。

2.分辨率足够,sample点变少,导致流速增快。

http://www.pbr-book.org/3ed-2018/contents.html

1564494442206