- 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
 koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                 
  
 