着色器 (Shaders)

使用 Shaders 在图像中产生适当的光和颜色水平,以产生特殊效果或进行后期处理。

Kanzi 中的着色器基于 OpenGL ES 着色语言。您还可以使用 Shader Graph Editor 以可视化方式构建片段着色器,而无需编写代码。Shader Graph Editor 是一项实验性功能。

Kanzi 中的每种材质类型都附带定义着色算法的着色器:

../../_images/vertex-shader-icon.png

Vertex Shader 处理单个顶点。

Vertex Shader 的源文件扩展名为 .vert.glsl。

../../_images/fragment-shader-Icon.png

Fragment Shader 处理每个片段。

Fragment Shader 的源文件扩展名为 .frag.glsl。

当您的 Kanzi Studio 工程以 OpenGL ES 3.2 或 Vulkan 为目标时,您还可以创建以下着色器:

../../_images/geometry-shader-icon.png

Geometry Shader 处理基元。

Geometry Shader 的源文件扩展名为 .geom.glsl。

../../_images/tessellation-control-shader-icon.png

Tessellation Control Shader 确定图元的细分量,并对输入的补丁数据执行变换。

Tessellation Control Shader 的源文件扩展名为 .tesc.glsl。

../../_images/tessellation-evaluation-shader-icon.png

Tessellation Evaluation Shader 使用由原始生成器生成的抽象坐标来计算顶点的值。

Tessellation Evaluation Shader 的源文件扩展名为 .tese.glsl。

请参阅 使用几何着色器 和 使用细分着色器。

在 Kanzi Studio 项目中,着色器程序作为文件存储在计算机硬盘上。当您将着色器添加到 Kanzi Studio 项目的 <KanziWorkspace>/Projects/<ProjectName>/Shaders 目录时,Kanzi Studio 会自动在 Library > Resource Files > Shaders 中显示它们。

您可以在 <KanziInstallation>/Studio/Asset Library/MaterialTypes 工程中找到 Kanzi 附带的着色器:

您还可以编写您自己的着色器。请参阅 编辑着色器。

要在多个工程之间重用着色器代码,您可以使用 Kanzi 着色器包含库。请参阅 使用着色器包含库。

通用着色器

<KanziInstallation>/Studio/Asset Library/ 工程中的 MaterialTypes/Common 目录包含使用通用着色器的材质类型。

ColorTexture

显色彩色的纹理数据。

../../_images/color-texture.png

CubemapSkybox

显示立方体贴图纹理作为天空盒。请参阅 使用立方体贴图纹理作为天空盒。

../../_images/cubemap-skybox.png

DefaultBlit

Blit 渲染通道使用的默认着色器。请参阅 渲染 (Rendering)。

../../_images/default-blit.png

DefaultCubemapBlit

在 Cubemap 渲染通道下使用 Blit 渲染通道时,该渲染通道使用的默认着色器。请参阅 渲染 (Rendering)。

../../_images/default-cubemap-blit.png

DefaultCubemapMipmapFilter、DefaultDepthMipmapFilter、DefaultMipmapFilter

用于自定义合成目标的 mipmap 生成的默认着色器。请参阅 为合成目标创建 mipmap。

../../_images/default-mipmap.png

FontDefault

渲染文本字体。此着色器将字形纹理与字体颜色结合并显示输出。您可以将其与 Text Block 和 Text Box 节点一起使用。请参阅 使用 Text Block 节点 和 使用 Text Box 节点。

../../_images/font-default.png

LatLongCubemapBlit

将经纬度(等距柱状投影)纹理 blit 到立方体贴图中。您可以在 Blit 渲染通道中使用此着色器替代 DefaultCubemapBlit 着色器。请参阅 渲染 (Rendering)。

../../_images/lat-long-cubemap-blit.png

LatLongSkybox

将经纬度(等距柱状)纹理显示为天空盒。请参阅 使用经纬度环境纹理。

../../_images/latlong-skybox.png

MaskTexture

