#version 460 layout (triangles) in; layout (triangle_strip, max_vertices = 3) out; layout(location = 0) in GeometryObj { vec3 GeoPos; // Реальная позиция в мире flat uint Texture; // Текстура vec2 UV; } Geometry[]; layout(location = 0) out FragmentObj { vec3 GeoPos; // Реальная позиция в мире vec3 Normal; flat uint Texture; // Текстура vec2 UV; } Fragment; void main() { vec3 normal = normalize(cross(Geometry[1].GeoPos-Geometry[0].GeoPos, Geometry[2].GeoPos-Geometry[0].GeoPos)); for(int iter = 0; iter < 3; iter++) { gl_Position = gl_in[iter].gl_Position; Fragment.GeoPos = Geometry[iter].GeoPos; Fragment.Texture = Geometry[iter].Texture; Fragment.UV = Geometry[iter].UV; Fragment.Normal = normal; EmitVertex(); } EndPrimitive(); }