|
这就是heaven用的hullshader代码,看看有多粗浅:
HULL_CONSTANT_OUT constant(InputPatch<HULL_IO,3> patch) {
HULL_CONSTANT_OUT OUT;
float length_0 = length(patch[1].position.xyz - patch[2].position.xyz);
float length_1 = length(patch[2].position.xyz - patch[0].position.xyz);
float length_2 = length(patch[0].position.xyz - patch[1].position.xyz);
float factor_0 = (patch[1].texcoord_7.w + patch[2].texcoord_7.w) * saturate(length_0 * s_material_tessellation_distance.z);
float factor_1 = (patch[2].texcoord_7.w + patch[0].texcoord_7.w) * saturate(length_1 * s_material_tessellation_distance.z);
float factor_2 = (patch[0].texcoord_7.w + patch[1].texcoord_7.w) * saturate(length_2 * s_material_tessellation_distance.z);
OUT.edges[0] = factor_0;
OUT.edges[1] = factor_1;
OUT.edges[2] = factor_2;
OUT.inside = (factor_0 + factor_1 + factor_2) * (1.0f / 3.0f);
return OUT;
}
domain shader代码:
DOMAIN_OUT main(DOMAIN_CONSTANT_IN IN,const OutputPatch<DOMAIN_IN,3> patch) {
DOMAIN_OUT OUT;
float4 vertex = patch[0].position * IN.coords.x + patch[1].position * IN.coords.y + patch[2].position * IN.coords.z;
float4 normal = patch[0].texcoord_7 * IN.coords.x + patch[1].texcoord_7 * IN.coords.y + patch[2].texcoord_7 * IN.coords.z;
float2 texcoord = patch[0].texcoord_0.xy * IN.coords.x + patch[1].texcoord_0.xy * IN.coords.y + patch[2].texcoord_0.xy * IN.coords.z;
float offset = pow(saturate(1.0f - (length(vertex.xyz - s_camera_position) - s_material_tessellation_distance.x) * s_material_tessellation_distance.y),s_material_tessellation_factor.y);
offset *= (s_texture_7.SampleLevel(s_sampler_7,texcoord,0.0f).x - 127.0f / 255.0f) * s_material_tessellation_factor.x;
vertex.xyz += normalize(normal.xyz) * offset;
OUT.position = getPosition(vertex);
return OUT;
} |
|