diff --git a/src/DifBuilder.hx b/src/DifBuilder.hx index e353358d..574a96e0 100644 --- a/src/DifBuilder.hx +++ b/src/DifBuilder.hx @@ -187,6 +187,8 @@ class DifBuilder { normalTex.mipMap = Nearest; var shader = new PhongMaterial(diffuseTex, normalTex, shininess, specularColor, MarbleGame.instance.world.ambient, MarbleGame.instance.world.dirLight, MarbleGame.instance.world.dirLightDir, uvScaleFactor); + if (uvScaleFactor == 0.5) + shader.isHalfTile = true; onFinish(shader); }); worker.loadFile('interiors_mbu/${baseTexture}'); diff --git a/src/MarbleWorld.hx b/src/MarbleWorld.hx index ef45a7db..0172c8f2 100644 --- a/src/MarbleWorld.hx +++ b/src/MarbleWorld.hx @@ -1,5 +1,6 @@ package src; +import shaders.Gamma; import collision.Collision; import shapes.MegaMarble; import shapes.Blast; @@ -271,6 +272,9 @@ class MarbleWorld extends Scheduler { var worker = new ResourceLoaderWorker(() -> { var renderer = cast(this.scene.renderer, h3d.scene.fwd.Renderer); + var gammaRes = ResourceLoader.getResource('data/shaders/gammaRamp.png', ResourceLoader.getTexture, this.textureResources); + gammaRes.wrap = Repeat; + // renderer.addShader(new Gamma(gammaRes, 1 / gammaRes.width)); for (element in mission.root.elements) { if (element._type != MissionElementType.Sun) @@ -280,6 +284,9 @@ class MarbleWorld extends Scheduler { var directionalColor = MisParser.parseVector4(sunElement.color); var ambientColor = MisParser.parseVector4(sunElement.ambient); + ambientColor.r *= 1.18; + ambientColor.g *= 1.06; + ambientColor.b *= 0.95; var sunDirection = MisParser.parseVector3(sunElement.direction); sunDirection.x = -sunDirection.x; // sunDirection.z = -sunDirection.z; diff --git a/src/shaders/Gamma.hx b/src/shaders/Gamma.hx new file mode 100644 index 00000000..6fb96894 --- /dev/null +++ b/src/shaders/Gamma.hx @@ -0,0 +1,25 @@ +package shaders; + +class Gamma extends h3d.shader.ScreenShader { + static var SRC = { + @param var texture:Sampler2D; + @param var gammaMap:Sampler2D; + @param var gammaRampInvSize:Float; + function fragment() { + var c = texture.get(input.uv); + c = c * (1 - gammaRampInvSize) + 0.5 * gammaRampInvSize; + c.x = gammaMap.get(vec2(c.x, 0)).x; + c.y = gammaMap.get(vec2(c.y, 0)).x; + c.z = gammaMap.get(vec2(c.z, 0)).x; + c.a = 1; + + output.color = c; + } + } + + public function new(gammaMap, gammaRampInvSize) { + super(); + this.gammaMap = gammaMap; + this.gammaRampInvSize = gammaRampInvSize; + } +} diff --git a/src/shaders/PhongMaterial.hx b/src/shaders/PhongMaterial.hx index f3cb970b..76718f50 100644 --- a/src/shaders/PhongMaterial.hx +++ b/src/shaders/PhongMaterial.hx @@ -10,6 +10,7 @@ class PhongMaterial extends hxsl.Shader { @param var dirLight:Vec3; @param var dirLightDir:Vec3; @param var uvScaleFactor:Float; + @const var isHalfTile:Bool = false; @global var camera:{ var position:Vec3; @var var dir:Vec3; @@ -35,8 +36,8 @@ class PhongMaterial extends hxsl.Shader { transformedTangent = vec4(input.tangent * global.modelView.mat3(), input.tangent.dot(input.tangent) > 0.5 ? 1. : -1.); } function lambert(normal:Vec3, lightPosition:Vec3):Float { - var result = dot(normal, lightPosition); - return saturate(result); + var result = isHalfTile ? dot(normal, lightPosition) : ((dot(normal, lightPosition) + 1) * 0.5); + return result; } function vertex() { calculatedUV = input.uv * uvScaleFactor;