显示一种纹理遮罩另一种纹理的纹理数据。

../../_images/mask-texture.png

SweepTextures

显示从一种纹理迁移到另一种纹理的纹理数据。

../../_images/sweep-textures.png

Textured

显示纹理数据。请参阅 纹理 (Textures) 和 创建纹理材料。

../../_images/texture.png

基于像素的Phong着色器

<KanziInstallation>/Studio/Asset Library/ 工程中的 MaterialTypes/FragmentPhong 目录包含使用基于像素的冯氏 (Phong) 着色器的材质类型。大部分 GPU 相关计算(包括使用冯氏反射模型应用光源)都在片段着色器中完成。这样可以提供更好的图像质量,但通常会以性能为代价。

FragmentPhong

实现了 Blinn-Phong shading model。默认情况下,此着色器支持一个方向光、一个聚光灯和两个点光源。着色器计算每个片段的光照。

../../_images/fragment-phong.png

FragmentPhongCube

显示根据视图 vector 和表面法线的反射计算的立方体贴图反射,并将结果与 Phong 着色相结合。

../../_images/fragment-phong-cube.png

FragmentPhongMorph

启用变形。请参阅 使用变形。

../../_images/fragment-phong-morph.png

FragmentPhongSkinned

显示蒙皮网格数据。请参阅 使用蒙皮网格。

../../_images/fragment-phong-skinned.png

FragmentPhongSkinnedMorph

组合 FragmentPhongMorph 和 FragmentPhongSkinned 着色器。

../../_images/fragment-phong-skinned-morph.png

FragmentPhongTextured

显示可用于3D节点的纹理数据。请参阅 纹理 (Textures) 和 创建纹理材料。

../../_images/fragment-phong-textured.png

FragmentPhongTexturedCube

结合 FragmentPhongCube 和 FragmentPhongTextured 着色器。

../../_images/fragment-phong-textured-cube.png

FragmentPhongTexturedNormalMap

显示蒙皮网格数据。请参阅 使用蒙皮网格。

../../_images/fragment-phong-textured-normal-map.png

FragmentPhongTexturedCubeNormalMap

将 FragmentPhongTexturedNormalMap 着色器与立方体贴图反射相结合,从视图向量和表面法线的反射计算得出。

../../_images/fragment-phong-textured-cube-normal-map.png

FragmentPhongTexturedSkinned

组合 FragmentPhongSkinned 和 FragmentPhongTextured 着色器。

../../_images/fragment-phong-textured-skinned.png

FragmentPhongTexturedSkinnedMorph

组合 FragmentPhongMorph、FragmentPhongSkinned 和 FragmentPhongTextured 着色器。

../../_images/fragment-textured-phong-skinned-morph.png

基于顶点的Phong着色器

<KanziInstallation>/Studio/Asset Library/ 工程中的 MaterialTypes/VertexPhong 目录包含使用基于顶点的冯氏 (Phong) 着色器的材质类型。大部分 GPU 相关计算(包括使用冯氏反射模型应用光源)都在顶点着色器中完成。对于大多数设备来说,这是一个很好的起点。

VertexPhong

实现了 Blinn-Phong shading model。默认情况下,此着色器支持一个方向光、一个聚光灯和两个点光源。着色器为每个顶点计算光照。

../../_images/vertex-phong.png

VertexPhongCube

显示根据视图 vector 和表面法线的反射计算的立方体贴图反射,并将结果与 Phong 着色相结合。

../../_images/vertex-phong-cube.png

VertexPhongMorph

启用变形。请参阅 使用变形。

../../_images/vertex-phong-morph.png

VertexPhongSkinned

  • 显示蒙皮网格数据。此着色器根据多个变换和权重转换顶点,并将结果与Phong着色结合。

  • 如果您在第三方内容创建工具中定义了矩阵调色板和权重,则它们是网格特性的组成部分。

  • 着色器与网格数据中不包含蒙皮数据(矩阵调色板和权重)的几何形状不兼容。

请参阅 使用蒙皮网格。

