转载于小道的博客园

XDGE_RayMarchine 1- 利用Frag Shader绘制图形​www.cnblogs.com

# Render/RayMarchine/Base 1- 利用Frag绘制图形

@author: 白袍小道-胡言乱语

@Read: 转载说明

[TOC]

## 前言

**1、RayMarching**

*光线行进**,从摄像机向屏幕上的每一个像素发射一条光线,光线按照一定步长前进,检测当前光线距离物体表面的距离,并且根据这个距离调整光线的步长,直到抵达物体表面。

**2、Frag绘制图形**

在片段着色阶段去执行,这里注意一下

```c++

//1、片段后还有光栅,光栅的采样会有可能导致1-N 星盘

//2、片段还有机会可以改变SV_Depth

```

## 正文

这里强调一下RayMarching,更加关注的如何利用这个原理。是否从屏幕上每个Pixel出发,还是看需求。

RayMarching可以参考:

fractals, computer graphics, mathematics, shaders, demoscene and more

ShinaMashiro:Unity中用RayMarching玩个球

### 目的

获取是否相交,相交的信息,我们就可以对该片元处理

### Frag绘制图形

除了纹理和顶点描述,我们还可以有一种手段去做一些简单的图形。

这种手段基础:利用顶点到着色着色进行了线性的插值,然后在片元着色中,我们可以利用这些信息(如UV或者Proj, 坐标转到屏幕坐标),按照图形(求交)搞事情(非标准语言)。

#### 绘制图形

这里因为是测试案例,直接作为特殊后期屏幕Quad绘制。

(偷懒一下,直接作为PostProcess阶段前插入一个RayMachineRCMD来执行。其中RCMD为XDGameEngine封装的一个,Quad为屏幕Mesh)

```

XDGameEngine_GraphicsUtility.BlitSRT(pPostContext.PostRenderCMD, pPostContext.SrcColorBuffer,BuiltinRenderTextureType.CameraTarget,_EffectMat,0);

```

其中BlitSRT就是一个向目标(这里由于不需要做DownSample什么的,就直接用了Context内置)绘制,

```

public void BlitSRT(CommandBuffer buffer, XDGTexture source, XDGRenderTargetIdentifier destination,

Material mat, int pass)

{

//buffer.SetGlobalTexture(XDGameEngine_GraphicsShaderID._MainTex, source);

mat.SetTexture(XDGameEngine_GraphicsShaderID._MainTex, source);

buffer.SetRenderTarget(destination);

buffer.DrawMesh(mesh, Matrix4x4.identity, mat, 0, pass);

}

```

备注:(直接用SV_Target,也可以自己包一个Struct包含SVDepth 后续来做脑洞)

### 求交

#### 基础求交

直线包含公式:两点之间

```glsl

float4 XD_Ray_Line2D(float2 pos, float2 point1, float2 point2, float width, float3 color, float antialias)

{

float k = (point1.y - point2.y)/(point1.x - point2.x);

float b = point1.y - k * point1.x;

float d = abs(k * pos.x - pos.y + b) / sqrt(k * k + 1);

float t = smoothstep(width/2.0, width/2.0 + antialias, d);

return float4(color, 1.0 - t);

}

```

圆形包含公式:距离圆心和半径

```glsl

float4 XD_Ray_circle(float2 pos, float2 center, float radius, float3 color, float antialias)

{

float d = length(pos - center) - radius;

float t = smoothstep(0, antialias, d);

return float4(color, 1.0 - t);

}

```

三角形包含公式:三个DOT

```glsl

float4 XD_Ray_Triangle(float2 p, float2 Pos1, float2 Pos2, float2 Pos3,float3 color)

{

float2 AB = Pos2-Pos1;

float2 BC = Pos3-Pos2;

float2 CA = Pos1-Pos3;

float2 AP = p - Pos1;

float2 BP = p - Pos2;

float2 CP = p - Pos3;

float3 cPAB = cross(float3(AP,.0),float3(AB,.0));

float3 cCAB = cross(float3(-CA,.0),float3(AB,.0));

bool bPA = dot(cPAB, cCAB) >= .0;

float3 cPAC = cross(float3(CP,.0), float3(CA,.0));

float3 cBAC = cross(float3(-BC,.0), float3(CA,.0));

bool bPC = dot(cPAC, cBAC) >= .0;

float3 cPBC = cross(float3(BP,.0), float3(BC,.0));

float3 cABC = cross(float3(-AB,.0), float3(BC,.0));

bool bPB = dot(cPBC, cABC) >= .0;

float t = bPC && bPB && bPA? 1:0;

return float4(color, t);

}

```

#### 点和多边形求交

不只是这里有用,这里就不做展开。在Render/Acc(加速),和Render/Math部分会说明。

1、面积和判断

2、奇偶

射线法不仅仅适用于规则的矩形,也适用于多边形。

沿着点做多条射线,那么每条射线就会与多边形产生n个交点(0个交点也算)。若某一条射线产生奇数个交点,那么就认定点在多边形范围内。

3、转角累加法

#### 多边形和多边形

1、分离轴定理

凸多边形的碰撞判断方式

2、凹多边形处理

