subdivision-edge.compute 770 Bytes
#version 430 core

layout  (local_size_x  =  1)  in;

struct Vertex {
    vec3 pos;
    vec3 norm;
    vec2 uv;
};

layout(std430, binding=0) readonly buffer Vertices {
    Vertex vertices[];
};

layout(std430, binding=1) readonly buffer EdgeIndices {
    unsigned int indices[][4];
};

layout(std430, binding=2) writeonly buffer Output {
    Vertex edges[];
};

void main(){
    edges[gl_GlobalInvocationID.x].norm = vec3(0.0, 0.0, 0.0);
    edges[gl_GlobalInvocationID.x].uv = vec2(0.0, 0.0);

    edges[gl_GlobalInvocationID.x].pos = 3.0/8.0 * (vertices[indices[gl_GlobalInvocationID.x][0]].pos + vertices[indices[gl_GlobalInvocationID.x][1]].pos) + 1.0/8.0 * (vertices[indices[gl_GlobalInvocationID.x][2]].pos + vertices[indices[gl_GlobalInvocationID.y][3]].pos);
}