../../_images/vertex-phong-skinned.png

VertexPhongSkinnedMorph

组合 VertexPhongMorph 和 VertexPhongSkinned 着色器。

../../_images/vertex-phong-skinned-morph.png

VertexPhongTextured

显示可用于3D节点的纹理数据。请参阅 纹理 (Textures) 和 创建纹理材料。

../../_images/vertex-phong-textured.png

VertexPhongTexturedCube

组合 VertexPhongCube 和 VertexPhongTextured 着色器。

../../_images/vertex-phong-textured-cube.png

VertexPhongTexturedMorph

组合 VertexPhongMorph 和 VertexPhongTextured 着色器。

../../_images/vertex-phong-textured-morph.png

VertexPhongTexturedSkinned

组合 VertexPhongSkinned 和 VertexPhongTextured 着色器。

../../_images/vertex-phong-textured-skinned.png

VertexPhongTexturedSkinnedMorph

组合 VertexPhongMorph、VertexPhongSkinned 和 VertexPhongTextured 着色器。

../../_images/vertex-phong-textured-skinned-morph.png

基于物理的着色器

<KanziInstallation>/Studio/Asset Library/ 工程中的 MaterialTypes/PhysicallyBasedRendering 目录包含使用基于物理的着色器的材质类型。这些着色器实现了基于物理的渲染 (PBR) 原理。Physically-based materials 的属性表示物理属性(例如金属度),因此控制起来非常直观。大部分 GPU 相关计算(包括使用基于物理的光照模型应用光源)都在片段着色器中完成。这样可以在多种光照条件下提供更逼真的渲染效果。

PhysicallyBased

实现了基于物理的着色模型,并默认情况下启用:

  • 设置粗糙度和金属度

  • 一个方向光、一个聚光灯和两个点光源。

  • 基础颜色透明度

  • Reinhard 色调映射

../../_images/physically-based.png

PhysicallyBasedClearCoat

使用基于物理的渲染来渲染覆盖有透明涂层的材料。这通常用于车辆油漆。

../../_images/physically-based-clear-coat.png

PhysicallyBasedMorph

默认情况下,启用具有 3 个目标的变形。请参阅 使用变形。

../../_images/physically-based-morph.png

PhysicallyBasedSkinned

默认情况下,启用最多 64 个骨骼的网格蒙皮。请参阅 使用蒙皮网格。

../../_images/physically-based-skinned.png

PhysicallyBasedTextured

启用使用包含基础颜色、法线、粗糙度、金属度和遮挡贴图的纹理,以及材料发出的光。请参阅 创建基于物理的纹理材料。

../../_images/physically-based-textured.png

PostProcessTonemap

全屏后期处理材质,默认情况下应用Reinhard色调映射。

../../_images/post-process-tonemap.png

Unlit shaders

<KanziInstallation>/Studio/Asset Library/ 工程中的 MaterialTypes/Unlit 目录包含材质类型 (Material Types),其着色器使用由 KHR_materials_unlit glTF 扩展定义的无光照着色模型。无光照着色器是基于物理的着色器的替代方案,您可以出于性能或美观的考虑使用它们。例如,在不需要光照的情况下,您可以使用无光照材质来实现“手绘”效果。

Unlit

实现了一种替代物理基础着色模型的方法,不进行光照计算、色调映射以及多余的纹理贴图和因子。

../../_images/unlit.png

UnlitMorph

默认情况下,启用具有 3 个目标的变形。请参阅 使用变形。

../../_images/unlit-morph.png

UnlitSkinned

默认情况下,启用最多 64 个骨骼的网格蒙皮。请参阅 使用蒙皮网格。

../../_images/unlit-skinned.png

UnlitTextured

启用未点亮材质的纹理使用。

../../_images/unlit-textured.png

另请参阅

着色器最佳实践

使用二进制着色器

优化片段着色器

减少着色器切换

编辑着色器

在 Kanzi 中使用 OpenGL ES 3.0+

材质类型和材质

使用光源节点