Add lovrMain macro to shaders (no breaking change);

This commit is contained in:
bjorn 2019-11-18 23:20:08 -08:00
parent c031c0c578
commit 6ad2d8ccef
1 changed files with 43 additions and 38 deletions

View File

@ -20,6 +20,12 @@ const char* lovrShaderVertexPrefix = ""
"lovrPose[lovrBones[2]] * lovrBoneWeights[2] +"
"lovrPose[lovrBones[3]] * lovrBoneWeights[3]"
") \n"
"#ifdef FLAG_animated \n"
"#define lovrVertex (lovrPoseMatrix * vec4(lovrPosition, 1.)) \n"
"#else \n"
"#define lovrVertex vec4(lovrPosition, 1.) \n"
"#endif \n"
"#define lovrMain() position(mat4 __projection, mat4 __transform, vec4 __vertex) \n"
"in vec3 lovrPosition; \n"
"in vec3 lovrNormal; \n"
"in vec2 lovrTexCoord; \n"
@ -30,7 +36,7 @@ const char* lovrShaderVertexPrefix = ""
"in uint lovrDrawID; \n"
"out vec2 texCoord; \n"
"out vec4 vertexColor; \n"
"out vec4 lovrColor; \n"
"out vec4 lovrGraphicsColor; \n"
"layout(std140) uniform lovrModelBlock { mat4 lovrModels[MAX_DRAWS]; }; \n"
"layout(std140) uniform lovrColorBlock { vec4 lovrColors[MAX_DRAWS]; }; \n"
"layout(std140) uniform lovrFrameBlock { mat4 lovrViews[2]; mat4 lovrProjections[2]; }; \n"
@ -52,24 +58,23 @@ const char* lovrShaderVertexSuffix = ""
"void main() { \n"
" texCoord = (lovrMaterialTransform * vec3(lovrTexCoord, 1.)).xy; \n"
" vertexColor = lovrVertexColor; \n"
" lovrColor = lovrColors[lovrDrawID]; \n"
" lovrGraphicsColor = lovrColors[lovrDrawID]; \n"
"#if defined INSTANCED_STEREO \n"
" gl_ViewportIndex = gl_InstanceID % lovrViewportCount; \n"
"#endif \n"
" gl_PointSize = lovrPointSize; \n"
" vec4 vertexPosition = vec4(lovrPosition, 1.); \n"
"#ifdef FLAG_animated \n"
" vertexPosition = lovrPoseMatrix * vertexPosition; \n"
"#endif \n"
" gl_Position = position(lovrProjection, lovrTransform, vertexPosition); \n"
" gl_Position = position(lovrProjection, lovrTransform, lovrVertex); \n"
"}";
const char* lovrShaderFragmentPrefix = ""
"#define PIXEL PIXEL \n"
"#define FRAGMENT FRAGMENT \n"
"#define lovrMain() color(vec4 __graphicsColor, sampler2D __image, vec2 __uv) \n"
"#define lovrTexCoord texCoord \n"
"#define lovrVertexColor vertexColor \n"
"in vec2 texCoord; \n"
"in vec4 vertexColor; \n"
"in vec4 lovrColor; \n"
"in vec4 lovrGraphicsColor; \n"
"out vec4 lovrCanvas[gl_MaxDrawBuffers]; \n"
"uniform float lovrMetalness; \n"
"uniform float lovrRoughness; \n"
@ -94,9 +99,9 @@ const char* lovrShaderFragmentPrefix = ""
const char* lovrShaderFragmentSuffix = ""
"void main() { \n"
"#if defined(MULTICANVAS) || defined(FLAG_multicanvas) \n"
" colors(lovrColor, lovrDiffuseTexture, texCoord); \n"
" colors(lovrGraphicsColor, lovrDiffuseTexture, texCoord); \n"
"#else \n"
" lovrCanvas[0] = color(lovrColor, lovrDiffuseTexture, texCoord); \n"
" lovrCanvas[0] = color(lovrGraphicsColor, lovrDiffuseTexture, texCoord); \n"
"#ifdef FLAG_alphaCutoff \n"
" if (lovrCanvas[0].a < FLAG_alphaCutoff) { \n"
" discard; \n"
@ -118,13 +123,13 @@ const char* lovrShaderComputeSuffix = ""
"}";
const char* lovrUnlitVertexShader = ""
"vec4 position(mat4 projection, mat4 transform, vec4 vertex) { \n"
" return projection * transform * vertex; \n"
"vec4 lovrMain() { \n"
" return lovrProjection * lovrTransform * lovrVertex; \n"
"}";
const char* lovrUnlitFragmentShader = ""
"vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) { \n"
" return graphicsColor * lovrDiffuseColor * vertexColor * texture(image, uv); \n"
"vec4 lovrMain() { \n"
" return lovrGraphicsColor * lovrVertexColor * lovrDiffuseColor * texture(lovrDiffuseTexture, lovrTexCoord); \n"
"}";
const char* lovrStandardVertexShader = ""
@ -136,8 +141,8 @@ const char* lovrStandardVertexShader = ""
"out vec3 vNormal; \n"
"#endif \n"
"vec4 position(mat4 projection, mat4 transform, vec4 vertex) { \n"
" vVertexPositionWorld = vec3(lovrModel * vertex); \n"
"vec4 lovrMain() { \n"
" vVertexPositionWorld = vec3(lovrModel * lovrVertex); \n"
" vCameraPositionWorld = -lovrView[3].xyz * mat3(lovrView); \n"
"#ifdef FLAG_normalMap \n"
" vec3 normal = normalize(lovrNormalMatrix * lovrNormal); \n"
@ -147,7 +152,7 @@ const char* lovrStandardVertexShader = ""
"#else \n"
" vNormal = normalize(lovrNormalMatrix * lovrNormal); \n"
"#endif \n"
" return projection * transform * vertex; \n"
" return lovrProjection * lovrTransform * lovrVertex; \n"
"}";
const char* lovrStandardFragmentShader = ""
@ -179,15 +184,15 @@ const char* lovrStandardFragmentShader = ""
"vec2 prefilteredBRDF(float NoV, float roughness); \n"
"vec3 tonemap_ACES(vec3 color); \n"
"vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) { \n"
"vec4 lovrMain() { \n"
" vec3 result = vec3(0.); \n"
// Parameters
" vec3 baseColor = texture(lovrDiffuseTexture, uv).rgb * lovrDiffuseColor.rgb; \n"
" float metalness = texture(lovrMetalnessTexture, uv).b * lovrMetalness; \n"
" float roughness = max(texture(lovrRoughnessTexture, uv).g * lovrRoughness, .05); \n"
" vec3 baseColor = texture(lovrDiffuseTexture, lovrTexCoord).rgb * lovrDiffuseColor.rgb; \n"
" float metalness = texture(lovrMetalnessTexture, lovrTexCoord).b * lovrMetalness; \n"
" float roughness = max(texture(lovrRoughnessTexture, lovrTexCoord).g * lovrRoughness, .05); \n"
"#ifdef FLAG_normalMap \n"
" vec3 N = normalize(vTangentMatrix * (texture(lovrNormalTexture, uv).rgb * 2. - 1.)); \n"
" vec3 N = normalize(vTangentMatrix * (texture(lovrNormalTexture, lovrTexCoord).rgb * 2. - 1.)); \n"
"#else \n"
" vec3 N = normalize(vNormal); \n"
"#endif \n"
@ -216,14 +221,14 @@ const char* lovrStandardFragmentShader = ""
" vec3 specularIndirect = (F0 * lookup.r + lookup.g) * textureLod(lovrEnvironmentMap, R, roughness * mipmapCount).rgb; \n"
" vec3 diffuseIndirect = diffuseDirect * E_SphericalHarmonics(lovrSphericalHarmonics, N); \n"
"#ifdef FLAG_occlusion \n" // Occlusion only affects indirect diffuse light
" diffuseIndirect *= texture(lovrOcclusionTexture, uv).r; \n"
" diffuseIndirect *= texture(lovrOcclusionTexture, lovrTexCoord).r; \n"
"#endif \n"
" result += diffuseIndirect + specularIndirect; \n"
"#endif \n"
// Emissive
"#ifdef FLAG_emissive \n" // Currently emissive texture and color have to be used together
" result += texture(lovrEmissiveTexture, uv).rgb * lovrEmissiveColor.rgb; \n"
" result += texture(lovrEmissiveTexture, lovrTexCoord).rgb * lovrEmissiveColor.rgb; \n"
"#endif \n"
// Tonemap
@ -231,7 +236,7 @@ const char* lovrStandardFragmentShader = ""
" result = tonemap_ACES(result * lovrExposure); \n"
"#endif \n"
" return graphicsColor * vec4(result, 1.); \n"
" return lovrGraphicsColor * vec4(result, 1.); \n"
"}"
// Helpers
@ -289,45 +294,45 @@ const char* lovrStandardFragmentShader = ""
const char* lovrCubeVertexShader = ""
"out vec3 texturePosition[2]; \n"
"vec4 position(mat4 projection, mat4 transform, vec4 vertex) { \n"
" texturePosition[lovrViewID] = inverse(mat3(transform)) * (inverse(projection) * vertex).xyz; \n"
" return vertex; \n"
"vec4 lovrMain() { \n"
" texturePosition[lovrViewID] = inverse(mat3(lovrTransform)) * (inverse(lovrProjection) * lovrVertex).xyz; \n"
" return lovrVertex; \n"
"}";
const char* lovrCubeFragmentShader = ""
"in vec3 texturePosition[2]; \n"
"uniform samplerCube lovrSkyboxTexture; \n"
"vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) { \n"
" return graphicsColor * texture(lovrSkyboxTexture, texturePosition[lovrViewID] * vec3(-1, 1, 1)); \n"
"vec4 lovrMain() { \n"
" return lovrGraphicsColor * texture(lovrSkyboxTexture, texturePosition[lovrViewID] * vec3(-1, 1, 1)); \n"
"}";
const char* lovrPanoFragmentShader = ""
"in vec3 texturePosition[2]; \n"
"#define PI 3.141592653589 \n"
"vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) { \n"
"vec4 lovrMain() { \n"
" vec3 direction = texturePosition[lovrViewID]; \n"
" float theta = acos(-direction.y / length(direction)); \n"
" float phi = atan(direction.x, -direction.z); \n"
" uv = vec2(.5 + phi / (2. * PI), theta / PI); \n"
" return graphicsColor * texture(lovrDiffuseTexture, uv); \n"
" vec2 uv = vec2(.5 + phi / (2. * PI), theta / PI); \n"
" return lovrGraphicsColor * texture(lovrDiffuseTexture, uv); \n"
"}";
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"
"vec4 lovrMain() { \n"
" vec3 col = texture(lovrDiffuseTexture, lovrTexCoord).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"
" if (alpha <= 0.0) discard; \n"
" return vec4(graphicsColor.rgb, graphicsColor.a * alpha); \n"
" return vec4(lovrGraphicsColor.rgb, lovrGraphicsColor.a * alpha); \n"
"}";
const char* lovrFillVertexShader = ""
"vec4 position(mat4 projection, mat4 transform, vec4 vertex) { \n"
" return vertex; \n"
"vec4 lovrMain() { \n"
" return lovrVertex; \n"
"}";
const char* lovrShaderScalarUniforms[] = {