vulkan学习(四)——渲染管线封装
一、Vulkan Pipeline概念
渲染管线规定了当前这个模型数据要解决如下问题:
- 如何理解(三角形还是直线)
- 如何渲染(PhongShading, PRB光照,others)
- 如何Blending(透明物体如何颜色混合?)
- 如何对比不同物体的深度遮挡关系?
- 如何传入特定的变量到Shader》(比如随时间变色)
渲染管线与材质的管线:本质来讲,渲染管线应该属于材质类的一部分
材质规定了“如何”对模型数据进行绘制。
Vulkan的Pipeline
在Vulkan中,Pipeline属于一个句柄类型,是可以被进行详细设置的。
具体可以理解如下:
- Pipeline属于材质的一部分
- 每个Mesh都有自己对应的材质,也就意味着可以绑定自己的渲染管线。
- 如果两个Mesh公用一个材质,那么也就意味着共用了共同一个Pipeline。
- 把Pipeline理解为一种渲染模板,对于模型的顶点的处理流程描述。
1.1 Shader模块
Shader组
:在Vulkan当中,VertexShader、Geometry Shader、Tess啦体哦那Shader、FragmentShader等都是在管线的不同阶段发挥不同的处理作用;所有阶段的Shader合起来构成了Shader组。
Shader与Pipeline关系
:在本Pipeline中,将其用到的Shader组可以设置进去,那么这条管线就会使用这个Shader组当中的着色程序对模型顶点以及片元进行处理。
1.2 顶点描述模块
在Pipeline中需要确定本条管线接收怎样的模型顶点数据。
Interleaved Data
:每个顶点多个不同的属性都放在一个数组。
UnInterleaved Data
: 每个顶点多个不同的属性放在不同的数组。
不管哪种数据就,最终都会被送入GPU显存Buffer,GPU如何理解这些数据?
1.2.1 顶点绑定描述(VertexBinding)
UnInterleaved(分离式):每组顶点属性都在GPU当中生成一个Buffer,多个Buffer组成数组,送入CommandBuffer,所谓绑定点,其实就是数组编号,告诉Pipeline如何使用CommandBuffer当中的Buffer们。
Interleaved(混合式):此种类型只有一个Buffer,所以绑定点直接为0, 因为数组只有一个元素。
1.2.2 顶点属性描述(VertexAttributeLocation)
不管是Interleaved还是Uninterleaved,数据中总是包含Position、Color、Mormal、UV等数据,那么在Shader当中,也会承接并且使用这些数据,如下图所示:
顶点绑定描述(VertexBinding)
与顶点属性描述(VertexAttributeLocation)
结合在一起就构成了Pipeline当中的顶点描述模块
,注意:这里只做了对期望输入顶点方式的描述,而不是绑定Buffer数据。
1.3 图元装配描述模块
图片装配描述
:对输入的顶点,到底构成三角形还是直线等进行设置。
VK_PRIMITIVE_TOPOLOGY_POINT_LIST: 点集
VK_PRIMITIVE_TOPOLOGY_LINE_LIST: 线集
VK_PRIMITIVE_TOPOLOGY_LINE_STRIP: 连续线
VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST:三角形集合
VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP:连续三角形
1.4 视口剪裁模块
视口
:窗口中的画布大小,通过拉伸放缩适应;
剪裁区域
:区域外的直接剪裁,不绘制
1.5 光栅化设置模块
光栅化
:规定了基础图元如何离散成为光栅化像素方格,其中最重要的就是剔除
cullMode
:设置剔除掉正面还是背面
FrontFace
:设置如何定义正面
1.6 颜色混合设置模块
颜色混合
:规定了同一个像素点上的各类物体的图元,如果是RGBA像素格式,存在Alpha值,那么如何对他们进行透明度的呈现于颜色之间的混合。
-
srcColorBlendFactor
:即将绘制上去的颜色称为SrcColor
,本参数规定它乘以什么系数, 如:VK_BLEND_FACTOR_SRC_ALPHA
,乘以自己的Alpha。 -
dstColorBlendFactor
:已经绘制在Buffer上的颜色称为DstColor
,本参数规定它乘以什么系数, 如:VK BLEND_FACTOR ONE_MINUS_SRC_ALPHA
,乘以(1-Src.Alpha) -
colorBlendOp
:规定计算好的两个颜色,如何运算产生最后颜色值, 如:VK_BLEND_OP_ADD
1.7 Uniform设置与深度模块
暂不讲解
二、Shader语言与SPIR-V
Shader
:在GPU可编程渲染管线当中,输送给某些特定阶段的处理逻辑程序。
GLSL
: OpenGL标准型的着色语言,属于类C语言,所以每家显卡都需要实现对语言的编译与支持。随着更新迭代,GPU驱动质量不一,新的扩展会出现出错或者崩溃。
SPIR-V
: 为了进一步打薄驱动层,使用了二进制格式的SPIR-V,可扩展性以及机器兼容性好了很多。市面上的基础Shaer语言都可以通过转换器转化到SPIR-V。
OpenGL坐标系
Vulkan世界坐标系
vertexShader 程序示例:
#version 450
//GLSL 版本号 4.5
#extension GL_ARB_separate_shader_objects:enable //便于在vulkan中做编译
layout(location = 0) out vec3 outColor; //向fragmentShader,位置为0的地方输出一个color
vec2 positions[3] = vec2[](vec2(0.0, -1.0), vec2(0.5, 0.0), vec2(-0.5, 0.0)); //定义三角形的三个点
vec3 colors[3] = vec3[](vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0), vec3(0.0, 0.0, 1.0)); //定义三个点的颜色分别为红、绿、蓝
void main() {
gl_Position = vec4(positions[gl_VertexIndex], 0.0, 1.0); //gl_VertexIndex:并行执行时三个点的编号
outColor = colors[gl_VertexIndex];
}
fragmentShader 程序示例:
#version 450
#extension GL_ARB_separate_shader_objects:enable
layout(location = 0) in vec3 inColor;
layout(location = 0) out vec4 outColor;
void main() {
outColor = vec4(inColor, 1.0); // 1.0 表示alpha值
}
三、Shader类封装
四、Pipeline对象封装
- 点赞
- 收藏
- 关注作者
评论(0)