mirror of
https://github.com/minetest/minetest.git
synced 2024-12-23 22:52:25 +01:00
Improved faces shading with and without shaders.
This commit is contained in:
parent
9f46cb6745
commit
a0f78659f3
@ -99,12 +99,6 @@ vec4 base = texture2D(baseTexture, uv).rgba;
|
|||||||
float alpha = gl_Color.a;
|
float alpha = gl_Color.a;
|
||||||
vec4 col = vec4(color.rgb, alpha);
|
vec4 col = vec4(color.rgb, alpha);
|
||||||
col *= gl_Color;
|
col *= gl_Color;
|
||||||
col = col * col; // SRGB -> Linear
|
|
||||||
col *= 1.8;
|
|
||||||
col.r = 1.0 - exp(1.0 - col.r) / e;
|
|
||||||
col.g = 1.0 - exp(1.0 - col.g) / e;
|
|
||||||
col.b = 1.0 - exp(1.0 - col.b) / e;
|
|
||||||
col = sqrt(col); // Linear -> SRGB
|
|
||||||
if(fogDistance != 0.0){
|
if(fogDistance != 0.0){
|
||||||
float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0));
|
float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0));
|
||||||
alpha = mix(alpha, 0.0, d);
|
alpha = mix(alpha, 0.0, d);
|
||||||
@ -113,12 +107,6 @@ vec4 base = texture2D(baseTexture, uv).rgba;
|
|||||||
#else
|
#else
|
||||||
vec4 col = vec4(color.rgb, base.a);
|
vec4 col = vec4(color.rgb, base.a);
|
||||||
col *= gl_Color;
|
col *= gl_Color;
|
||||||
col = col * col; // SRGB -> Linear
|
|
||||||
col *= 1.8;
|
|
||||||
col.r = 1.0 - exp(1.0 - col.r) / e;
|
|
||||||
col.g = 1.0 - exp(1.0 - col.g) / e;
|
|
||||||
col.b = 1.0 - exp(1.0 - col.b) / e;
|
|
||||||
col = sqrt(col); // Linear -> SRGB
|
|
||||||
if(fogDistance != 0.0){
|
if(fogDistance != 0.0){
|
||||||
float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0));
|
float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0));
|
||||||
col = mix(col, skyBgColor, d);
|
col = mix(col, skyBgColor, d);
|
||||||
|
@ -63,28 +63,35 @@ void main(void)
|
|||||||
|
|
||||||
vec3 normal, tangent, binormal;
|
vec3 normal, tangent, binormal;
|
||||||
normal = normalize(gl_NormalMatrix * gl_Normal);
|
normal = normalize(gl_NormalMatrix * gl_Normal);
|
||||||
|
float tileContrast = 1.0;
|
||||||
if (gl_Normal.x > 0.5) {
|
if (gl_Normal.x > 0.5) {
|
||||||
// 1.0, 0.0, 0.0
|
// 1.0, 0.0, 0.0
|
||||||
|
tileContrast = 0.8;
|
||||||
tangent = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, -1.0));
|
tangent = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, -1.0));
|
||||||
binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0));
|
binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0));
|
||||||
} else if (gl_Normal.x < -0.5) {
|
} else if (gl_Normal.x < -0.5) {
|
||||||
// -1.0, 0.0, 0.0
|
// -1.0, 0.0, 0.0
|
||||||
|
tileContrast = 0.8;
|
||||||
tangent = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, 1.0));
|
tangent = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, 1.0));
|
||||||
binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0));
|
binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0));
|
||||||
} else if (gl_Normal.y > 0.5) {
|
} else if (gl_Normal.y > 0.5) {
|
||||||
// 0.0, 1.0, 0.0
|
// 0.0, 1.0, 0.0
|
||||||
|
tileContrast = 1.2;
|
||||||
tangent = normalize(gl_NormalMatrix * vec3( 1.0, 0.0, 0.0));
|
tangent = normalize(gl_NormalMatrix * vec3( 1.0, 0.0, 0.0));
|
||||||
binormal = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, 1.0));
|
binormal = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, 1.0));
|
||||||
} else if (gl_Normal.y < -0.5) {
|
} else if (gl_Normal.y < -0.5) {
|
||||||
// 0.0, -1.0, 0.0
|
// 0.0, -1.0, 0.0
|
||||||
|
tileContrast = 0.3;
|
||||||
tangent = normalize(gl_NormalMatrix * vec3( 1.0, 0.0, 0.0));
|
tangent = normalize(gl_NormalMatrix * vec3( 1.0, 0.0, 0.0));
|
||||||
binormal = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, 1.0));
|
binormal = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, 1.0));
|
||||||
} else if (gl_Normal.z > 0.5) {
|
} else if (gl_Normal.z > 0.5) {
|
||||||
// 0.0, 0.0, 1.0
|
// 0.0, 0.0, 1.0
|
||||||
|
tileContrast = 0.5;
|
||||||
tangent = normalize(gl_NormalMatrix * vec3( 1.0, 0.0, 0.0));
|
tangent = normalize(gl_NormalMatrix * vec3( 1.0, 0.0, 0.0));
|
||||||
binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0));
|
binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0));
|
||||||
} else if (gl_Normal.z < -0.5) {
|
} else if (gl_Normal.z < -0.5) {
|
||||||
// 0.0, 0.0, -1.0
|
// 0.0, 0.0, -1.0
|
||||||
|
tileContrast = 0.5;
|
||||||
tangent = normalize(gl_NormalMatrix * vec3(-1.0, 0.0, 0.0));
|
tangent = normalize(gl_NormalMatrix * vec3(-1.0, 0.0, 0.0));
|
||||||
binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0));
|
binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0));
|
||||||
}
|
}
|
||||||
@ -108,7 +115,7 @@ void main(void)
|
|||||||
|
|
||||||
// Moonlight is blue
|
// Moonlight is blue
|
||||||
b += (day - night) / 13.0;
|
b += (day - night) / 13.0;
|
||||||
rg -= (day - night) / 23.0;
|
rg -= (day - night) / 13.0;
|
||||||
|
|
||||||
// Emphase blue a bit in darker places
|
// Emphase blue a bit in darker places
|
||||||
// See C++ implementation in mapblock_mesh.cpp finalColorBlend()
|
// See C++ implementation in mapblock_mesh.cpp finalColorBlend()
|
||||||
@ -118,18 +125,17 @@ void main(void)
|
|||||||
// See C++ implementation in mapblock_mesh.cpp finalColorBlend()
|
// See C++ implementation in mapblock_mesh.cpp finalColorBlend()
|
||||||
rg += max(0.0, (1.0 - abs(rg - 0.85)/0.15) * 0.065);
|
rg += max(0.0, (1.0 - abs(rg - 0.85)/0.15) * 0.065);
|
||||||
|
|
||||||
color.r = clamp(rg,0.0,1.0);
|
color.r = rg;
|
||||||
color.g = clamp(rg,0.0,1.0);
|
color.g = rg;
|
||||||
color.b = clamp(b,0.0,1.0);
|
color.b = b;
|
||||||
|
|
||||||
#if !(MATERIAL_TYPE == TILE_MATERIAL_LIQUID_TRANSPARENT || MATERIAL_TYPE == TILE_MATERIAL_LIQUID_OPAQUE)
|
#if !(MATERIAL_TYPE == TILE_MATERIAL_LIQUID_TRANSPARENT || MATERIAL_TYPE == TILE_MATERIAL_LIQUID_OPAQUE)
|
||||||
// Make sides and bottom darker than the top
|
// Make sides and bottom darker than the top
|
||||||
color = color * color; // SRGB -> Linear
|
color = color * color; // SRGB -> Linear
|
||||||
if(gl_Normal.y <= 0.5)
|
color *= tileContrast;
|
||||||
color *= 0.6;
|
|
||||||
color = sqrt(color); // Linear -> SRGB
|
color = sqrt(color); // Linear -> SRGB
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
color.a = gl_Color.a;
|
color.a = gl_Color.a;
|
||||||
gl_FrontColor = gl_BackColor = color;
|
gl_FrontColor = gl_BackColor = clamp(color,0.0,1.0);
|
||||||
}
|
}
|
||||||
|
@ -99,12 +99,6 @@ vec4 base = texture2D(baseTexture, uv).rgba;
|
|||||||
float alpha = gl_Color.a;
|
float alpha = gl_Color.a;
|
||||||
vec4 col = vec4(color.rgb, alpha);
|
vec4 col = vec4(color.rgb, alpha);
|
||||||
col *= gl_Color;
|
col *= gl_Color;
|
||||||
col = col * col; // SRGB -> Linear
|
|
||||||
col *= 1.8;
|
|
||||||
col.r = 1.0 - exp(1.0 - col.r) / e;
|
|
||||||
col.g = 1.0 - exp(1.0 - col.g) / e;
|
|
||||||
col.b = 1.0 - exp(1.0 - col.b) / e;
|
|
||||||
col = sqrt(col); // Linear -> SRGB
|
|
||||||
if(fogDistance != 0.0){
|
if(fogDistance != 0.0){
|
||||||
float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0));
|
float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0));
|
||||||
alpha = mix(alpha, 0.0, d);
|
alpha = mix(alpha, 0.0, d);
|
||||||
@ -113,12 +107,6 @@ vec4 base = texture2D(baseTexture, uv).rgba;
|
|||||||
#else
|
#else
|
||||||
vec4 col = vec4(color.rgb, base.a);
|
vec4 col = vec4(color.rgb, base.a);
|
||||||
col *= gl_Color;
|
col *= gl_Color;
|
||||||
col = col * col; // SRGB -> Linear
|
|
||||||
col *= 1.8;
|
|
||||||
col.r = 1.0 - exp(1.0 - col.r) / e;
|
|
||||||
col.g = 1.0 - exp(1.0 - col.g) / e;
|
|
||||||
col.b = 1.0 - exp(1.0 - col.b) / e;
|
|
||||||
col = sqrt(col); // Linear -> SRGB
|
|
||||||
if(fogDistance != 0.0){
|
if(fogDistance != 0.0){
|
||||||
float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0));
|
float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0));
|
||||||
col = mix(col, skyBgColor, d);
|
col = mix(col, skyBgColor, d);
|
||||||
|
@ -63,28 +63,35 @@ void main(void)
|
|||||||
|
|
||||||
vec3 normal, tangent, binormal;
|
vec3 normal, tangent, binormal;
|
||||||
normal = normalize(gl_NormalMatrix * gl_Normal);
|
normal = normalize(gl_NormalMatrix * gl_Normal);
|
||||||
|
float tileContrast = 1.0;
|
||||||
if (gl_Normal.x > 0.5) {
|
if (gl_Normal.x > 0.5) {
|
||||||
// 1.0, 0.0, 0.0
|
// 1.0, 0.0, 0.0
|
||||||
|
tileContrast = 0.8;
|
||||||
tangent = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, -1.0));
|
tangent = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, -1.0));
|
||||||
binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0));
|
binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0));
|
||||||
} else if (gl_Normal.x < -0.5) {
|
} else if (gl_Normal.x < -0.5) {
|
||||||
// -1.0, 0.0, 0.0
|
// -1.0, 0.0, 0.0
|
||||||
|
tileContrast = 0.8;
|
||||||
tangent = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, 1.0));
|
tangent = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, 1.0));
|
||||||
binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0));
|
binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0));
|
||||||
} else if (gl_Normal.y > 0.5) {
|
} else if (gl_Normal.y > 0.5) {
|
||||||
// 0.0, 1.0, 0.0
|
// 0.0, 1.0, 0.0
|
||||||
|
tileContrast = 1.2;
|
||||||
tangent = normalize(gl_NormalMatrix * vec3( 1.0, 0.0, 0.0));
|
tangent = normalize(gl_NormalMatrix * vec3( 1.0, 0.0, 0.0));
|
||||||
binormal = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, 1.0));
|
binormal = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, 1.0));
|
||||||
} else if (gl_Normal.y < -0.5) {
|
} else if (gl_Normal.y < -0.5) {
|
||||||
// 0.0, -1.0, 0.0
|
// 0.0, -1.0, 0.0
|
||||||
|
tileContrast = 0.3;
|
||||||
tangent = normalize(gl_NormalMatrix * vec3( 1.0, 0.0, 0.0));
|
tangent = normalize(gl_NormalMatrix * vec3( 1.0, 0.0, 0.0));
|
||||||
binormal = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, 1.0));
|
binormal = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, 1.0));
|
||||||
} else if (gl_Normal.z > 0.5) {
|
} else if (gl_Normal.z > 0.5) {
|
||||||
// 0.0, 0.0, 1.0
|
// 0.0, 0.0, 1.0
|
||||||
|
tileContrast = 0.5;
|
||||||
tangent = normalize(gl_NormalMatrix * vec3( 1.0, 0.0, 0.0));
|
tangent = normalize(gl_NormalMatrix * vec3( 1.0, 0.0, 0.0));
|
||||||
binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0));
|
binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0));
|
||||||
} else if (gl_Normal.z < -0.5) {
|
} else if (gl_Normal.z < -0.5) {
|
||||||
// 0.0, 0.0, -1.0
|
// 0.0, 0.0, -1.0
|
||||||
|
tileContrast = 0.5;
|
||||||
tangent = normalize(gl_NormalMatrix * vec3(-1.0, 0.0, 0.0));
|
tangent = normalize(gl_NormalMatrix * vec3(-1.0, 0.0, 0.0));
|
||||||
binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0));
|
binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0));
|
||||||
}
|
}
|
||||||
@ -108,7 +115,7 @@ void main(void)
|
|||||||
|
|
||||||
// Moonlight is blue
|
// Moonlight is blue
|
||||||
b += (day - night) / 13.0;
|
b += (day - night) / 13.0;
|
||||||
rg -= (day - night) / 23.0;
|
rg -= (day - night) / 13.0;
|
||||||
|
|
||||||
// Emphase blue a bit in darker places
|
// Emphase blue a bit in darker places
|
||||||
// See C++ implementation in mapblock_mesh.cpp finalColorBlend()
|
// See C++ implementation in mapblock_mesh.cpp finalColorBlend()
|
||||||
@ -118,18 +125,17 @@ void main(void)
|
|||||||
// See C++ implementation in mapblock_mesh.cpp finalColorBlend()
|
// See C++ implementation in mapblock_mesh.cpp finalColorBlend()
|
||||||
rg += max(0.0, (1.0 - abs(rg - 0.85)/0.15) * 0.065);
|
rg += max(0.0, (1.0 - abs(rg - 0.85)/0.15) * 0.065);
|
||||||
|
|
||||||
color.r = clamp(rg,0.0,1.0);
|
color.r = rg;
|
||||||
color.g = clamp(rg,0.0,1.0);
|
color.g = rg;
|
||||||
color.b = clamp(b,0.0,1.0);
|
color.b = b;
|
||||||
|
|
||||||
#if !(MATERIAL_TYPE == TILE_MATERIAL_LIQUID_TRANSPARENT || MATERIAL_TYPE == TILE_MATERIAL_LIQUID_OPAQUE)
|
#if !(MATERIAL_TYPE == TILE_MATERIAL_LIQUID_TRANSPARENT || MATERIAL_TYPE == TILE_MATERIAL_LIQUID_OPAQUE)
|
||||||
// Make sides and bottom darker than the top
|
// Make sides and bottom darker than the top
|
||||||
color = color * color; // SRGB -> Linear
|
color = color * color; // SRGB -> Linear
|
||||||
if(gl_Normal.y <= 0.5)
|
color *= tileContrast;
|
||||||
color *= 0.6;
|
|
||||||
color = sqrt(color); // Linear -> SRGB
|
color = sqrt(color); // Linear -> SRGB
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
color.a = gl_Color.a;
|
color.a = gl_Color.a;
|
||||||
gl_FrontColor = gl_BackColor = color;
|
gl_FrontColor = gl_BackColor = clamp(color,0.0,1.0);
|
||||||
}
|
}
|
||||||
|
@ -1397,13 +1397,32 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat
|
|||||||
u8 night = j->second.second;
|
u8 night = j->second.second;
|
||||||
finalColorBlend(vertices[vertexIndex].Color,
|
finalColorBlend(vertices[vertexIndex].Color,
|
||||||
day, night, daynight_ratio);
|
day, night, daynight_ratio);
|
||||||
// Brighten topside (no shaders)
|
// Make sides and bottom darker than the top
|
||||||
if(vertices[vertexIndex].Normal.Y > 0.5)
|
|
||||||
{
|
|
||||||
video::SColor &vc = vertices[vertexIndex].Color;
|
video::SColor &vc = vertices[vertexIndex].Color;
|
||||||
vc.setRed (srgb_linear_multiply(vc.getRed(), 1.3, 255.0));
|
if(vertices[vertexIndex].Normal.Y > 0.5) {
|
||||||
vc.setGreen(srgb_linear_multiply(vc.getGreen(), 1.3, 255.0));
|
vc.setRed (srgb_linear_multiply(vc.getRed(), 1.2, 255.0));
|
||||||
vc.setBlue (srgb_linear_multiply(vc.getBlue(), 1.3, 255.0));
|
vc.setGreen(srgb_linear_multiply(vc.getGreen(), 1.2, 255.0));
|
||||||
|
vc.setBlue (srgb_linear_multiply(vc.getBlue(), 1.2, 255.0));
|
||||||
|
} else if (vertices[vertexIndex].Normal.Y < -0.5) {
|
||||||
|
vc.setRed (srgb_linear_multiply(vc.getRed(), 0.3, 255.0));
|
||||||
|
vc.setGreen(srgb_linear_multiply(vc.getGreen(), 0.3, 255.0));
|
||||||
|
vc.setBlue (srgb_linear_multiply(vc.getBlue(), 0.3, 255.0));
|
||||||
|
} else if (vertices[vertexIndex].Normal.X > 0.5) {
|
||||||
|
vc.setRed (srgb_linear_multiply(vc.getRed(), 0.8, 255.0));
|
||||||
|
vc.setGreen(srgb_linear_multiply(vc.getGreen(), 0.8, 255.0));
|
||||||
|
vc.setBlue (srgb_linear_multiply(vc.getBlue(), 0.8, 255.0));
|
||||||
|
} else if (vertices[vertexIndex].Normal.X < -0.5) {
|
||||||
|
vc.setRed (srgb_linear_multiply(vc.getRed(), 0.8, 255.0));
|
||||||
|
vc.setGreen(srgb_linear_multiply(vc.getGreen(), 0.8, 255.0));
|
||||||
|
vc.setBlue (srgb_linear_multiply(vc.getBlue(), 0.8, 255.0));
|
||||||
|
} else if (vertices[vertexIndex].Normal.Z > 0.5) {
|
||||||
|
vc.setRed (srgb_linear_multiply(vc.getRed(), 0.5, 255.0));
|
||||||
|
vc.setGreen(srgb_linear_multiply(vc.getGreen(), 0.5, 255.0));
|
||||||
|
vc.setBlue (srgb_linear_multiply(vc.getBlue(), 0.5, 255.0));
|
||||||
|
} else if (vertices[vertexIndex].Normal.Z < -0.5) {
|
||||||
|
vc.setRed (srgb_linear_multiply(vc.getRed(), 0.5, 255.0));
|
||||||
|
vc.setGreen(srgb_linear_multiply(vc.getGreen(), 0.5, 255.0));
|
||||||
|
vc.setBlue (srgb_linear_multiply(vc.getBlue(), 0.5, 255.0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user