- Home /
Vertex ordering problem with GLSL Tessellation when using quads in Tessellation Evaluation Shader stage.
I am trying to implement a quad tessellation shader using GLSL. However, vertex ordering gets messed up when I use quad domains instead of triangle domains. Below are pictures using same shader with triangle-based and quad-based domain stages. The quad domains look really weird. I have been using this as reference:(https://github.com/przemyslawzaworski/Unity3D-CG-programming/blob/master/GLSL/tessellation.shader) Please help me out here!!
Shader "Custom/Tessellation"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_factor("Tessellation scale",Range(1.0,64.0)) = 1.0
}
SubShader
{
Cull Off
Pass
{
GLSLPROGRAM
#version 460
uniform float _factor;
#ifdef VERTEX
in vec4 in_POSITION0;
void main()
{
gl_Position = gl_ModelViewProjectionMatrix * in_POSITION0;
}
#endif
#ifdef HULL //GLSL Tessellation Control Shader
layout (vertices = 4) out;
void main()
{
if (gl_InvocationID == 0)
{
gl_TessLevelInner[0] = _factor; //Inside tessellation factor
gl_TessLevelInner[1] = _factor; //Inside tessellation factor
gl_TessLevelOuter[0] = _factor; //Edge tessellation factor
gl_TessLevelOuter[1] = _factor; //Edge tessellation factor
gl_TessLevelOuter[2] = _factor; //Edge tessellation factor
gl_TessLevelOuter[3] = _factor; //Edge tessellation factor
}
gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
}
#endif
#ifdef DOMAIN //GLSL Tessellation Evaluation Shader
layout (quads) in;
void main()
{
vec4 p1 = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);
vec4 p2 = mix(gl_in[2].gl_Position, gl_in[3].gl_Position, gl_TessCoord.x);
gl_Position = mix(p1, p2, gl_TessCoord.y);
}
#endif
#ifdef GEOMETRY //geometry shader for rendering wireframe
layout(triangles) in;
layout(line_strip, max_vertices = 3) out;
void main()
{
for(int i = 0; i < gl_in.length(); ++i)
{
gl_Position = gl_in[i].gl_Position;
EmitVertex();
}
gl_Position = gl_in[0].gl_Position;
EmitVertex();
EndPrimitive();
}
#endif
#ifdef FRAGMENT
out vec4 color;
void main()
{
color = vec4(1,1,1,1);
}
#endif
ENDGLSL
}
}
}
Your answer
Follow this Question
Related Questions
I would like to know how to make a tessellation shader with LightWeightRenderPipline(Unity2018.2.13) 0 Answers
Rendering only outside the fog 1 Answer
How does Material's "SetShaderPassEnabled" work? 1 Answer
X-Ray shader / Cutting a hole through a mesh 1 Answer
Shader isn't displaying properly in editor view, but when built it displays properly. 0 Answers