细分控制
- 作用:
- 对input patch进行修改,输出output patch到TES
- 为TPG提供细分参数
TCS函数会为每一个output patch中的每一个顶点执行一次,同一个patch中对应的函数共享同一个gl_ in和gl_out
#version 430 layout(vertices = 4) out; //output patch大小 /*---------------------内置输入变量--------------------- in int gl_PatchVerticesIn; //input patch中顶点数量 in int gl_PrimitiveID; //当前patch的索引 in int gl_InvocationID; //当前patch中对应函数的索引 in gl_PerVertex { vec4 gl_Position; float gl_PointSize; float gl_ClipDistance[]; } gl_in [gl_MaxPatchVertices]; -----------------------------------------------------*/ /*---------------------内置输出变量--------------------- patch out float gl_TessLevelOuter[4]; patch out float gl_TessLevelInner[2]; out gl_PerVertex { vec4 gl_Position; float gl_PointSize; float gl_ClipDistance[]; } gl_out[]; -----------------------------------------------------*/ //自定义输入 in vec2 uvInTCS[]; //自定义输出 patch out vec2 uvInTES[]; void main() { ... }
细分计算
- 作用:接收从TCS传来的为细分面片顶点和从TPG传来的归一化细分坐标,生成细分后的顶点
- TES函数为细分后的每一个顶点执行一次,同一个patch中对应的函数共享一个gl_in
TES只能输出线段或三角形
#version 430 layout(triangles,equal_spacing,ccw) /*---------------------内置输入变量--------------------- in vec3 gl_TessCoord; in int gl_PatchVerticesIn; //上一阶段output patch中的顶点数 in int gl_PrimitiveID; //对应patch的索引 in gl_PerVertex { vec4 gl_Position; float gl_PointSize; float gl_ClipDistance[]; } gl_in[gl_MaxPatchVertices]; -----------------------------------------------------*/ /*---------------------内置输出变量--------------------- out gl_PerVertex { vec4 gl_Position; float gl_PointSize; float gl_ClipDistance[]; }; -----------------------------------------------------*/ //自定义输入 patch in vec2 uvInTES[]; //自定义输出 out vec2 uvInGS; void main() { ... }