8.17会议存档
parent
469c0bf328
commit
a0a72e1f19
Binary file not shown.
After Width: | Height: | Size: 31 KiB |
|
@ -20,9 +20,25 @@
|
|||
|
||||
# 二级编码结构
|
||||
|
||||
首先分为图元和索引两大块,图元内坐标范围为-1到1,一张图中可能有多个相同的图元,这些图元只需在图元缓存中保存一次,为了记录图元的位置和变换信息,对图元建立一个索引结构,同时为了方便求交,使用BVH层次包围盒结构,BVH每个结点包含bvhChildren(每个结点的两个儿子,x分量为左儿子,y分量为右儿子)和bound(包围盒坐标,QVector4D(左下角x,左下角y,右上角x,右上角y)),BVH的最后一个结点的左儿子为图元索引加上BVH数组长度,右儿子特殊处理为图元zIndex和逆时针旋转角度。
|
||||
首先分为图元和索引两大块,图元内坐标范围为-1到1,一张图中可能有多个相同的图元,这些图元只需在图元缓存中保存一次,为了记录图元的位置和变换信息,对图元建立一个索引结构,同时为了方便求交,使用BVH层次包围盒结构,BVH每个结点包含bvhChildren(每个结点的两个儿子,x分量为左儿子,y分量为右儿子)和bound(包围盒坐标,QVector4D(左下角x,左下角y,右上角x,右上角y)),BVH的最后一个结点的左儿子为图元索引加上BVH数组长度,右儿子特殊处理为图元zIndex和逆时针旋转角度。测试得到在重叠较少且不处理叶子结点内部的情况下,得到当叶子结点数量达到30000时,在我的笔记本(NVIDIA GeForce GTX 1650 Ti)上以1898x995分辨率渲染能维持32帧左右。
|
||||
|
||||
图元由轮廓包围的封闭图形和线条构成,轮廓可以由直线、二阶贝塞尔曲线和三阶贝塞尔曲线组成,支持任意数量轮廓围成的图形的渲染,轮廓围成的图形中不能含有空腔,对于一个复杂的含有许多轮廓的封闭图形而言,应当将其分割成数个由三段轮廓线包围的广义三角形,并对这些广义三角形以及不构成图形的线条建立BVH索引,图元内BVH索引存储在外部BVH数组后。
|
||||
图元由轮廓包围的封闭图形和线条构成,封闭图形中允许有空洞,轮廓可以由直线、二阶贝塞尔曲线和三阶贝塞尔曲线组成。实验遍历一个图形的所有轮廓线判断是否有交点进而根据交点数判断点是否在图形内部的方法,得到当轮廓数量达到600时,在我的笔记本上以1898x995分辨率渲染只能维持13帧,考虑将图形分割并建立加速结构。
|
||||
|
||||
使用3种操作来绘制任意图元:
|
||||
|
||||
1. 对一块矩形区域填充一次
|
||||
2. 对一块矩形区域擦除一次
|
||||
3. 一块矩形区域中包含一条曲线,该曲线在矩形区域中每一个x和y都一一对应,且曲线的端点落在矩形端点,在矩形区域中对曲线一侧的区域填充一次
|
||||
|
||||
对于每个像素维护一个int变量,填充时对其+1,擦除时对其-1,最终该变量的取值应为0或1,1即表示像素点在图形内部。
|
||||
|
||||
对于任意图形,均可使用一系列上述三种操作来绘制,生成这些操作的方法有待验证。
|
||||
|
||||
|
||||
|
||||
一开始我们考虑将图形做三角划分,再对划出的三角形建立BVH树,下面为按该方式制定的二级编码即缓存结构:
|
||||
|
||||
![image-20220817102607509](2st_encode.assets/triangulation.png)
|
||||
|
||||
compute shader接收的6个buffer:
|
||||
|
||||
|
|
Loading…
Reference in New Issue