1
0
Fork 0
Univerxel/resource/shaders/src/Voxel.geom

71 lines
1.8 KiB
GLSL

#version 450 core
#extension GL_ARB_separate_shader_objects : enable
layout (constant_id = 0) const bool FOG = true;
layout (constant_id = 1) const bool PBR = true;
layout (triangles) in;
layout (triangle_strip, max_vertices = 3) out;
layout (location = 0) in VertexData {
vec3 Position_modelspace;
flat uint Texture;
vec3 FaceNormal_modelspace;
vec3 FaceNormal_worldspace;
vec3 EyeDirection_cameraspace;
vec3 LightDirection_cameraspace;
float Depth;
} vs_in[];
layout (location = 0) out GeometryData {
vec3 Position_modelspace;
flat uint Textures[3];
vec3 TextureRatio;
vec3 FaceNormal_modelspace;
vec3 FaceNormal_worldspace;
vec3 EyeDirection_cameraspace;
vec3 LightDirection_cameraspace;
float Depth;
} gs;
void main() {
for(int j = 0; j < 3; j++) {
gs.Textures[j] = vs_in[j].Texture;
}
for(int i = 0; i < gl_in.length(); i++) {
gl_Position = gl_in[i].gl_Position;
gs.Position_modelspace = vs_in[i].Position_modelspace;
gs.FaceNormal_modelspace = vs_in[i].FaceNormal_modelspace;
switch(int(mod(i,3))) {
case 0:
gs.TextureRatio = vec3(1,0,0);
break;
case 1:
gs.TextureRatio = vec3(0,1,0);
break;
case 2:
gs.TextureRatio = vec3(0,0,1);
break;
default:
gs.TextureRatio = vec3(0);
break;
};
if(PBR) {
gs.FaceNormal_worldspace = vs_in[i].FaceNormal_worldspace;
gs.EyeDirection_cameraspace = vs_in[i].EyeDirection_cameraspace;
gs.LightDirection_cameraspace = vs_in[i].LightDirection_cameraspace;
}
if(FOG) {
gs.Depth = vs_in[i].Depth;
}
EmitVertex();
}
EndPrimitive();
}