二级编码完善颜色材质信息

master
wuyize 2022-08-09 12:31:39 +08:00
parent 3d5f71a88e
commit c901292ca0
1 changed files with 120 additions and 20 deletions

View File

@ -1,22 +1,47 @@
二级编码大体结构及渲染流程如下:
目标实现分辨率无关的、具有较高随机访问性能、相对节省显存的矢量图渲染使得其使用方式与传统texture类似便于在任意形状mesh中应用矢量图贴图。
首先分为图元和索引两大块,图元内坐标范围为-1到1一张图中可能有多个相同的图元这些图元只需在图元缓存中保存一次为了记录图元的位置和变换信息对图元建立一个索引结构同时为了方便求交使用BVH层次包围盒结构BVH每个结点包含leftChildrightChild和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右上角yBVH的最后一个结点的左儿子为图元索引加上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个元素分别为RGBMetallicRoughness
对于按直线渐变:起点坐标,终点坐标,段数,[{在直线中相对位置,颜色材质}, ...]
对于按点渐变:点数,[{坐标,权重,颜色材质}, ...]
strokeStyle格式
第一个元素1代表画线
第二个元素:线宽
第三个元素0圆角
1直角
2起点圆角终点直角
3起点直角终点圆角
第四个元素:线内填充方式
0单色
1按直线渐变
2按点渐变
3按当前线条渐变
第五个元素:线外描边宽度
第六个元素:线外描边方式
0单色
1分层设色
2渐变
后续元素:
线内填充数据:
对于单色5个元素分别为RGBMetallicRoughness
对于按直线渐变:起点坐标,终点坐标,段数,[{在直线中相对位置,权重,颜色材质}, ...]
对于按点渐变:点数,[{坐标,权重,颜色材质}, ...]
对于按当前线条渐变:段数,[{在线条中相对位置,权重,颜色材质}, ...]
线外描边数据:
对于单色5个元素分别为RGBMetallicRoughness
对于分层设色:层数,[{相对宽度,颜色材质}, ...]
对于渐变:层数,[{相对位置由里到外0~1权重颜色材质}, ...]