Prechádzať zdrojové kódy

feat: 添加视野范围的实现

nicetry12138 1 rok pred
rodič
commit
625e6863b1

BIN
图形学/着色器/Image/011.png


BIN
图形学/着色器/Image/012.png


BIN
图形学/着色器/Image/013.png


BIN
图形学/着色器/Image/014.png


BIN
图形学/着色器/Image/015.png


BIN
图形学/着色器/Image/016.png


BIN
图形学/着色器/Image/017.png


BIN
图形学/着色器/Image/018.png


+ 46 - 0
图形学/着色器/REAME.md

@@ -185,3 +185,49 @@ void mainImage( out vec4 fragColor, in vec2 fragCoord )
 ```
 
 > `length` 计算当前片段的坐标点到原点的距离
+
+## 视野范围
+
+![](Image/011.png)
+
+简单实现原理
+
+1. `Actor` 身上挂一个 `Plane`
+2. `Plane` 根据 `Radius` 做缩放,根据 `Angle` 做夹角限制, `Shader` 里携程扇形 `Fan`
+3. 在扇形 `Fan` 基础上,根据像素是否被障碍物遮挡,做剔除
+
+> 类似 ShadowMap,需要使用**深度图**
+
+就是要绘制一个圆形出来,uv 两轴的取值范围是 0~1,所以 `uv * 2 - 1` 然后通过 `length` 计算点到圆形半径,小于 1 显示,否则不显示
+
+根据向量点乘可以计算向量之间的夹角,指定角度之内的显示,之外的不显示
+
+![](Image/012.png)
+
+> UE 封装了 `VectorToRadialValue` 节点可以方便的获取 `UV` 转到圆的各个参数
+
+![](Image/013.png)
+
+然后一个做法是,给角色一个相机专门用来获取深度信息,根据像素的坐标和深度图的信息可以计算得到像素点是否应该被绘制
+
+另一个做法是使用射线检测,将射线检测到的点通过顺序连线构成一个多边形,并绘制到一个 `RenderTarget` 中
+
+![](Image/014.png)
+
+![](Image/015.png)
+
+使用上图所示的结构体和接口,可以绘制多个三角形到 `Render Target 2D` 中,注意每个点的颜色和透明度都要设置,并且透明度一定要不能忘记,否则点是透明的显示效果是错误的
+
+在绘制之前需要使用 `Clear Render Target 2D` 来清除 `RenderTarget` 中的内容,防止上一帧的数据影响这一帧的内容
+
+这里使用射线检测,存储点的信息
+
+![](Image/016.png)
+
+根据射线检测的 `HitResult` 可以获得射线检测的碰撞信息、起始点、终点、碰撞点,将碰撞点映射到 `RenderTarget` 贴图上
+
+![](Image/017.png)
+
+然后在材质中根据贴图采样和原本的扇形进行运算,得到重合区域,将其显示出来
+
+![](Image/018.png)