From c901292ca0b21946bc9a7c115ac2882c0bf5a5b9 Mon Sep 17 00:00:00 2001 From: wuyize Date: Tue, 9 Aug 2022 12:31:39 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E4=BA=8C=E7=BA=A7=E7=BC=96=E7=A0=81?= =?UTF-8?q?=E5=AE=8C=E5=96=84=E9=A2=9C=E8=89=B2=E6=9D=90=E8=B4=A8=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2st_encode/2st_encode.md | 140 +++++++++++++++++++++++++++++++++------ 1 file changed, 120 insertions(+), 20 deletions(-) diff --git a/2st_encode/2st_encode.md b/2st_encode/2st_encode.md index 93b38b6..9bfeea4 100644 --- a/2st_encode/2st_encode.md +++ b/2st_encode/2st_encode.md @@ -1,22 +1,47 @@ -二级编码大体结构及渲染流程如下: +目标:实现分辨率无关的、具有较高随机访问性能、相对节省显存的矢量图渲染,使得其使用方式与传统texture类似,便于在任意形状mesh中应用矢量图贴图。 -首先分为图元和索引两大块,图元内坐标范围为-1到1,一张图中可能有多个相同的图元,这些图元只需在图元缓存中保存一次,为了记录图元的位置和变换信息,对图元建立一个索引结构,同时为了方便求交,使用BVH层次包围盒结构,BVH每个结点包含leftChild,rightChild和bound即包围盒坐标,BVH的最后一个结点的leftChild为图元索引加上BVH数组长度,rightChild特殊处理为逆时针旋转角度。 +# 渲染流程 -图元由轮廓包围的封闭图形和线条构成,轮廓可以由直线、二阶贝塞尔曲线和三阶贝塞尔曲线组成,支持任意数量轮廓围成的图形的渲染,轮廓围成的图形中不能含有空腔,对于一个复杂的含有许多轮廓的封闭图形而言,应当尽可能将其分割成数个由三段轮廓线包围的广义三角形,并对这些广义三角形以及不构成图形的线条建立BVH索引,图元内BVH索引存储在外部BVH数组后。 +## 总体流程 -着色器接收的5个buffer: +1. 普通mesh将基础色、世界坐标、法线、金属度和粗糙度、彩绘编号(0)输出到gbuffer,彩绘mesh将世界坐标、法线、彩绘编号、彩绘纹理坐标输出到gbuffer; + +2. compute shader根据彩绘编号、彩绘纹理坐标gbuffer来计算彩绘纹理,更新基础色、金属度和粗糙度gbuffer; + +3. 根据基础色、世界坐标、法线、金属度和粗糙度gbuffer,以及光源计算光照。 + +后续计划实现shadow mapping。 + +## 计算彩绘纹理流程 + +彩绘由许多不同的图元组成,一个图元可以由一系列贝塞尔曲线和贝塞尔曲线封闭的图形组成,同一图元可能在彩绘中反复出现,故计算彩绘纹理的过程就是根据矢量图纹理坐标,计算像素点对应哪个图元的哪个部位,得到颜色和材质,相当于在二维平面中做光线追踪。为了加速这一过程,将图元中的一个由数条曲线围成的封闭图形拆成多个由三条曲线围成的封闭图形,对每个图形和每段不构成封闭图形的贝塞尔曲线建立BVH层次包围盒加速结构,再对每个图元建立BVH。由此,计算每个像素点的过程即为遍历两个BVH找到像素点对应的图形或曲线,对于图形,判断点是否在图形内;对于线条,判断点到曲线的距离是否小于一定值,然后根据指定的样式计算其颜色和材质。 + +# 二级编码结构 + +首先分为图元和索引两大块,图元内坐标范围为-1到1,一张图中可能有多个相同的图元,这些图元只需在图元缓存中保存一次,为了记录图元的位置和变换信息,对图元建立一个索引结构,同时为了方便求交,使用BVH层次包围盒结构,BVH每个结点包含bvhChildren(每个结点的两个儿子,x分量为左儿子,y分量为右儿子)和bound(包围盒坐标,QVector4D(左下角x,左下角y,右上角x,右上角y)),BVH的最后一个结点的左儿子为图元索引加上BVH数组长度,右儿子特殊处理为图元zIndex和逆时针旋转角度。 + +图元由轮廓包围的封闭图形和线条构成,轮廓可以由直线、二阶贝塞尔曲线和三阶贝塞尔曲线组成,支持任意数量轮廓围成的图形的渲染,轮廓围成的图形中不能含有空腔,对于一个复杂的含有许多轮廓的封闭图形而言,应当将其分割成数个由三段轮廓线包围的广义三角形,并对这些广义三角形以及不构成图形的线条建立BVH索引,图元内BVH索引存储在外部BVH数组后。 + +compute shader接收的6个buffer: ```glsl -layout(std430, binding = 1) buffer bvhBuffer +layout(std430, binding = 1) buffer paintingOffsetBuffer +{ + /********************** + ** @[0] paintingBvhRoot + ** @[1] paintingBvhLength + **********************/ + uint paintingOffsets[][2]; +}; +layout(std430, binding = 2) buffer bvhBuffer { - uint bvhLength; uvec2 bvhChildren[]; }; -layout(std430, binding = 2) buffer bvhBoundBuffer +layout(std430, binding = 3) buffer bvhBoundBuffer { vec4 bvhBound[]; }; -layout(std430, binding = 3) buffer elementOffsetBuffer +layout(std430, binding = 4) buffer elementOffsetBuffer { /********************** ** @x elementBvhRoot @@ -26,30 +51,29 @@ layout(std430, binding = 3) buffer elementOffsetBuffer **********************/ uvec4 elementOffsets[]; }; -layout(std430, binding = 4) buffer elementIndexBuffer +layout(std430, binding = 5) buffer elementIndexBuffer { uint elementIndex[]; //线和面 }; -layout(std430, binding = 5) buffer elementDataBuffer +layout(std430, binding = 6) buffer elementDataBuffer { float elementData[]; //点和Style }; ``` -bvhLength为外部索引数组长度,bvhChildren为每个结点的两个儿子,x分量为左儿子,y分量为右儿子。 - -传入示例: +提供工具类合并多张彩绘的buffer,一张彩绘的参数示例: ```c++ - GLuint bvhChildren[] = {7/*rootBVH长度*/,0/*与显存对齐*/, + GLuint paintingBvhLength = 7; + GLuint bvhChildren[] = { //root 1,2, 3,4, 5,6, 7,0, 7,30./360* 4294967296 /*右儿子用来表示旋转角度*/, 8,0, 7,0, //elememt0 1,2, - 5+28/*contour索引,由于contour不定长,这里需要给到contour在elementIndex中位置*/,5+12/*style索引,在elementData中位置*/, 3,4, - 5+36,5+12, 5+32,5+12, + 5+0/*contour索引*/,5+12/*style索引,在elementData中位置*/, 3,4, + 5+2,5+12, 5+1,5+12, //elememt1 1+0/*line索引,element中第几条*/,1 + 25 @@ -90,10 +114,10 @@ bvhLength为外部索引数组长度,bvhChildren为每个结点的两个儿子 4,4,5,5, 1,1,3,3, 3,3,5,5, - //contours, 第一个元素指明轮廓段数,后面为lines索引 - 3, 0,1,2, - 3, 2,3,4, - 3, 3,5,6, + //contours, 每个轮廓三个线索引 + 0,1,2, + 2,3,4, + 3,5,6, //element2 //lines @@ -130,3 +154,79 @@ bvhLength为外部索引数组长度,bvhChildren为每个结点的两个儿子 }; ``` +fillStyle格式: + +第一个元素:0,代表填充封闭图形 + +第二个元素:填充方式 + +​ 0,单色 + +​ 1,按直线渐变 + +​ 2,按点渐变 + +后续元素: + +对于单色:5个元素分别为R,G,B,Metallic,Roughness + +对于按直线渐变:起点坐标,终点坐标,段数,[{在直线中相对位置,颜色材质}, ...] + +对于按点渐变:点数,[{坐标,权重,颜色材质}, ...] + + + +strokeStyle格式: + +第一个元素:1,代表画线 + +第二个元素:线宽 + +第三个元素:0,圆角 + +​ 1,直角 + +​ 2,起点圆角终点直角 + +​ 3,起点直角终点圆角 + +第四个元素:线内填充方式 + +​ 0,单色 + +​ 1,按直线渐变 + +​ 2,按点渐变 + +​ 3,按当前线条渐变 + +第五个元素:线外描边宽度 + +第六个元素:线外描边方式 + +​ 0,单色 + +​ 1,分层设色 + +​ 2,渐变 + +后续元素: + +线内填充数据: + +对于单色:5个元素分别为R,G,B,Metallic,Roughness + +对于按直线渐变:起点坐标,终点坐标,段数,[{在直线中相对位置,权重,颜色材质}, ...] + +对于按点渐变:点数,[{坐标,权重,颜色材质}, ...] + +对于按当前线条渐变:段数,[{在线条中相对位置,权重,颜色材质}, ...] + +线外描边数据: + +对于单色:5个元素分别为R,G,B,Metallic,Roughness + +对于分层设色:层数,[{相对宽度,颜色材质}, ...] + +对于渐变:层数,[{相对位置(由里到外0~1),权重,颜色材质}, ...] + From 232530d2cc34a525922092810ca5caf87df0ba15 Mon Sep 17 00:00:00 2001 From: wuyize Date: Tue, 9 Aug 2022 14:25:11 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E6=B8=B2=E6=9F=93=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=80=E5=BC=A0=E7=A4=BA=E6=84=8F=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2st_encode/2st_encode.assets/gbuffers.png | Bin 0 -> 32486 bytes 2st_encode/2st_encode.md | 2 ++ 2 files changed, 2 insertions(+) create mode 100644 2st_encode/2st_encode.assets/gbuffers.png diff --git a/2st_encode/2st_encode.assets/gbuffers.png b/2st_encode/2st_encode.assets/gbuffers.png new file mode 100644 index 0000000000000000000000000000000000000000..85a953ae6baae7cc6ff53df25920c36e00bc99a0 GIT binary patch literal 32486 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

