Skip to content
Snippets Groups Projects
Select Git revision
  • ea771018bedb5f3f8bd1f5d9c5b1b1d0ba4ec1ef
  • main default protected
2 results

implicit.mesh.glsl

Blame
  • implicit.mesh.glsl 2.68 KiB
    // Implicit Mesh shader
    
    #version 450
    #extension GL_EXT_mesh_shader:require
    
    #include "include.glsl"
    
    layout(local_size_x=1,local_size_y=1,local_size_z=1)in;
    layout(triangles,max_vertices=64,max_primitives=162)out;
    
    layout(location=0)out VertexOutput
    {
        vec4 position;
    }vertexOutput[];
    
    const vec4[8]positions={
        vec4(-.5,-.5,-.5,1.),
        vec4(-.5,-.5,.5,1.),
        vec4(-.5,.5,-.5,1.),
        vec4(-.5,.5,.5,1.),
        vec4(.5,-.5,-.5,1.),
        vec4(.5,-.5,.5,1.),
        vec4(.5,.5,-.5,1.),
        vec4(.5,.5,.5,1.),
    };
    
    void main()
    {
        uint iid=gl_LocalInvocationID.x;
        
        vec4 offset=vec4(0.,0.,gl_GlobalInvocationID.x,0.);
        
        vec3 signingvec=sign((inverse(pc.world)*vec4(camera_uniforms.campos,1)).xyz);
        
        SetMeshOutputsEXT(8,6);
        mat4 mvp=camera_uniforms.proj*camera_uniforms.view*pc.world;
        //mat4 sw=pc.world;
        gl_MeshVerticesEXT[0].gl_Position=mvp*(positions[0]);
        gl_MeshVerticesEXT[1].gl_Position=mvp*(positions[1]);
        gl_MeshVerticesEXT[2].gl_Position=mvp*(positions[2]);
        gl_MeshVerticesEXT[3].gl_Position=mvp*(positions[3]);
        gl_MeshVerticesEXT[4].gl_Position=mvp*(positions[4]);
        gl_MeshVerticesEXT[5].gl_Position=mvp*(positions[5]);
        gl_MeshVerticesEXT[6].gl_Position=mvp*(positions[6]);
        gl_MeshVerticesEXT[7].gl_Position=mvp*(positions[7]);
        vertexOutput[0].position=(positions[0]);
        vertexOutput[1].position=(positions[1]);
        vertexOutput[2].position=(positions[2]);
        vertexOutput[3].position=(positions[3]);
        vertexOutput[4].position=(positions[4]);
        vertexOutput[5].position=(positions[5]);
        vertexOutput[6].position=(positions[6]);
        vertexOutput[7].position=(positions[7]);
        
        if(signingvec.x>0){
            gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+0]=uvec3(4,5,6);
            gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+1]=uvec3(5,6,7);
        }else{
            gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+0]=uvec3(0,1,2);
            gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+1]=uvec3(1,2,3);
        }
        if(signingvec.y>0){
            gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+2]=uvec3(2,3,6);
            gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+3]=uvec3(7,3,6);
        }else{
            gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+2]=uvec3(0,1,4);
            gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+3]=uvec3(5,1,4);
        }
        if(signingvec.z>0){
            gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+4]=uvec3(1,3,5);
            gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+5]=uvec3(3,5,7);
        }else{
            gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+4]=uvec3(0,2,4);
            gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+5]=uvec3(2,4,6);
        }
    }