Vulkan Cookbook 第七章 8 编写顶点着色器,将顶点位置乘以投影矩阵

编写顶点着色器,将顶点位置乘以投影矩阵

译者注:示例代码点击此处

将几何体从局部变换到裁剪空间通常由顶点着色器执行,但任何其他顶点处理阶段(曲面细分或几何)都可以完成此任务。 通过指定模型,视图和投影矩阵并将它们从应用程序提供给着色器作为三个单独的矩阵或作为一个完整的模型 - 视图 - 投影矩阵(简称MVP)来完成转换。 最常见和最简单的方法是使用uniform缓冲区,通过它我们可以提供这样的矩阵。

怎么做...

1.在名为shader.vert的文本文件中创建顶点着色器(请参阅编写顶点着色器内容)。
2.定义一个输入变量(属性),通过该变量(属性)将顶点位置提供给顶点着色器:

  

 layout(location = 0) in vec4 app_position;


3.使用mat4类型的变量定义一个uniform缓冲区,通过该缓冲区将提供组合模型 - 视图 - 投影矩阵的数据:
 

layout(set=0, binding=0) uniform UniformBuffer { 
  mat4 ModelViewProjectionMatrix; 
};

4,在void main()函数内部,通过将ModelViewProjectionMatrix统一变量乘以app_position输入变量并将结果存储在gl_Position内置变量中来计算裁剪空间中的顶点位置,如下所示:

 gl_Position = ModelViewProjectionMatrix * app_position;

这个怎么运作...

当我们准备将在3D应用程序中绘制的几何体时,几何体通常在局部坐标系中建模 - 在该坐标系中,艺术家更方便地创建模型。 但是,图形管道需要将顶点转换为裁剪空间,因为在此坐标系中执行许多操作更容易(也更快)。 通常是顶点着色器执行此转换。 为此,我们需要准备一个表示透视或正交投影的矩阵。 通过将矩阵乘以顶点的位置来执行从局部空间到剪辑空间的变换。

除了投影之外,相同的矩阵还可以包含其他操作,通常称为模型视图变换。 由于绘制的几何体可能包含数百或数千个顶点,因此在应用程序中乘以模型,视图和投影矩阵通常更为理想,并为着色器提供单个完成的MVP矩阵,该矩阵只需执行单个乘法:

#version 450 

layout(location = 0) in vec4 app_position; 

layout(set=0, binding=0) uniform UniformBuffer { 
  mat4 ModelViewProjectionMatrix; 
}; 

void main() { 
  gl_Position = ModelViewProjectionMatrix * app_position; 
}

前面的着色器要求应用程序准备一个缓冲区,其中存储矩阵的数据(请参阅第5章,描述符集中的创建统一缓冲区内容)。 然后在与描述符集合的第0个绑定处提供此缓冲区(在当前示例中),该描述符集合稍后作为第0组绑定到命令缓冲区(请参阅第5章描述集中的更新描述符集绑定描述符集内容)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值