vulkan学习(四)——渲染管线封装

举报
lutianfei 发表于 2022/04/11 23:46:54 2022/04/11
【摘要】 一、Vulkan Pipeline概念精讲渲染管线规定了当前这个模型数据要解决如下问题:如何理解(三角形还是直线)如何渲染(PhongShading, PRB光照,others)如何Blending(透明物体如何颜色混合?)如何对比不同物体的深度遮挡关系?如何传入特定的变量到Shader》(比如随时间变色)渲染管线与材质的管线:本质来讲,渲染管线应该属于材质类的一部分材质规定了“如何”对模...

一、Vulkan Pipeline概念

image.png

image.png

渲染管线规定了当前这个模型数据要解决如下问题:

  1. 如何理解(三角形还是直线)
  2. 如何渲染(PhongShading, PRB光照,others)
  3. 如何Blending(透明物体如何颜色混合?)
  4. 如何对比不同物体的深度遮挡关系?
  5. 如何传入特定的变量到Shader》(比如随时间变色)

渲染管线与材质的管线:本质来讲,渲染管线应该属于材质类的一部分
材质规定了“如何”对模型数据进行绘制。

Vulkan的Pipeline
在Vulkan中,Pipeline属于一个句柄类型,是可以被进行详细设置的。
具体可以理解如下:

  1. Pipeline属于材质的一部分
  2. 每个Mesh都有自己对应的材质,也就意味着可以绑定自己的渲染管线。
  3. 如果两个Mesh公用一个材质,那么也就意味着共用了共同一个Pipeline。
  4. 把Pipeline理解为一种渲染模板,对于模型的顶点的处理流程描述。

1.1 Shader模块

Shader组:在Vulkan当中,VertexShader、Geometry Shader、Tess啦体哦那Shader、FragmentShader等都是在管线的不同阶段发挥不同的处理作用;所有阶段的Shader合起来构成了Shader组。

Shader与Pipeline关系:在本Pipeline中,将其用到的Shader组可以设置进去,那么这条管线就会使用这个Shader组当中的着色程序对模型顶点以及片元进行处理。

1.2 顶点描述模块

在Pipeline中需要确定本条管线接收怎样的模型顶点数据。

Interleaved Data:每个顶点多个不同的属性都放在一个数组。
image.png

UnInterleaved Data: 每个顶点多个不同的属性放在不同的数组。
image.png

不管哪种数据就,最终都会被送入GPU显存Buffer,GPU如何理解这些数据?

1.2.1 顶点绑定描述(VertexBinding)

UnInterleaved(分离式):每组顶点属性都在GPU当中生成一个Buffer,多个Buffer组成数组,送入CommandBuffer,所谓绑定点,其实就是数组编号,告诉Pipeline如何使用CommandBuffer当中的Buffer们。

image.png

Interleaved(混合式):此种类型只有一个Buffer,所以绑定点直接为0, 因为数组只有一个元素。

1.2.2 顶点属性描述(VertexAttributeLocation)

不管是Interleaved还是Uninterleaved,数据中总是包含Position、Color、Mormal、UV等数据,那么在Shader当中,也会承接并且使用这些数据,如下图所示:

image.png

顶点绑定描述(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:连续三角形

image.png

1.4 视口剪裁模块

视口:窗口中的画布大小,通过拉伸放缩适应;

image.png

剪裁区域:区域外的直接剪裁,不绘制
image.png

1.5 光栅化设置模块

光栅化:规定了基础图元如何离散成为光栅化像素方格,其中最重要的就是剔除

cullMode:设置剔除掉正面还是背面
FrontFace:设置如何定义正面

image.png

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坐标系
image.png

Vulkan世界坐标系
image.png

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对象封装

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。