把凹多边形进行分割,拆成凸多边形

3、基于四叉树

(Delevin:【OpenGL】基于四叉树的2D碰撞检测

#### 步进和二分

留作后续继续

绘制多边形_XDGE_RayMarchine 1- 利用Frag Shader绘制图形相关推荐

  1. scratch绘制多边形_如何使用Scratch 3绘制矢量图形

    scratch绘制多边形 Scratch是一种流行的视觉编程语言,用于创建视频游戏和动画. 它还具有矢量绘图工具,任何人都可以使用它来创建独特的游戏资产和艺术品. Scratch 1.0用Smallt ...

  2. XDGE_RayMarchine 1- 利用Frag Shader绘制图形

    Render/RayMarchine/Base 1- 利用Frag绘制图形 @author: 白袍小道-胡言乱语 @Read: 转载说明 目录 Render/RayMarchine/Base 1- 利 ...

  3. Render/RayMarchine/Base 1- 利用Frag Shader绘制图形

    Render/RayMarchine/Base 1- 利用Frag绘制图形 @author: 白袍小道-胡言乱语 @Read: 转载说明 目录 Render/RayMarchine/Base 1- 利 ...

  4. python绘制多边形_在python matplotlib中绘制三维多边形

    我浏览网页失败,无法找到以下简单问题的解决方案: 如何使用顶点值绘制三维多边形(例如填充矩形或三角形)? 我尝试过很多想法,但都失败了,请看:from mpl_toolkits.mplot3d imp ...

  5. python绘制气象等值线图_利用Python插值绘制等值线图

    最近需要根据有限的站位点绘制插值等值线图,在网上中文搜索一通,只发现了这货Matplot Basemap 画湖北地图.插值.等值线,要么就是对这货的转载,这货不提供数据的形式,但是基本的代码思路还是不 ...

  6. html5绘制好看的时钟,利用纯html5绘制出来的一款非常漂亮的时钟

    今天给大家分享一款非常漂亮的纯html5实现的时钟.整个界面都由html5绘制而成.一起看下效果图: 实现的代码. htm代码: XML/HTML Code复制内容到剪贴板 gradientTrans ...

  7. Unity动态绘制多边形

    使用场景: 原理 就是动态new一个Mesh,设置三角形和定点数据,然后赋值给MeshFilter,通过MeshRenderer绘制出来 步骤 1 把文章下面的脚本复制到工程中 2 在场景中创建一个空 ...

  8. Python:利用python语言绘制多个子图经典案例、代码实现之详细攻略

    Python:利用python语言绘制多个子图经典案例.代码实现之详细攻略 目录 利用python语言绘制多个子图代码实现.经典案例 1.绘制多个子图框架 多个子图绘制的经典案例 1.绘制多个直方图 ...

  9. 计算机图形学实验二交互式绘制多边形

    一.实验目的 掌握双缓冲绘图技术. (2)掌握人机交互技术. (3)掌握填充动态多边形的有效边表算法. 二.实验步骤 (1)在VS2017环境下创建MFC应用程序工程(单文档) (2)添加命令消息处理 ...

最新文章

  1. python pandas dataframe 行列选择,切片操作 原创 2017年02月15日 21:43:18 标签: python 30760 python pandas dataframe
  2. 用前序和中序重建二叉树 python
  3. y sinx matlab,有一个函数 f(x,y)=x^2+sinxy+2y ,用matlab写一个程序 输入自变量的值,输出函数的值....
  4. “63个国外优秀测试站点链接”和其他相关资料,排除了目前已失效的网站和资料链接。...
  5. 走出海量数据及访问量压力困境收藏[转]
  6. 蛇形打印数组(某宝典公司面试手撕代码题)
  7. 无服务器革命:好,坏和丑
  8. 使用正则把数字前面的符号替换_正则表达式(一) 基本表达式
  9. 隐马尔可夫(HMM)/感知机/条件随机场(CRF)----词性标注
  10. win10禁用计算机维护,win10哪些服务可以禁用 服务哪些可以禁止启动
  11. 计算机制图师岗位技能要求,机械制图员
  12. Apm飞控学习笔记-AC_PosControl位置控制-Cxm
  13. rtklib 后处理_RTKLib的Manual解读
  14. 关于段地址和偏移地址的理解
  15. python 异常学习1
  16. 优课在线 实境英语作业1Unit 1-5
  17. 数据分享|多变量多元多项式曲线回归线性模型分析母亲吸烟对新生婴儿体重影响可视化...
  18. Graphite介绍
  19. python剔除st股_如何判断某只股票过去是不是ST股
  20. linux下登录ftp

热门文章

  1. 人工智能3d建模算法_打破国外垄断,全国产3D芯片为机器人“点睛”
  2. c/c++的内存四区
  3. python内置库之学习ctypes库(一)
  4. 在linux(centos7)下本地仓库的搭建
  5. docker通过镜像方式安装tomcat
  6. 矩阵乘法的性能提升 AutoKernel
  7. 本机无法访问虚拟机上的nignx
  8. Intel发布FPGA
  9. CVPR2020:4D点云语义分割网络(SpSequenceNet)
  10. 3D-camera结构光原理