s#G6xgW8FGe*sPi$Yhb_R1x& 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 literal 0 HcmV?d00001 diff --git a/2st_encode/2st_encode.md b/2st_encode/2st_encode.md index 9bfeea4..ee6333a 100644 --- a/2st_encode/2st_encode.md +++ b/2st_encode/2st_encode.md @@ -10,6 +10,8 @@ 3. 根据基础色、世界坐标、法线、金属度和粗糙度gbuffer,以及光源计算光照。 +![image-20220809141906110](2st_encode.assets/gbuffers.png) + 后续计划实现shadow mapping。 ## 计算彩绘纹理流程 From f3824ff9b672c03b0ee60cc031d6864439bd6d4a Mon Sep 17 00:00:00 2001 From: wuyize Date: Tue, 9 Aug 2022 15:49:45 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=8D=95=E4=BE=A7?= =?UTF-8?q?=E6=8F=8F=E8=BE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2st_encode/2st_encode.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/2st_encode/2st_encode.md b/2st_encode/2st_encode.md index ee6333a..0d50962 100644 --- a/2st_encode/2st_encode.md +++ b/2st_encode/2st_encode.md @@ -202,9 +202,19 @@ strokeStyle格式: ​ 3,按当前线条渐变 -第五个元素:线外描边宽度 +第五元素:线外描边类型 -第六个元素:线外描边方式 +​ 0,不描边 + +​ 1,双侧描边 + +​ 2,左侧描边 + +​ 3,右侧描边 + +第六个元素:线外描边宽度 + +第七个元素:线外描边方式 ​ 0,单色 From 469c0bf3283f184157e11fda704886a04856bf8a Mon Sep 17 00:00:00 2001 From: wuyize Date: Wed, 10 Aug 2022 13:53:11 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E4=BA=8C?= =?UTF-8?q?=E7=BA=A7=E7=BC=96=E7=A0=81=E7=9A=84=E5=87=A0=E4=B8=AA=E5=B0=8F?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2st_encode/2st_encode.md | 67 ++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/2st_encode/2st_encode.md b/2st_encode/2st_encode.md index 0d50962..d22fdd5 100644 --- a/2st_encode/2st_encode.md +++ b/2st_encode/2st_encode.md @@ -30,110 +30,111 @@ compute shader接收的6个buffer: layout(std430, binding = 1) buffer paintingOffsetBuffer { /********************** - ** @[0] paintingBvhRoot - ** @[1] paintingBvhLength + ** @x paintingBvhRoot + ** @y paintingBvhLength **********************/ - uint paintingOffsets[][2]; + uvec2 paintingOffsets[]; }; + layout(std430, binding = 2) buffer bvhBuffer { - uvec2 bvhChildren[]; + uvec2 bvhChildren[]; }; layout(std430, binding = 3) buffer bvhBoundBuffer { - vec4 bvhBound[]; + vec4 bvhBound[]; }; layout(std430, binding = 4) buffer elementOffsetBuffer { - /********************** - ** @x elementBvhRoot - ** @y elementBvhLength - ** @z pointsOffset - ** @w linesOffset - **********************/ - uvec4 elementOffsets[]; + /********************** + ** @[0] elementBvhRoot + ** @[1] elementBvhLength + ** @[2] pointsOffset + ** @[3] linesOffset + ** @[4] contoursOffset + **********************/ + uint elementOffset[][5]; }; layout(std430, binding = 5) buffer elementIndexBuffer { - uint elementIndex[]; //线和面 + uint elementIndexs[]; //线和面 }; layout(std430, binding = 6) buffer elementDataBuffer { - float elementData[]; //点和Style + float elementData[]; //点和Style }; ``` 提供工具类合并多张彩绘的buffer,一张彩绘的参数示例: ```c++ - GLuint paintingBvhLength = 7; - GLuint bvhChildren[] = { + std::vector bvhChildren = { //root - 1,2, + 1,2, 3,4, 5,6, - 7,0, 7,30./360* 4294967296 /*右儿子用来表示旋转角度*/, 8,0, 7,0, + 7,0, 7,GLuint(30. / 360 * 65536 + 1 * 65536) /*右儿子用来表示旋转角度和zIndex*/, 8,0, 7,0, //elememt0 1,2, - 5+0/*contour索引*/,5+12/*style索引,在elementData中位置*/, 3,4, - 5+2,5+12, 5+1,5+12, + 5 + 0/*contour索引*/,5 + 12/*style索引,在elementData中位置*/, 3,4, + 5 + 2,5 + 12, 5 + 1,5 + 12, //elememt1 - 1+0/*line索引,element中第几条*/,1 + 25 + 1 + 0/*line索引,element中第几条*/,1 + 25 }; - QVector4D bvhBound[] = { + std::vector bvhBounds = { //root QVector4D(-1,-1,1,1), - QVector4D(-0.9,-0.9,-0.1,0.9), QVector4D(0.1, -0.9,0.9,0.9), + QVector4D(-0.9,-0.9,-0.1,0.9), QVector4D(0.1, -0.9,0.9,0.9), QVector4D(-0.8,-0.8,-0.2,-0.1), QVector4D(-0.7,0.2,-0.2,0.7), QVector4D(0.2,-0.8,0.8,-0.1), QVector4D(0.2,0.1,0.8,0.8), //elememt0 QVector4D(-1,-1,1,1), QVector4D(-1,-0.5,1,1), QVector4D(-1,-1,1,0.5), QVector4D(-1,-1,1,-0.5), QVector4D(-1,-0.5,1,0.5), - //elememt1 - QVector4D(-1,0,1,1), + //elememt1 + QVector4D(-1,0,1,1), }; - GLuint elementOffset[] = { + std::vector elementOffset = { //element0 7, //elementBvhRoot 5, //elementBvhLength 0, //pointsOffset 0, //linesOffset + 28, //contoursOffset //element1 12, //elementBvhRoot 1, //elementBvhLength 19, //pointsOffset 40, //linesOffset + 44 //contoursOffset }; - GLuint elementIndex[] = { + std::vector elementIndex = { //element0 //lines, 全部当作三阶贝塞尔, 每条线四个点索引 - 0,2,2,4, + 4,2,2,0, 0,0,1,1, 1,1,4,4, 1,1,5,5, 4,4,5,5, 1,1,3,3, 3,3,5,5, - //contours, 每个轮廓三个线索引 + //contours, 每个轮廓三个线索引,若轮廓由两条线构成则第一第二元素相同 0,1,2, 2,3,4, 3,5,6, - //element2 //lines 0,1,2 }; - - GLfloat elementData[] = { + std::vector elementData = { //element0 //points -1,0.5, -1,-0.5, 0,1, 0,-1, 1,0.5, 1,-0.5, //fillStyle //fill - 0, + 0, //fillType 0, //单色 //fillColorMetallicRoughness From a0a72e1f19bbc6a49e3d83bf7faa78cb4932de5a Mon Sep 17 00:00:00 2001 From: wuyize Date: Wed, 17 Aug 2022 13:06:33 +0800 Subject: [PATCH 5/6] =?UTF-8?q?8.17=E4=BC=9A=E8=AE=AE=E5=AD=98=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2st_encode.assets/triangulation.png | Bin 0 -> 32076 bytes 2st_encode/2st_encode.md | 20 ++++++++++++++++-- README.md | 9 ++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 2st_encode/2st_encode.assets/triangulation.png diff --git a/2st_encode/2st_encode.assets/triangulation.png b/2st_encode/2st_encode.assets/triangulation.png new file mode 100644 index 0000000000000000000000000000000000000000..441c45824b311415da0d53d50ccfdc4237537e94 GIT binary patch literal 32076 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 Date: Sat, 19 Nov 2022 15:58:58 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E8=87=B3=20'1st=5Fencode'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 不完整的实例json --- 1st_encode/example.json | 271 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 271 insertions(+) create mode 100644 1st_encode/example.json diff --git a/1st_encode/example.json b/1st_encode/example.json new file mode 100644 index 0000000..2d14928 --- /dev/null +++ b/1st_encode/example.json @@ -0,0 +1,271 @@ +{ + "height": 1080, + "width": 1080, + "elements": [ + { + "type": "path", + "data": { + "operations": [ + { + "type": "line", + "data": { + "target": { + "x": 15, + "y": 20 + } + } + }, + { + "type": "cubic", + "data": { + "target": { + "x": 18, + "y": 21 + }, + "control": { + "start": { + "x": 17, + "y": 22 + }, + "end": { + "x": 20, + "y": 23 + } + } + } + }, + { + "type": "cubic-smooth", + "data": { + "target": { + "x": 18, + "y": 21 + }, + "control": { + "x": 18, + "y": 21 + } + } + }, + { + "type": "quadratic", + "data": { + "target": { + "x": 18, + "y": 21 + }, + "control": { + "x": 18, + "y": 21 + } + } + }, + { + "type": "quadratic-smooth", + "data": { + "target": { + "x": 18, + "y": 21 + } + } + }, + { + "type": "arc", + "data": { + "center": { + "x": 18, + "y": 21 + }, + "x-axis": 40, + "y-axis": 50, + "angle": 6000 + } + }, + { + "type": "zeal" + } + ] + } + }, + { + "type": "polygon", + "data": { + "points": [ + { + "x": 10, + "y": 20 + }, + { + "x": 10, + "y": 20 + }, + { + "x": 10, + "y": 20 + }, + { + "x": 10, + "y": 20 + }, + { + "x": 10, + "y": 20 + } + ] + } + }, + { + "type": "round", + "data": { + "x-axis":30, + "y-axis":40, + "angle": 6000 + } + }, + { + "type": "group", + "group-layer": [1,2] + } + ], + "layers": [ + { + "element": 1, + "position": { + "type":"absolute", + "x": 18, + "y": 21 + }, + "level": 1, + "attached": [ + { + "type": "rotate", + "data": { + "clockwise": false, + "angle": 6000 + } + }, + { + "type": "zoom", + "data": { + "x-zoom": 1.0, + "y-zoom": 1.2 + } + }, + { + "type": "flip" + }, + { + "type": "shadow", + "data": {} + } + ] + }, + { + "element": 2, + "position": { + "type":"offset", + "x": 18, + "y": 21 + }, + "level": 1, + "attached": [] + } + ], + { + "element-group": false, + "target": 2, + "times": 5, + "operations": [ + { + "type": "move", + "data": { + "dx": 5, + "dy": 6 + } + }, + { + "type": "rotate", + "data": { + "center": { + "dx": 0, + "dy": 0 + }, + "dθ": 6000 + } + }, + { + "type": "zoom", + "data": { + "zoom": 1.5 + } + }, + { + "type": "flip" + } + ] + }, + { + "element-group": true, + "target": 5, + "times": 5, + "children": [ + [ + { + "type": "move", + "data": { + "dx": 5, + "dy": 6 + } + }, + { + "type": "rotate", + "data": { + "center": { + "dx": 0, + "dy": 0 + }, + "dθ": 6000 + } + }, + { + "type": "zoom", + "data": { + "zoom": 1.5 + } + }, + { + "type": "flip" + } + ], + [ + { + "type": "move", + "data": { + "dx": 5, + "dy": 6 + } + }, + { + "type": "rotate", + "data": { + "center": { + "dx": 0, + "dy": 0 + }, + "dθ": 6000 + } + }, + { + "type": "zoom", + "data": { + "zoom": 1.5 + } + }, + { + "type": "flip" + } + ] + ] + } + ] +} \ No newline at end of file