Vulkan Cookbook 第七章 6 编写片段着色器

编写片段着色器

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

片段(或像素)是可能在屏幕上显示的图像的一部分。 它们是在称为光栅化的过程中从几何体(绘制的图元)创建的。 它们具有特定的屏幕空间坐标(x,y和深度),但没有任何其他数据。 我们需要编写一个片段着色器来指定需要在屏幕上显示的颜色。 在片段着色器中,我们还可以选择应该在其中写入给定颜色的附件。

怎么做...

1.创建一个扩展名为frag文本文件例如,shader.frag)。
2.在文件的第一行插入#version 450。
3.定义从早期管线阶段提供的一组输入变量(属性)。 对于每个输入变量:
    1.使用位置布局(location layout)限定符和属性索引(index)定义其位置:
        layout( location = <index> )
    2.提供in限定符
    3.指定输入变量的类型(例如vec4,float,ivec3)
   4.提供输入变量的唯一名称
4.为每个要写入颜色的附件定义输出变量。 要定义每个输出变量:
    1.使用位置布局(location layout)限定符和属性索引(index)定义其位置:
        layout( location = <index> )
    2.提供out限定符
    3.指定输出变量的类型(例如vec3或vec4)
    4.选择输出变量的唯一名称
5.如有必要,请定义与应用程序中创建的描述符资源相对应的uniform变量。 要定义uniform变量:
    1.指定描述符集的数量和可以访问给定资源的绑定号:
        layout (set=<set index>, binding=<binding index>)
    2.提供uniform限定符
    3.指定变量的类型(例如sampler1D,subpassInput或imageBuffer)
    4.定义变量的唯一名称
6.创建一个void main()函数,其中:
    1.执行所需的操作和计算
    2.将处理过的片段的颜色存储在输出变量中

这个怎么运作...

我们在应用程序中绘制的几何图形是由基元组成的。 这些基元在称为光栅化的过程中转换为片段(像素)。 对于每个这样的片段,执行片段着色器。 片段可能会在着色器内或帧缓冲测试期间丢弃,例如深度,模板或裁剪测试,因此它们甚至不会成为像素 - 这就是为什么它们被称为片段(fragments)而不是像素(pixels)。

片段着色器的主要用途是设置将(可能)写入附件的颜色。 我们通常使用它们来执行照明计算和纹理。 与计算着色器一起,片段着色器通常用于后处理效果,例如bloom或延迟着色/光照。 此外,只有片段着色器才能访问渲染过程中定义的输入附件(请参阅第5章,描述符集中的创建输入附件(input attachment)内容)。

要绘制上图中的三角形,可以使用一个简单的片段着色器,它存储选定的硬编码颜色:

#version 450 

layout( location = 0 ) out vec4 frag_color; 

void main() { 
  frag_color = vec4( 0.8, 0.4, 0.0, 1.0 ); 
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值