lovr/etc/shaders/lovr.glsl

175 lines
4.5 KiB
Plaintext
Raw Normal View History

2022-07-31 19:49:18 +00:00
// Flags
layout(constant_id = 1000) const bool applyUVTransform = true;
layout(constant_id = 1001) const bool applyAlphaCutoff = false;
layout(constant_id = 1002) const bool applyGlow = false;
2022-06-16 03:46:43 +00:00
// Resources
#ifndef GL_COMPUTE_SHADER
struct Camera {
mat4 view;
mat4 projection;
mat4 viewProjection;
mat4 inverseProjection;
};
struct Draw {
mat4 transform;
mat4 normalMatrix;
vec4 color;
};
layout(set = 0, binding = 0) uniform CameraBuffer { Camera Cameras[6]; };
layout(set = 0, binding = 1) uniform DrawBuffer { Draw Draws[256]; };
2022-06-16 03:46:43 +00:00
layout(set = 0, binding = 2) uniform sampler Sampler;
2022-06-17 06:49:09 +00:00
2022-07-31 19:49:18 +00:00
struct MaterialData {
vec4 color;
vec4 glow;
vec2 uvShift;
vec2 uvScale;
vec2 sdfRange;
float metalness;
float roughness;
float clearcoat;
float clearcoatRoughness;
float occlusionStrength;
float glowStrength;
float normalScale;
float alphaCutoff;
float pointSize;
};
layout(set = 1, binding = 0) uniform MaterialBuffer {
2022-07-31 19:49:18 +00:00
MaterialData Material;
2022-06-17 06:49:09 +00:00
};
layout(set = 1, binding = 1) uniform texture2D ColorTexture;
2022-06-17 06:49:09 +00:00
layout(set = 1, binding = 2) uniform texture2D GlowTexture;
layout(set = 1, binding = 3) uniform texture2D OcclusionTexture;
layout(set = 1, binding = 4) uniform texture2D MetalnessTexture;
layout(set = 1, binding = 5) uniform texture2D RoughnessTexture;
layout(set = 1, binding = 6) uniform texture2D ClearcoatTexture;
layout(set = 1, binding = 7) uniform texture2D NormalTexture;
2022-06-16 03:46:43 +00:00
#endif
// Attributes
#ifdef GL_VERTEX_SHADER
layout(location = 10) in vec4 VertexPosition;
layout(location = 11) in vec3 VertexNormal;
layout(location = 12) in vec2 VertexUV;
layout(location = 13) in vec4 VertexColor;
layout(location = 14) in vec3 VertexTangent;
#endif
// Framebuffer
#ifdef GL_FRAGMENT_SHADER
layout(location = 0) out vec4 PixelColors[1];
#endif
// Varyings
#ifdef GL_VERTEX_SHADER
layout(location = 10) out vec3 Normal;
layout(location = 11) out vec4 Color;
layout(location = 12) out vec2 UV;
2022-07-10 06:39:20 +00:00
#endif
#ifdef GL_FRAGMENT_SHADER
layout(location = 10) in vec3 Normal;
layout(location = 11) in vec4 Color;
layout(location = 12) in vec2 UV;
2022-06-16 03:46:43 +00:00
#endif
// Macros
#ifdef GL_COMPUTE_SHADER
//
#else
#define BaseInstance gl_BaseInstance
#define BaseVertex gl_BaseVertex
#define ClipDistance gl_ClipDistance
#define CullDistance gl_CullDistance
#define DrawIndex gl_DrawIndex
#define InstanceIndex (gl_InstanceIndex - gl_BaseInstance)
#define FragCoord gl_FragCoord
#define FragDepth gl_FragDepth
#define FrontFacing gl_FrontFacing
#define PointCoord gl_PointCoord
#define PointSize gl_PointSize
#define Position gl_Position
#define PrimitiveId gl_PrimitiveID
#define SampleId gl_SampleID
#define SampleMaskIn gl_SampleMaskIn
#define SampleMask gl_SampleMask
#define SamplePosition gl_SamplePosition
#define VertexIndex gl_VertexIndex
#define ViewIndex gl_ViewIndex
#define DrawId gl_BaseInstance
#define Projection Cameras[ViewIndex].projection
#define View Cameras[ViewIndex].view
#define ViewProjection Cameras[ViewIndex].viewProjection
#define InverseProjection Cameras[ViewIndex].inverseProjection
#define Transform Draws[DrawId].transform
#define NormalMatrix mat3(Draws[DrawId].normalMatrix)
#define PassColor Draws[DrawId].color
2022-06-16 03:46:43 +00:00
#define ClipFromLocal (ViewProjection * Transform)
#define ClipFromWorld (ViewProjection)
#define ClipFromView (Projection)
#define ViewFromLocal (View * Transform)
#define ViewFromWorld (View)
#define WorldFromLocal (Transform)
#define DefaultPosition (ClipFromLocal * VertexPosition)
2022-07-31 19:49:18 +00:00
#define DefaultColor (Color * getPixel(ColorTexture, UV))
#endif
2022-07-31 19:49:18 +00:00
// Helpers
#ifdef GL_FRAGMENT_SHADER
vec4 getPixel(texture2D t, vec2 uv) { return texture(sampler2D(t, Sampler), uv); }
vec4 getPixel(texture3D t, vec3 uvw) { return texture(sampler3D(t, Sampler), uvw); }
vec4 getPixel(textureCube t, vec3 dir) { return texture(samplerCube(t, Sampler), dir); }
vec4 getPixel(texture2DArray t, vec3 uvw) { return texture(sampler2DArray(t, Sampler), uvw); }
2022-06-16 03:46:43 +00:00
#endif
2022-07-31 18:18:15 +00:00
// Entrypoints
#ifndef NO_DEFAULT_MAIN
#ifdef GL_VERTEX_SHADER
vec4 lovrmain();
void main() {
Normal = NormalMatrix * VertexNormal;
2022-07-31 19:49:18 +00:00
Color = VertexColor * Material.color * PassColor;
2022-07-31 18:18:15 +00:00
UV = VertexUV;
2022-07-31 19:49:18 +00:00
PointSize = Material.pointSize;
2022-07-31 18:18:15 +00:00
Position = lovrmain();
2022-07-31 19:49:18 +00:00
if (applyUVTransform) {
UV *= Material.uvScale;
UV += Material.uvShift;
}
2022-07-31 18:18:15 +00:00
}
#endif
#ifdef GL_FRAGMENT_SHADER
vec4 lovrmain();
void main() {
PixelColors[0] = lovrmain();
2022-07-31 19:49:18 +00:00
if (applyGlow) {
PixelColors[0].rgb += getPixel(GlowTexture, UV).rgb * Material.glow.rgb;
}
if (applyAlphaCutoff && PixelColors[0].a <= Material.alphaCutoff) {
discard;
}
2022-07-31 18:18:15 +00:00
}
#endif
#ifdef GL_COMPUTE_SHADER
vec4 lovrmain();
void main() {
lovrmain();
}
#endif
#endif