2017-12-10 20:31:50 +00:00
|
|
|
#include "resources/shaders.h"
|
2017-10-21 20:14:35 +00:00
|
|
|
|
2018-09-01 02:52:03 +00:00
|
|
|
const char* lovrShaderVertexPrefix = ""
|
2018-07-06 08:38:15 +00:00
|
|
|
"#define VERTEX VERTEX \n"
|
2017-11-25 20:29:40 +00:00
|
|
|
"#define MAX_BONES 48 \n"
|
2019-03-29 07:49:41 +00:00
|
|
|
"#define MAX_DRAWS 256 \n"
|
2019-06-25 08:06:55 +00:00
|
|
|
"#define lovrView lovrViews[lovrViewID] \n"
|
|
|
|
"#define lovrProjection lovrProjections[lovrViewID] \n"
|
2019-03-29 07:49:41 +00:00
|
|
|
"#define lovrModel lovrModels[lovrDrawID] \n"
|
2018-12-08 02:19:03 +00:00
|
|
|
"#define lovrTransform (lovrView * lovrModel) \n"
|
|
|
|
"#define lovrNormalMatrix mat3(transpose(inverse(lovrTransform))) \n"
|
2018-09-01 09:52:02 +00:00
|
|
|
"#define lovrInstanceID (gl_InstanceID / lovrViewportCount) \n"
|
|
|
|
"#define lovrPoseMatrix ("
|
|
|
|
"lovrPose[lovrBones[0]] * lovrBoneWeights[0] +"
|
|
|
|
"lovrPose[lovrBones[1]] * lovrBoneWeights[1] +"
|
|
|
|
"lovrPose[lovrBones[2]] * lovrBoneWeights[2] +"
|
|
|
|
"lovrPose[lovrBones[3]] * lovrBoneWeights[3]"
|
|
|
|
") \n"
|
2017-10-21 20:14:35 +00:00
|
|
|
"in vec3 lovrPosition; \n"
|
|
|
|
"in vec3 lovrNormal; \n"
|
|
|
|
"in vec2 lovrTexCoord; \n"
|
2017-10-23 08:33:49 +00:00
|
|
|
"in vec4 lovrVertexColor; \n"
|
2019-06-21 00:46:22 +00:00
|
|
|
"in vec4 lovrTangent; \n"
|
2019-02-14 17:45:29 +00:00
|
|
|
"in uvec4 lovrBones; \n"
|
2017-11-07 04:25:08 +00:00
|
|
|
"in vec4 lovrBoneWeights; \n"
|
2019-02-08 18:32:05 +00:00
|
|
|
"in uint lovrDrawID; \n"
|
2017-10-21 20:14:35 +00:00
|
|
|
"out vec2 texCoord; \n"
|
2017-10-23 08:33:49 +00:00
|
|
|
"out vec4 vertexColor; \n"
|
2018-12-11 05:30:55 +00:00
|
|
|
"out vec4 lovrColor; \n"
|
2019-03-29 07:49:41 +00:00
|
|
|
"layout(std140) uniform lovrModelBlock { mat4 lovrModels[MAX_DRAWS]; }; \n"
|
|
|
|
"layout(std140) uniform lovrColorBlock { vec4 lovrColors[MAX_DRAWS]; }; \n"
|
2019-06-28 05:17:50 +00:00
|
|
|
"layout(std140) uniform lovrFrameBlock { mat4 lovrViews[2]; mat4 lovrProjections[2]; }; \n"
|
2018-07-18 08:17:16 +00:00
|
|
|
"uniform mat3 lovrMaterialTransform; \n"
|
2017-10-22 23:14:53 +00:00
|
|
|
"uniform float lovrPointSize; \n"
|
2017-11-21 02:12:08 +00:00
|
|
|
"uniform mat4 lovrPose[MAX_BONES]; \n"
|
2019-07-29 00:28:07 +00:00
|
|
|
"uniform lowp int lovrViewportCount; \n"
|
2019-06-25 08:06:55 +00:00
|
|
|
"#if defined MULTIVIEW \n"
|
|
|
|
"layout(num_views = 2) in; \n"
|
|
|
|
"#define lovrViewID gl_ViewID_OVR \n"
|
|
|
|
"#elif defined INSTANCED_STEREO \n"
|
|
|
|
"#define lovrViewID gl_ViewportIndex \n"
|
2018-08-31 23:45:05 +00:00
|
|
|
"#else \n"
|
2019-07-29 00:28:07 +00:00
|
|
|
"uniform lowp int lovrViewID; \n"
|
2019-05-28 10:43:54 +00:00
|
|
|
"#endif \n"
|
2017-10-22 22:39:21 +00:00
|
|
|
"#line 0 \n";
|
2017-10-21 20:14:35 +00:00
|
|
|
|
2018-08-09 01:09:07 +00:00
|
|
|
const char* lovrShaderVertexSuffix = ""
|
|
|
|
"void main() { \n"
|
|
|
|
" texCoord = (lovrMaterialTransform * vec3(lovrTexCoord, 1.)).xy; \n"
|
|
|
|
" vertexColor = lovrVertexColor; \n"
|
2019-03-29 07:49:41 +00:00
|
|
|
" lovrColor = lovrColors[lovrDrawID]; \n"
|
2019-06-25 08:06:55 +00:00
|
|
|
"#if defined INSTANCED_STEREO \n"
|
2018-09-01 09:52:02 +00:00
|
|
|
" gl_ViewportIndex = gl_InstanceID % lovrViewportCount; \n"
|
2018-08-09 01:09:07 +00:00
|
|
|
"#endif \n"
|
2018-09-01 09:52:02 +00:00
|
|
|
" gl_PointSize = lovrPointSize; \n"
|
2019-05-28 10:43:54 +00:00
|
|
|
" vec4 vertexPosition = vec4(lovrPosition, 1.); \n"
|
2019-08-04 22:08:21 +00:00
|
|
|
"#ifdef FLAG_animated \n"
|
2019-06-25 08:06:55 +00:00
|
|
|
" vertexPosition = lovrPoseMatrix * vertexPosition; \n"
|
|
|
|
"#endif \n"
|
2019-05-28 10:43:54 +00:00
|
|
|
" gl_Position = position(lovrProjection, lovrTransform, vertexPosition); \n"
|
2018-08-09 01:09:07 +00:00
|
|
|
"}";
|
|
|
|
|
2018-09-01 02:52:03 +00:00
|
|
|
const char* lovrShaderFragmentPrefix = ""
|
2018-07-06 08:38:15 +00:00
|
|
|
"#define PIXEL PIXEL \n"
|
|
|
|
"#define FRAGMENT FRAGMENT \n"
|
2017-10-21 20:14:35 +00:00
|
|
|
"in vec2 texCoord; \n"
|
2017-10-23 08:33:49 +00:00
|
|
|
"in vec4 vertexColor; \n"
|
2018-12-11 05:30:55 +00:00
|
|
|
"in vec4 lovrColor; \n"
|
2018-02-15 08:37:02 +00:00
|
|
|
"out vec4 lovrCanvas[gl_MaxDrawBuffers]; \n"
|
2018-02-12 03:16:40 +00:00
|
|
|
"uniform float lovrMetalness; \n"
|
|
|
|
"uniform float lovrRoughness; \n"
|
2017-10-21 21:32:41 +00:00
|
|
|
"uniform vec4 lovrDiffuseColor; \n"
|
2018-02-12 03:16:40 +00:00
|
|
|
"uniform vec4 lovrEmissiveColor; \n"
|
2017-10-21 21:59:34 +00:00
|
|
|
"uniform sampler2D lovrDiffuseTexture; \n"
|
2018-02-12 03:16:40 +00:00
|
|
|
"uniform sampler2D lovrEmissiveTexture; \n"
|
|
|
|
"uniform sampler2D lovrMetalnessTexture; \n"
|
|
|
|
"uniform sampler2D lovrRoughnessTexture; \n"
|
|
|
|
"uniform sampler2D lovrOcclusionTexture; \n"
|
|
|
|
"uniform sampler2D lovrNormalTexture; \n"
|
2019-07-29 00:28:07 +00:00
|
|
|
"uniform lowp int lovrViewportCount; \n"
|
2019-06-25 08:06:55 +00:00
|
|
|
"#if defined MULTIVIEW \n"
|
|
|
|
"#define lovrViewID gl_ViewID_OVR \n"
|
|
|
|
"#elif defined INSTANCED_STEREO \n"
|
|
|
|
"#define lovrViewID gl_ViewportIndex \n"
|
2018-08-31 23:45:05 +00:00
|
|
|
"#else \n"
|
2019-07-29 00:28:07 +00:00
|
|
|
"uniform lowp int lovrViewID; \n"
|
2018-08-31 23:45:05 +00:00
|
|
|
"#endif \n"
|
2017-10-22 22:39:21 +00:00
|
|
|
"#line 0 \n";
|
2017-10-21 20:14:35 +00:00
|
|
|
|
|
|
|
const char* lovrShaderFragmentSuffix = ""
|
|
|
|
"void main() { \n"
|
2019-07-29 01:08:23 +00:00
|
|
|
"#if defined(MULTICANVAS) || defined(FLAG_multicanvas) \n"
|
2018-02-15 08:37:02 +00:00
|
|
|
" colors(lovrColor, lovrDiffuseTexture, texCoord); \n"
|
|
|
|
"#else \n"
|
|
|
|
" lovrCanvas[0] = color(lovrColor, lovrDiffuseTexture, texCoord); \n"
|
2019-08-01 20:26:45 +00:00
|
|
|
#ifdef LOVR_WEBGL
|
|
|
|
" lovrCanvas[0].rgb = pow(lovrCanvas[0].rgb, vec3(.4545)); \n"
|
|
|
|
#endif
|
2018-02-15 08:37:02 +00:00
|
|
|
"#endif \n"
|
2017-10-21 20:14:35 +00:00
|
|
|
"}";
|
|
|
|
|
2018-08-09 01:05:29 +00:00
|
|
|
const char* lovrShaderComputePrefix = ""
|
2018-08-11 05:21:35 +00:00
|
|
|
"#version 430 \n"
|
2018-08-09 01:09:54 +00:00
|
|
|
"#line 0 \n";
|
2018-08-09 01:05:29 +00:00
|
|
|
|
2018-08-07 23:58:14 +00:00
|
|
|
const char* lovrShaderComputeSuffix = ""
|
|
|
|
"void main() { \n"
|
|
|
|
" compute(); \n"
|
|
|
|
"}";
|
|
|
|
|
2019-06-20 21:09:55 +00:00
|
|
|
const char* lovrUnlitVertexShader = ""
|
2017-10-21 20:14:35 +00:00
|
|
|
"vec4 position(mat4 projection, mat4 transform, vec4 vertex) { \n"
|
|
|
|
" return projection * transform * vertex; \n"
|
|
|
|
"}";
|
|
|
|
|
2019-06-20 21:09:55 +00:00
|
|
|
const char* lovrUnlitFragmentShader = ""
|
2017-10-21 20:14:35 +00:00
|
|
|
"vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) { \n"
|
2017-10-23 08:33:49 +00:00
|
|
|
" return graphicsColor * lovrDiffuseColor * vertexColor * texture(image, uv); \n"
|
2017-10-21 20:14:35 +00:00
|
|
|
"}";
|
|
|
|
|
2019-06-20 21:21:35 +00:00
|
|
|
const char* lovrStandardVertexShader = ""
|
2019-08-08 00:53:38 +00:00
|
|
|
"out vec3 vWorldPosition; \n"
|
|
|
|
"out vec3 vCameraPosition; \n"
|
2019-08-06 21:39:14 +00:00
|
|
|
"#ifdef FLAG_normalTexture \n"
|
2019-06-21 00:46:22 +00:00
|
|
|
"out mat3 vTangentMatrix; \n"
|
2019-08-06 21:39:14 +00:00
|
|
|
"#else \n"
|
|
|
|
"out vec3 vNormal; \n"
|
|
|
|
"#endif \n"
|
|
|
|
|
2019-06-20 21:21:35 +00:00
|
|
|
"vec4 position(mat4 projection, mat4 transform, vec4 vertex) { \n"
|
2019-08-08 00:53:38 +00:00
|
|
|
" vWorldPosition = vec3(lovrModel * vertex); \n"
|
|
|
|
" vCameraPosition = -lovrView[3].xyz * mat3(lovrView); \n"
|
2019-08-06 21:39:14 +00:00
|
|
|
"#ifdef FLAG_normalTexture \n"
|
2019-06-21 00:46:22 +00:00
|
|
|
" vec3 normal = normalize(mat3(lovrModel) * lovrNormal); // TODO non-uniform scale \n"
|
|
|
|
" vec3 tangent = normalize(mat3(lovrModel) * lovrTangent.xyz); \n"
|
|
|
|
" vec3 bitangent = cross(normal, tangent) * lovrTangent.w; \n"
|
|
|
|
" vTangentMatrix = mat3(tangent, bitangent, normal); \n"
|
2019-08-06 21:39:14 +00:00
|
|
|
"#else \n"
|
|
|
|
" vNormal = normalize(mat3(lovrModel) * lovrNormal); \n"
|
|
|
|
"#endif \n"
|
2019-06-21 00:46:22 +00:00
|
|
|
" return projection * transform * vertex; \n"
|
2019-06-20 21:21:35 +00:00
|
|
|
"}";
|
|
|
|
|
|
|
|
const char* lovrStandardFragmentShader = ""
|
2019-06-21 00:46:22 +00:00
|
|
|
"#define PI 3.14159265358979 \n"
|
2019-08-08 00:53:38 +00:00
|
|
|
"in vec3 vWorldPosition; \n"
|
|
|
|
"in vec3 vCameraPosition; \n"
|
2019-08-06 21:39:14 +00:00
|
|
|
"#ifdef FLAG_normalTexture \n"
|
2019-06-21 00:46:22 +00:00
|
|
|
"in mat3 vTangentMatrix; \n"
|
2019-08-06 21:39:14 +00:00
|
|
|
"#else \n"
|
|
|
|
"in vec3 vNormal; \n"
|
|
|
|
"#endif \n"
|
|
|
|
|
|
|
|
"uniform vec3 lovrLightDirection = vec3(-1., -1., -1.); \n"
|
2019-08-09 07:27:17 +00:00
|
|
|
"uniform vec4 lovrLightColor = vec4(1.); \n"
|
2019-08-05 21:48:55 +00:00
|
|
|
"uniform samplerCube lovrSpecularIrradianceTexture; \n"
|
2019-08-06 21:39:14 +00:00
|
|
|
"uniform sampler2D lovrBRDFLookup; \n"
|
2019-06-21 04:17:32 +00:00
|
|
|
"uniform vec3 lovrIrradiance[9]; \n"
|
2019-08-05 22:34:21 +00:00
|
|
|
"uniform float lovrExposure = 1.; \n"
|
2019-08-06 21:39:14 +00:00
|
|
|
|
2019-06-21 00:46:22 +00:00
|
|
|
"float D_GGX(float NoH, float roughness) { \n"
|
|
|
|
" float alpha = roughness * roughness; \n"
|
|
|
|
" float alpha2 = alpha * alpha; \n"
|
|
|
|
" float denom = (NoH * NoH) * (alpha2 - 1.) + 1.; \n"
|
|
|
|
" return alpha2 / (PI * denom * denom); \n"
|
|
|
|
"} \n"
|
2019-08-06 21:39:14 +00:00
|
|
|
|
2019-06-21 00:46:22 +00:00
|
|
|
"float G_SmithGGXCorrelated(float NoV, float NoL, float roughness) { \n"
|
|
|
|
" float alpha = roughness * roughness; \n"
|
|
|
|
" float alpha2 = alpha * alpha; \n"
|
|
|
|
" float GGXV = NoL * sqrt(alpha2 + (1. - alpha2) * (NoV * NoV)); \n"
|
|
|
|
" float GGXL = NoV * sqrt(alpha2 + (1. - alpha2) * (NoL * NoL)); \n"
|
|
|
|
" return .5 / max(GGXV + GGXL, 1e-5); \n"
|
|
|
|
"} \n"
|
2019-08-06 21:39:14 +00:00
|
|
|
|
2019-06-21 04:17:32 +00:00
|
|
|
"vec3 F_Schlick(vec3 F0, float VoH) { \n"
|
|
|
|
" return F0 + (vec3(1.) - F0) * pow(1. - VoH, 5.); \n"
|
|
|
|
"} \n"
|
2019-08-06 21:39:14 +00:00
|
|
|
|
2019-06-21 04:17:32 +00:00
|
|
|
"vec3 E_SphericalHarmonics(vec3 sh[9], vec3 n) { \n"
|
2019-08-05 21:48:55 +00:00
|
|
|
" n = -n; // WHY \n"
|
2019-06-21 04:17:32 +00:00
|
|
|
" return max("
|
|
|
|
"sh[0] + "
|
|
|
|
"sh[1] * n.y + "
|
|
|
|
"sh[2] * n.z + "
|
|
|
|
"sh[3] * n.x + "
|
|
|
|
"sh[4] * n.y * n.x + "
|
|
|
|
"sh[5] * n.y * n.z + "
|
|
|
|
"sh[6] * (3. * n.z * n.z - 1.) + "
|
|
|
|
"sh[7] * n.z * n.x + "
|
|
|
|
"sh[8] * (n.x * n.x - n.y * n.y)"
|
|
|
|
", 0.); \n"
|
2019-06-21 00:46:22 +00:00
|
|
|
"} \n"
|
2019-08-06 21:39:14 +00:00
|
|
|
|
2019-08-05 22:34:21 +00:00
|
|
|
"vec3 tonemap_ACES(vec3 color) { \n"
|
|
|
|
" float a = 2.51; \n"
|
|
|
|
" float b = 0.03; \n"
|
|
|
|
" float c = 2.43; \n"
|
|
|
|
" float d = 0.59; \n"
|
|
|
|
" float e = 0.14; \n"
|
|
|
|
" return (color * (a * color + b)) / (color * (c * color + d) + e); \n"
|
|
|
|
"} \n"
|
2019-08-06 21:39:14 +00:00
|
|
|
|
2019-06-20 21:21:35 +00:00
|
|
|
"vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) { \n"
|
2019-08-06 21:39:14 +00:00
|
|
|
" vec3 color = vec3(0.); \n"
|
|
|
|
|
|
|
|
// Base color
|
|
|
|
" vec3 baseColor = lovrDiffuseColor.rgb; \n"
|
|
|
|
" baseColor *= texture(lovrDiffuseTexture, uv).rgb; \n"
|
|
|
|
|
|
|
|
// Metalness
|
|
|
|
" float metalness = lovrMetalness; \n"
|
|
|
|
" metalness *= texture(lovrMetalnessTexture, uv).b; \n"
|
|
|
|
|
|
|
|
// Roughness
|
|
|
|
" float roughness = lovrRoughness; \n"
|
|
|
|
" roughness *= texture(lovrRoughnessTexture, uv).g; \n"
|
|
|
|
" roughness = max(roughness, .05); \n"
|
|
|
|
|
|
|
|
// Parameters
|
|
|
|
"#ifdef FLAG_normalTexture \n"
|
|
|
|
" vec3 N = normalize(vTangentMatrix * (texture(lovrNormalTexture, uv).rgb * 2. - 1.)); \n"
|
|
|
|
"#else \n"
|
|
|
|
" vec3 N = normalize(vNormal); \n"
|
|
|
|
"#endif \n"
|
2019-08-08 00:53:38 +00:00
|
|
|
" vec3 V = normalize(vCameraPosition - vWorldPosition); \n"
|
2019-06-21 04:17:32 +00:00
|
|
|
" vec3 L = normalize(-lovrLightDirection); \n"
|
2019-06-21 00:46:22 +00:00
|
|
|
" vec3 H = normalize(V + L); \n"
|
2019-08-05 21:48:55 +00:00
|
|
|
" vec3 R = normalize(reflect(-V, N)); \n"
|
2019-06-21 00:46:22 +00:00
|
|
|
" float NoV = abs(dot(N, V)) + 1e-5; \n"
|
|
|
|
" float NoL = clamp(dot(N, L), 0., 1.); \n"
|
|
|
|
" float NoH = clamp(dot(N, H), 0., 1.); \n"
|
2019-06-21 04:36:07 +00:00
|
|
|
" float VoH = clamp(dot(V, H), 0., 1.); \n"
|
2019-08-06 21:39:14 +00:00
|
|
|
|
|
|
|
// Specular BRDF
|
|
|
|
" vec3 F0 = mix(vec3(.04), baseColor, metalness); \n"
|
2019-06-21 00:46:22 +00:00
|
|
|
" float D = D_GGX(NoH, roughness); \n"
|
|
|
|
" float G = G_SmithGGXCorrelated(NoV, NoL, roughness); \n"
|
2019-06-21 04:17:32 +00:00
|
|
|
" vec3 F = F_Schlick(F0, VoH); \n"
|
2019-08-06 21:39:14 +00:00
|
|
|
|
|
|
|
// Direct lighting
|
2019-08-05 21:48:55 +00:00
|
|
|
" vec3 specularDirect = vec3(D * G * F); \n"
|
|
|
|
" vec3 diffuseDirect = (vec3(1.) - F) * (1. - metalness) * baseColor; \n"
|
2019-08-09 07:27:17 +00:00
|
|
|
" color += (diffuseDirect / PI + specularDirect) * NoL * lovrLightColor.rgb * lovrLightColor.a; \n"
|
2019-08-06 21:39:14 +00:00
|
|
|
|
|
|
|
// Indirect lighting
|
|
|
|
"#ifdef FLAG_indirectLighting \n"
|
2019-08-05 21:48:55 +00:00
|
|
|
" vec2 lookup = texture(lovrBRDFLookup, vec2(NoV, roughness)).rg; \n"
|
2019-08-07 22:56:52 +00:00
|
|
|
" float mipmaps = log2(textureSize(lovrSpecularIrradianceTexture, 0).x); \n"
|
|
|
|
" vec3 specularIndirect = (F0 * lookup.r + lookup.g) * textureLod(lovrSpecularIrradianceTexture, R, roughness * mipmaps).rgb; \n"
|
2019-08-05 21:48:55 +00:00
|
|
|
" vec3 diffuseIndirect = diffuseDirect * E_SphericalHarmonics(lovrIrradiance, N); \n"
|
2019-08-06 21:39:14 +00:00
|
|
|
"#ifdef FLAG_occlusion \n" // Occlusion only affects indirect diffuse light
|
|
|
|
" diffuseIndirect *= texture(lovrOcclusionTexture, uv).r; \n"
|
|
|
|
"#endif \n"
|
|
|
|
" color += diffuseIndirect + specularIndirect; \n"
|
|
|
|
"#endif \n"
|
|
|
|
|
|
|
|
// Emissive
|
|
|
|
"#ifdef FLAG_emissive \n" // Currently emissive texture and color have to be used together
|
|
|
|
" color += texture(lovrEmissiveTexture, uv).rgb * lovrEmissiveColor.rgb; \n"
|
|
|
|
"#endif \n"
|
|
|
|
|
|
|
|
// Tonemapping
|
|
|
|
"#ifdef FLAG_tonemap \n"
|
2019-08-05 22:34:21 +00:00
|
|
|
" color = tonemap_ACES(color * lovrExposure); \n"
|
2019-08-06 21:39:14 +00:00
|
|
|
"#endif \n"
|
|
|
|
|
2019-08-05 22:34:21 +00:00
|
|
|
" return vec4(color, 1.); \n"
|
2019-06-20 21:21:35 +00:00
|
|
|
"}";
|
|
|
|
|
2018-03-11 07:18:07 +00:00
|
|
|
const char* lovrCubeVertexShader = ""
|
2018-08-23 19:51:53 +00:00
|
|
|
"out vec3 texturePosition[2]; \n"
|
2017-10-21 20:14:35 +00:00
|
|
|
"vec4 position(mat4 projection, mat4 transform, vec4 vertex) { \n"
|
2019-06-25 08:06:55 +00:00
|
|
|
" texturePosition[lovrViewID] = inverse(mat3(transform)) * (inverse(projection) * vertex).xyz; \n"
|
2018-03-05 08:10:10 +00:00
|
|
|
" return vertex; \n"
|
2017-10-21 20:14:35 +00:00
|
|
|
"}";
|
|
|
|
|
2018-03-11 07:18:07 +00:00
|
|
|
const char* lovrCubeFragmentShader = ""
|
2018-08-23 19:51:53 +00:00
|
|
|
"in vec3 texturePosition[2]; \n"
|
2019-08-05 22:20:17 +00:00
|
|
|
"uniform samplerCube lovrSkyboxTexture; \n"
|
2017-10-21 20:14:35 +00:00
|
|
|
"vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) { \n"
|
2019-08-05 22:20:17 +00:00
|
|
|
" return graphicsColor * texture(lovrSkyboxTexture, texturePosition[lovrViewID] * vec3(-1, 1, 1)); \n"
|
2017-10-21 20:14:35 +00:00
|
|
|
"}";
|
|
|
|
|
2018-03-05 10:02:25 +00:00
|
|
|
const char* lovrPanoFragmentShader = ""
|
2018-08-23 19:51:53 +00:00
|
|
|
"in vec3 texturePosition[2]; \n"
|
2018-03-05 10:02:25 +00:00
|
|
|
"#define PI 3.141592653589 \n"
|
|
|
|
"vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) { \n"
|
2019-06-25 08:06:55 +00:00
|
|
|
" vec3 direction = texturePosition[lovrViewID]; \n"
|
2018-09-04 03:59:12 +00:00
|
|
|
" float theta = acos(-direction.y / length(direction)); \n"
|
|
|
|
" float phi = atan(direction.x, -direction.z); \n"
|
2018-06-10 06:17:46 +00:00
|
|
|
" uv = vec2(.5 + phi / (2. * PI), theta / PI); \n"
|
2018-03-05 10:02:25 +00:00
|
|
|
" return graphicsColor * texture(lovrDiffuseTexture, uv); \n"
|
|
|
|
"}";
|
|
|
|
|
2017-10-21 20:14:35 +00:00
|
|
|
const char* lovrFontFragmentShader = ""
|
|
|
|
"float median(float r, float g, float b) { \n"
|
|
|
|
" return max(min(r, g), min(max(r, g), b)); \n"
|
|
|
|
"} \n"
|
|
|
|
"vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) { \n"
|
|
|
|
" vec3 col = texture(image, uv).rgb; \n"
|
|
|
|
" float sdf = median(col.r, col.g, col.b); \n"
|
|
|
|
" float w = fwidth(sdf); \n"
|
|
|
|
" float alpha = smoothstep(.5 - w, .5 + w, sdf); \n"
|
2018-10-25 23:15:41 +00:00
|
|
|
" if (alpha <= 0.0) discard; \n"
|
2017-10-21 20:14:35 +00:00
|
|
|
" return vec4(graphicsColor.rgb, graphicsColor.a * alpha); \n"
|
|
|
|
"}";
|
|
|
|
|
2018-03-19 19:12:34 +00:00
|
|
|
const char* lovrFillVertexShader = ""
|
2017-10-21 20:14:35 +00:00
|
|
|
"vec4 position(mat4 projection, mat4 transform, vec4 vertex) { \n"
|
|
|
|
" return vertex; \n"
|
|
|
|
"}";
|
2018-09-01 08:57:38 +00:00
|
|
|
|
|
|
|
const char* lovrShaderScalarUniforms[] = {
|
|
|
|
"lovrMetalness",
|
|
|
|
"lovrRoughness"
|
|
|
|
};
|
|
|
|
|
|
|
|
const char* lovrShaderColorUniforms[] = {
|
|
|
|
"lovrDiffuseColor",
|
|
|
|
"lovrEmissiveColor"
|
|
|
|
};
|
|
|
|
|
|
|
|
const char* lovrShaderTextureUniforms[] = {
|
|
|
|
"lovrDiffuseTexture",
|
|
|
|
"lovrEmissiveTexture",
|
|
|
|
"lovrMetalnessTexture",
|
|
|
|
"lovrRoughnessTexture",
|
|
|
|
"lovrOcclusionTexture",
|
2019-08-05 22:20:17 +00:00
|
|
|
"lovrNormalTexture"
|
2018-09-01 08:57:38 +00:00
|
|
|
};
|
2018-09-26 00:10:09 +00:00
|
|
|
|
|
|
|
const char* lovrShaderAttributeNames[] = {
|
|
|
|
"lovrPosition",
|
|
|
|
"lovrNormal",
|
|
|
|
"lovrTexCoord",
|
|
|
|
"lovrVertexColor",
|
|
|
|
"lovrTangent",
|
|
|
|
"lovrBones",
|
|
|
|
"lovrBoneWeights"
|
|
|
|
};
|