const char* DEFAULT_VERTEX_SHADER = R"VS( #version 330 core layout (location = 0) in vec3 vertexPosition_modelspace; layout (location = 1) in vec3 normal; layout (location = 2) in vec3 texCoord; out vec3 fragVertex; out vec3 fragNormal; out vec2 fragUV; uniform mat4 world_transform; uniform mat4 model; uniform mat4 view; uniform mat4 projection; void main() { fragNormal = vec4(world_transform * vec4(normal, 1)).xyz; fragVertex = vertexPosition_modelspace; fragUV = texCoord.st; gl_Position = projection * view * world_transform * model * vec4(vertexPosition_modelspace, 1); } )VS"; // TODO: there's a bug here with the array size of 'lights' // with intel opengl, size can be >1000 // but with nvidea opengl size of >200 gives the following error: // error C6020: Constant register limit exceeded at sampler; // more than 1024 registers needed to compile program const char* DEFAULT_FRAGMENT_SHADER = R"FS( #version 330 core in vec3 fragVertex; in vec3 fragNormal; in vec2 fragUV; out vec4 color; uniform mat4 model; uniform mat3 normal_matrix; uniform sampler2D sampler; uniform uint num_lights = 0u; struct point_light { uint light_ID; vec3 position; vec3 color; float intensity; }; uniform point_light lights[200]; void main() { vec3 normal = normalize(normal_matrix * fragNormal); vec3 fragPosition = vec3(model * vec4(fragVertex, 1)); float totalBrightness = 0; for (uint i = 0u; i < num_lights; i++) { vec3 surfaceToLight = lights[i].position - fragPosition; //float brightness = dot(normal, surfaceToLight) / (length(surfaceToLight) * length(normal)); float brightness = dot(normal, surfaceToLight) / length(surfaceToLight); totalBrightness += brightness; } color = clamp(totalBrightness, 0, 1) * texture(sampler, fragUV.st); } )FS"; const char* SIMPLE_VERTEX_SHADER = R"SVS( #version 330 core layout (location = 0) in vec3 position; layout (location = 1) in vec3 color; out vec3 frag_color; uniform mat4 world_transform; uniform mat4 MVP; void main() { frag_color = color; gl_Position = MVP * world_transform * vec4(position, 1); } )SVS"; const char* SIMPLE_FRAGMENT_SHADER = R"SFS( #version 330 core in vec3 frag_color; out vec4 color; void main() { color = vec4(frag_color.rgb, 1); } )SFS";