使用细分着色器¶
细分将顶点数据的片段细分为更小的图元:
Tessellation Control Shader 决定了细分的数量。
Tessellation Evaluation Shader 计算每个生成顶点的值。
细分是一个可选的着色器阶段,位于 Vertex Shader 之后和可选的 Geometry Shader 之前。
要使用几何着色器和曲面细分着色器,运行 Kanzi 应用程序的硬件必须支持 OpenGL ES 3.2 或 Vulkan 1.1。请注意,几何着色器和曲面细分着色器可能会降低分块渲染架构上的性能。因此,建议避免在移动和嵌入式硬件上使用几何着色器和曲面细分着色器。
请参阅 使用几何着色器。
在此过程中,您使用细分着色器将纹理转换为位移贴图。着色器根据纹理中的颜色值提升平面上的点。
要使用细分着色器:
在 Kanzi Studio 主菜单中,选择 Project > Properties,并将 Target Graphics API 设置为 OpenGL ES 3.2。
在 Library 中,按 Alt 并右键单击 Materials and Textures,选择 Material Type,并将其命名为 Tessellation。
在 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。
创建确定细分量的细分控制着色器:
在 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 的情况下无法工作。
在 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。
创建细分评估着色器,以计算每个生成顶点的值:
在 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。
在 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。
在 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。
在 Library > Materials and Textures > Material Types 中,选择 Tessellation 材质类型。在 Properties 中,点击 Sync with Uniforms。在 Delete Binding 对话框中,点击 Yes,从 Tessellation 材质类型中删除未使用的 uniform 绑定。
Kanzi Studio 会在 Library > Property Types 中创建 displacementMap 和 tessellationLevel 属性类型,并将它们添加到 Tessellation 材质类型中。
这样,您就将这些属性公开给了使用 Tessellation 材质类型的材质。
您使用:
displacementMap 设置用作置换贴图的纹理
tessellationLevel 控制细分量
在 Library > Property Types 中,选择 tessellationLevel 属性类型。在 Properties 中设置:
Lower Bound 到 0.1
Upper Bound 到 16
Default Value 到 0.1
创建或选择要使用您创建的材质进行渲染的节点。
例如:在 Node Tree 中,创建一个 Plane 节点。在 Properties 中,添加 Render Transformation 属性,并将 Rotation X 属性字段设置为 -75。
在 Properties 中,添加并设置:
Mesh Material 到 Tessellation Material
将 Material Properties > displacementMap 设置为要用作置换贴图的纹理
使用 Material Properties > tessellationLevel 调整细分量