diff --git a/2st_encode/2st_encode.assets/triangulation.png b/2st_encode/2st_encode.assets/triangulation.png new file mode 100644 index 0000000..441c458 Binary files /dev/null and b/2st_encode/2st_encode.assets/triangulation.png differ diff --git a/2st_encode/2st_encode.md b/2st_encode/2st_encode.md index d22fdd5..93eed2e 100644 --- a/2st_encode/2st_encode.md +++ b/2st_encode/2st_encode.md @@ -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: diff --git a/README.md b/README.md index afca8ff..f36999e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,13 @@ +# 总体方案 + +一级编码(文件)为一张彩绘的最简表示,支持图层嵌套、迭代函数系统等操作; + +二级编码(缓存,数个SSBO)为实时渲染时所需的数据,只接收图元及其位置变换信息和加速结构 + +读取一级编码后,须将所有嵌套和迭代解开,得到一系列组成图案的最原始的部件即图元及其位置变换,并对图元和图元内部都建立加速结构,处理得到二级编码。 + # ArchitectureColoredPainting 编码方案 + ``` └─1st_encode 第一层编码 │ byte.md 二进制字节码编码方案