使用细分着色器

细分将顶点数据的片段细分为更小的图元:

  • Tessellation Control Shader 决定了细分的数量。

  • Tessellation Evaluation Shader 计算每个生成顶点的值。

细分是一个可选的着色器阶段,位于 Vertex Shader 之后和可选的 Geometry Shader 之前。

要使用几何和细分着色器,您要运行 Kanzi 应用程序的硬件必须支持 OpenGL ES 3.2。请注意,几何和细分着色器可能会降低在平铺渲染架构上的性能。因此,建议避免在移动和嵌入式硬件上使用几何和细分着色器。

请参阅 使用几何着色器。

在此过程中,您使用细分着色器将纹理转换为位移贴图。着色器根据纹理中的颜色值提升平面上的点。

要使用细分着色器:

  1. 在 Kanzi Studio 主菜单中,选择 Project > Properties,并将 Target Graphics API 设置为 OpenGL ES 3.2。

    ../../_images/properties-target-graphics-api-es32.png
  2. 在 Library 中,按 Alt 并右键单击 Materials and Textures,选择 Material Type,并将其命名为 Tessellation。

    ../../_images/create-material-type.png ../../_images/library-tessellation-material-type.png
  3. 在 Library > Materials and Textures > Material Types > Tessellation 材质类型中,双击 Vertex Shader 以在 Shader Source Editor 中打开它,并将其内容替换为

    #version 320 es
    
    in vec3 kzPosition;
    in vec2 kzTexCoordinate;
    
    out mediump vec2 vUVCoords;
    
    uniform highp mat4 kzWorldMatrix;
    void main()
    {
        precision mediump float;
        vUVCoords = kzTexCoordinate;
        gl_Position = kzWorldMatrix * vec4(kzPosition.xyz, 1.0);
    }
    

    单击 Save。

  4. 创建确定细分量的细分控制着色器:

    1. 在 Library > Materials and Textures > Material Types 中,按 Alt 并右键单击 Tessellation 材质类型并选择 Tessellation Control Shader。

      Kanzi Studio 在 Tessellation 材质类型中创建了一个 Tessellation Control Shader,位于 Vertex Shader 和 Fragment Shader 之间。

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

      Kanzi Studio 将 Tessellation 材质类型标记为无效,因为 Tessellation Control Shader 在没有 Tessellation Evaluation Shader 的情况下无法工作。

      ../../_images/library-create-tessellation-control-shader.png ../../_images/library-tessellation-control-shader.png
    2. 在 Library 中,双击 Tessellation Control Shader 以在 Shader Source Editor 中打开它,并将其内容替换为

      #version 320 es
      
      layout(vertices = 3) out;
      precision highp float;
      uniform float tessellationLevel;
      in mediump vec2 vUVCoords[];
      out Patch
      {
          mediump vec2 UV;
      } oPatch[];
      
      void main() {
          if (gl_InvocationID == 0)
          {
              gl_TessLevelOuter[0] = tessellationLevel;
              gl_TessLevelOuter[1] = tessellationLevel;
              gl_TessLevelOuter[2] = tessellationLevel;
              gl_TessLevelInner[0] = tessellationLevel;
          }
          oPatch[gl_InvocationID].UV = vUVCoords[gl_InvocationID];
          gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
      }
      

      单击 Save。

  5. 创建细分评估着色器,以计算每个生成顶点的值:

    1. 在 Library > Materials and Textures > Material Types 中,按 Alt 并右键单击 Tessellation 材质类型并选择 Tessellation Evaluation Shader。

      Kanzi Studio 在 Tessellation 材质类型中创建了一个 Tessellation Evaluation Shader,位于 Tessellation Control Shader 和 Fragment Shader 之间。

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

      ../../_images/library-create-tessellation-evaluation-shader.png ../../_images/library-tessellation-evaluation-shader.png
    2. 在 Library 中,双击 Tessellation Evaluation Shader 以在 Shader Source Editor 中打开它,并将其内容替换为

      #version 320 es
      
      layout(triangles, fractional_even_spacing, ccw) in;
      precision highp float;
      
      uniform sampler2D displacementMap;
      
      uniform highp mat4 kzCameraMatrix;
      uniform highp mat4 kzProjectionMatrix;
      
      in Patch
      {
          mediump vec2 UV;
      } oPatch[];
      
      out lowp vec4 fColor;
      
      highp vec2 interpolate2(in vec2 v0, in vec2 v1, in vec2 v2)
      {
          return v0 * gl_TessCoord.x + v1 * gl_TessCoord.y + v2 * gl_TessCoord.z;
      }
      highp vec4 interpolate4(in vec4 v0, in vec4 v1, in vec4 v2)
      {
          return v0 * gl_TessCoord.x + v1 * gl_TessCoord.y + v2 * gl_TessCoord.z;
      }
      
      void main()
      {
          vec2 uv = interpolate2(oPatch[0].UV, oPatch[1].UV, oPatch[2].UV);
          vec4 tex = texture(displacementMap, uv);
          vec4 displacement = vec4(0, 1, 0, 0) * dot(tex, vec4(1, 1, 1, 0));
          fColor = tex;
          gl_Position = kzProjectionMatrix * kzCameraMatrix * (interpolate4(
              gl_in[0].gl_Position,
              gl_in[1].gl_Position,
              gl_in[2].gl_Position) + displacement);
      }
      

      单击 Save。

  6. 在 Library 中的 Tessellation 材质类型中,双击 Fragment Shader 以在 Shader Source Editor 中打开它,并将其内容替换为

    #version 320 es
    
    precision mediump float;
    in lowp vec4 fColor;
    out vec4 outColor;
    
    void main()
    {
        outColor = fColor;
    }
    

    单击 Save。

  7. 在 Library > Materials and Textures > Material Types 中,选择 Tessellation 材质类型。在 Properties 中,点击 Sync with Uniforms。在 Delete Binding 对话框中,点击 Yes,从 Tessellation 材质类型中删除未使用的 uniform 绑定。

    ../../_images/library-tessellation-material-type-red.png ../../_images/properties-tessellation-sync-uniforms.png

    Kanzi Studio 会在 Library > Property Types 中创建 displacementMap 和 tessellationLevel 属性类型,并将它们添加到 Tessellation 材质类型中。

    这样,您就将这些属性公开给了使用 Tessellation 材质类型的材质。

    您使用:

    • displacementMap 设置用作置换贴图的纹理

    • tessellationLevel 控制细分量

    ../../_images/properties-tessellation-synced.png
  8. 在 Library > Property Types 中,选择 tessellationLevel 属性类型。在 Properties 中设置:

    • Lower Bound 到 0.1

    • Upper Bound 到 16

    • Default Value 到 0.1

    ../../_images/library-property-types-tessellation-level.png ../../_images/properties-tessellation-level.png
  9. 创建或选择要使用您创建的材质进行渲染的节点。

    例如:在 Node Tree 中,创建一个 Plane 节点。在 Properties 中,添加 Render Transformation 属性,并将 Rotation X 属性字段设置为 -75。

    ../../_images/node-tree-plane1.png ../../_images/properties-render-transformation-rotation-x.png
  10. 在 Properties 中,添加并设置:

    • Mesh Material 到 Tessellation Material

    • 将 Material Properties > displacementMap 设置为要用作置换贴图的纹理

    • 使用 Material Properties > tessellationLevel 调整细分量

    ../../_images/properties-plane-tessellation.png ../../_images/preview-tessellated-plane.png

另请参阅

着色器 (Shaders)

使用几何着色器

着色器最佳实践